MySQL——数据查询(简单查询)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL——数据查询(简单查询)

前言

       查询数据是指从数据库中获取所需要的数据。如Jack 要达到验证用户名和密码的目的,就需要从数据库已保存的用户表中读取当前用户的密码进行验证,以验明正身!保存查询数据是数据库操作中常用且重要的操作。用户可以根据自己对数据的需求,使用不同的查询方式,获得不同的数据。


一、简单查询


在MySQL中可以通过SQL语句来实现基本数据查询,SQL语句可以通过如下多种使用:查询所有字段数据、查询指定字段数据、避免重复数据查询、对结果进行排序和分组等查询。


       数据库中可能包含数量庞大的表,表中可能包含无数的记录,如果没有两把刷子要获得所需的数据并非易事。在MySQL中,可以使用SELECT语句来查询数据,根据查询条件的不同,数据库系统会找到不同的数据,通过SELECT语句可以很方便地获取所需的信息。


       在MySQL中,SELECT语句的基本语法形式如下:


       SELECT field1 field2 … fieldn


          FROM tablename


          [WHERE CONDITION1]


          [GROUP BY fieldm [HAVING CONDITION2]]


          [ORDER BY fieldn [ASC|DESC]];


       其中,filed1~fieldn参数表示需要查询的字段名;tablename参数表示表的名称;CONDITION1参数表示查询条件;fieldm参数表示按该字段中的数据进行分组;CONDITION2参数表示满足该表达式的数据才能输出;fieldn参数指按该字段中数据进行排序。排序方式由ASC和DESC两个参数指出;ASC参数表示按升序的顺序进行排序,是默认参数;DESC参数表示按降序的顺序进行排序。

1.列出表的所有字段1.列出表的所有字段

       通过SQL语句SELECT列出表的所有字段,具体语法形式如下:


           SELECT field1,field2,…,fieldn FROM tablename;


       其中,filed1~fieldn参数表示需要查询的字段名;tablename参数表示表的名称。

2."*" 符号表示所有字段


   查询所有字段数据,除了使用上面的方式外,还可以通过符号“*”来实现,具体语法形式如下:


            SELECT * FROM tablename;    


       其中,符号“*”表示所有字段名;tablename参数表示表的名称。与上一种方式相比,“*”符号方式的优势比较明显,即可用该符号代替表中的所有字段,但是这种方式不够灵活,只能按照表中字段的固定顺序显示,不能随便改变字段的顺序。


3.查询指定字段数据


   查询指定字段数据,只需修改关键字SELECT后的字段列表为指定字段即可。


           SELECT field1,field2,…,fieldn FROM tablename;  


       例如,从班级表中查询班主任字段,SQL语句如下所示。


           SELECT teacher FROM class;  


       如果关键字SELECT后面的字段不包含在所查询的表中,那么MySQL会报错。


mysql>  create database school;   #创建数据库school


mysql>  use school;   #选择数据库school


mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长


mysql>  insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny'),(4,'四班', 'Janny');  # 插入多条记录


mysql> select teacher from class ;  #查询class表中的teacher 域


4.DISTINCT 查询


当在MySQL中执行简单数据查询时,有时会显示出重复数据。为了实现查询不重复数据,MySQL提供了DISTINCT功能,SQL语法如下:


         SELECT DISTINCT field1,field2,…,fieldn FROM tablename;  


       在上述语句中,关键字DISTINCT去除重复的数据。下面将通过一个具体的示例来说明如何实现查询不重复数据。


       执行SQL语句SELECT,在数据库school中查询班级表 class 中teacher字段的数据。具体步骤如下:    


mysql>  create database school;   #创建数据库school


mysql>  use school;   #选择数据库school


mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长


mysql>  insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny'),(4,'四班', 'Janny');  # 插入多条记录


mysql> select teacher from class ;  #查询class表中的teacher 域,包含重复记录


mysql> select distinct teacher from class ;  #查询class表中的teacher 域,去重  

5.IN 查询


 有的时候,当我们需要查询的目标记录限定在某个集合中的时候,在MySQL中可以使用关键字IN来实现,关键字IN可以实现判断字段的数值是否在指定集合中,该关键字的具体语句形式如下:


           SELECT field1,field2,…,fieldn  


           FROM tablename WHERE filedm IN(value1,value2,value3,…,valuen);  


       注:参数fieldn表示名称为tablename的表中的字段名,参数valuen表示集合中的值,通过关键字IN来判断字段fieldm的值是否在集合(value1,value2,value3,…,valuen)中,如果字段fieldm的值在集合中,就满足查询条件,该记录会被查询出来,否则不会被查询出来。

mysql>  create database school;   #创建数据库school


mysql>  use school;   #选择数据库school


mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长


mysql>  insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny'),(4,'四班', 'Janny');  # 插入多条记录  


mysql> select * from class where teacher in ('Martin','Rock') ;  #查询class表中的teacher 域是martin 和Rock 的记录  

  使用NOT IN可以反向查询非集合中的数据


               SELECT field1,field2,…,fieldn  


               FROM tablename WHERE filedm NOT IN(value1,value2,value3,…,valuen);


         在具体使用关键字IN时,查询的集合中如果存在NULL,则不会影响查询,NULL 存不存在的效果都一样;但如果使用关键字NOT IN,查询的集合中如果存在NULL,则不会查询到任何的结果


6.BETWEEN AND 查询


当我们需要查询指定范围内的数据(如: id 从0 到 100)的时候,MySQL提供了关键字BETWEEN AND,用来实现判断字段的数值是否在指定范围内的条件查询。该关键字的具体语法形式如下:


           SELECT field1,field2,…,fieldn


           FROM tablename WHERE fieldm BETWEEN minvalue AND maxvalue


       在上述语句中,参数fieldn表示名称为tablename的表中的字段名,通过关键字BETWEEN和AND来设置字段field的取值范围,如果字段field的值在所指定的范围内,那么满足查询条件,该记录会被查询出来,否则不会被查询出来。


       BETWEEN minvalue AND maxvalue,表示的是一个范围间的判断过程,只针对数字类型。


  1)符合范围的数据记录查询

通过关键字BETWEEN和AND设置查询范围,以实现查询语文成绩(字段Chinese)在80和90之间的学生,具体SQL如下:

mysql>  create database school;   #创建数据库school


mysql>  use school;   #选择数据库school


mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, math tinyint unsigned, chinese tinyint unsigned, english tinyint unsigned, create_date  date);       #创建成绩表 grade  


mysql> insert into grade values(1, '甲', 80, 87, 91,'2020-02-03'),(2,'乙', 72, 64, 89,'2020-05-01'),(3, '丙', 54, 69, 87,'2020-04-21'),(4,'丁', 78, 79, 89, '2020-06-04');  # 插入多条记录  


mysql> select * from class where chinese between  80 and 90 ;  #查询成绩表中语文成绩在80 和 90 之间的学员记录


mysql> select * from grade where create_date between '2020-05-01' and '2020-06-04'

2)不符合范围的数据记录查询


通过关键字NOT设置反向查询非查询范围的条件,具体SQL语句如下:


               SELECT name,chinese  


                       FROM grade WHERE Chinese NOT BETWEEN 85 AND 90;


       上面语句等同于:


               select name,chinese from grade where chinese <85 or chinese >90;


7.LIKE 模糊查询


当我们只想用字符串中间的一部分特征查找含有特征字串的信息时,MySQL提供了关键字LIKE来实现模糊查询,需要使用通配符,具体语法形式如下:


           SELECT field1,field2,…,fieldn


           FROM tablename WHERE fieldm LIKE value;  


       在上述语句中,参数tablename表示表名,参数fieldn表示表中的字段名字,通过关键字LIKE来判断字段field的值是否与value字符串匹配,如果相匹配,则满足查询条件,该记录就会被查询出来;否则就不会被查询出来。


       在MySQL中,字符串必须加上单引号('')和双引号(″″)。由于关键字LIKE可以实现模糊查询,因此该关键字后面的字符串参数除了可以使用完整的字符串外,还可以包含通配符。LIKE关键字支持的通配符如表5-1所示。

bcf4808186274c69b85bcd890c468d4b.png

1)查找某个字段含有‘三’字的记录:


               SELECT * FROM class WHERE teacher LIKE ‘%三%’;


注意:  将会把teacher字段为“三爷”,“张三”,“张猫三”、“三脚猫”,“唐三藏”等等含“三”的记录全找出来。


       2)查找teacher字段中既有“三”又有“猫”的记录,请使用and条件


               SELECT * FROM class WHERE teacher LIKE ‘%三%’ AND teacher LIKE ‘%猫%’;


       3)查询teacher字段中既有“三”又有“猫”的记录,同时“猫”在“三”之后的记录


               SELECT * FROM class WHERE teacher LIKE ‘%三%猫%’;


注意:  虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。


       4)只找出“唐三藏”这样teacher为三个字且中间一个字是“三”的;


               SELECT * FROM [user] WHERE u_name LIKE ‘_三_’;


注意:_表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文          字符)


       5)只找出“三脚猫”这样teacher为三个字且第一个字是“三”的;


               SELECT * FROM class WHERE teacher LIKE ‘三__’;


讲了这么多,咱来实战一把:


       1)、 带有“%”通配符的查询


       (1)查询字段teacher中以字母Ma开头的数据记录,具体SQL语句如下:


           SELECT teacher FROM class WHERE teacher LIKE '%Ma%';


       (2)MySQL不区别大小写,上述SQL语句可以修改如下:


           SELECT * FROM class WHERE teacher LIKE 'MA%';


       (3)如果想查询不是以字母Ma开头的全部老师,可以执行逻辑非运算符(NOT),具体SQL语句如下:


           SELECT teacher FROM class WHERE teacher NOT LIKE '%ar%';

mysql>  create database school;   #创建数据库school


mysql>  use school;   #选择数据库school


mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长


mysql>  insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny'),(4,'四班', 'Janny');  # 插入多条记录


mysql> SELECT teacher FROM class WHERE teacher LIKE '%Ma%';  #查询class表中的teacher 域,包含重复记录  


mysql> SELECT name FROM class WHERE  name NOT LIKE '%ar%';  


2)、带有“_”通配符的查询


       (1)查询字段teacher中第二个字母为A的数据记录,具体SQL语句如下:


                   SELECT * FROM class WHERE teacher LIKE '_A%';


       (2)如果想查询第二个字母不是A的全部老师,可以执行逻辑非运算符(NOT),具体SQL语句如下:


                   SELECT * FROM class WHERE NOT teacher LIKE '_A%';


       (3)如果想查询第二个字母不是A的全部老师,也可以用以下SQL语句查询:


                   SELECT * FROM class WHERE teacher NOT LIKE '_A%';


       3)、使用LIKE关键字查询其他类型数据


       (1)执行SQL语句SELECT,查询grade表字段english带有数字9的全部学生,具体SQL语句如下:


                   SELECT name,english FROM grade WHERE english LIKE '%9%';


       (2)对于LIKE关键字,如果匹配“%%”,就表示查询所有数据记录。


                   SELECT name FROM grade WHERE name LIKE '%%';

mysql>  create database school;   #创建数据库school


mysql>  use school;   #选择数据库school


mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, math tinyint unsigned, chinese tinyint unsigned, english tinyint unsigned, create_date  date);       #创建成绩表 grade  


mysql> insert into grade values(1, '甲', 80, 87, 91,'2020-02-03'),(2,'乙', 72, 64, 89,'2020-05-01'),(3, '丙', 54, 69, 87,'2020-04-21'),(4,'丁', 78, 79, 89, '2020-06-04');  # 插入多条记录  


mysql>  select * from grade where english like '9_' ;  #查询英语成绩是90 - 99 的记录

8.对查询结果排序


在MySQL中,从表中查询出的数据可能是无序的,或者其排列顺序不是用户所期望的顺序,为了使查询结果的顺序满足用户的要求,可以使用关键字ORDER BY对记录进行排序,其语法形式如下:


                 SELECT field1, field2, field3, …, fieldn


                   FROM tablename ORDER BY fieldm [ASC|DESC]


       在上述语句中,参数tablename表示所要进行排序的表名,参数fieldn表示表中的字段名字,参数fieldm表示按照该字段进行排序;ASC表示按升序进行排序;DESC表示按降序进行排序。默认的情况下按ASC进行排序。


       注意:如果存在一条记录字段的值为空值(NULL),那么按升序排序时,含空值的记录将最先显示,可以理解为空值是该字段的最小值;按降序排列时,字段为空值的记录将最后显示。


(1)执行SQL语句SELECT,查询表grade中所有的数据记录,按照语文成绩(字段chinese)升序排序,具体SQL语句如下:


        SELECT id,name,chinese FROM class ORDER BY chinese ASC;

mysql>  create database school;   #创建数据库school


mysql>  use school;   #选择数据库school


mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, math tinyint unsigned, chinese tinyint unsigned, english tinyint unsigned, create_date  date);       #创建成绩表 grade  


mysql> insert into grade values(1, '甲', 80, 87, 91,'2020-02-03'),(2,'乙', 72, 64, 89,'2020-05-01'),(3, '丙', 54, 69, 87,'2020-04-21'),(4,'丁', 78, 79, 89, '2020-06-04');  # 插入多条记录  


mysql> SELECT id,name,chinese FROM class ORDER BY chinese ASC;  #按升序的方式查询学员记录


9.简单分组查询

  MySQL软件提供了5个统计函数来帮助用户统计数据,可以使用户很方便地对记录进行统计数、计算和、计算平均数、计算最大值和最小值,而不需要查询所有数据。


       在具体使用统计函数时,都是针对表中所有记录数或指定特定条件(WHERE子句)的数据记录进行统计计算。在现实应用中,经常会先把所有数据记录进行分组,再对这些分组后的数据记录进行统计计算。


       MySQL通过SQL语句GROUP BY来实现,分组数据查询语法如下:


               SELECT function()[,filed ]


               FROM tablename WHERE CONDITION GROUP BY field;


       在上述语句中,参数field表示某字段名,通过该字段对名称为tablename的表的数据记录进行分组。


       注意:在具体进行分组查询时,分组所依据的字段上的值一定要具有重复值,否则分组没有任何意义。


五个统计函数简介


       1.统计数量


       COUNT(*):该种方式可以实现对表中记录进行统计,不管表字段中包含的是NULL值还是非NULL值。


       COUNT(field):该种方式可以实现对指定字段的记录进行统计,在具体统计时将忽略NULL值。


       2. 统计计算平均值


       该函数只有一种使用方式。


       AVG(field)使用方式:该种方式可以实现对指定字段的平均值进行计算,在具体统计时将忽略NULL值。


       3. 统计计算求和


       该函数只有一种使用方式。


       SUM(field)使用方式:该种方式可以实现计算指定字段值之和,在具体统计时将忽略NULL值。


       4. 统计最大值


       该函数只有一种使用方式。


       MAX(field)使用方式:该种方式可以实现计算指定字段值中的最大值,在具体统计时将忽略NULL值。


       5. 统计最小值


       该函数只有一种使用方式。


       MIN(field)使用方式:该种方式可以实现计算指定字段值中的最小值,在具体统计时将忽略NULL值。


mysql>  create database school;   #创建数据库school


mysql>  use school;   #选择数据库school


mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, math tinyint unsigned, chinese tinyint unsigned, english tinyint unsigned, class_id  int NOT NULL);       #创建成绩表 grade  


mysql> insert into grade values(1, '甲', 80, 87, 91, 1),(2,'乙', 72, 64, 89,2),(3, '丙', 54, 69, 87,2),(4,'丁', 78, 79, 89, 1);  #插入多条记录  


mysql> select class_id, sum(math) from grade group by class_id;  #对两个班级的数学成绩进行统计


mysql> select class_id, avg(math), avg(chinese), avg(english) from grade group by class_id;  #统计平均分,会忽略掉NULL 记录


10.统计分组查询


在MySQL中,只实现简单的分组查询有时候可能没有任何实际意义,因为关键字GROUP BY单独使用时,默认查询出每个分组中随机的一条记录,具有很大的不确定性,一般建议将分组关键字与统计函数一起使用。


       如果想显示每个分组中的字段,可以通过函数GROUP_CONCAT()来实现。该函数可以实现显示每个分组中的指定字段,函数的具体语法形式如下:


       SELECT GROUP_CONCAT(field)


           FROM tablename


           WHERE CONDITION GROUP BY field;


       在上述语句


       【示例5-5】使用GROUP_CONCAT()对班级进行统计分组,并显示每组中学生的姓名。


       执行SQL语句GROUP_CONCAT(),显示每个分组,具体SQL语句如下:


       每个数组中的字段值。

mysql>  create database school;   #创建数据库school


mysql>  use school;   #选择数据库school


mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, math tinyint unsigned, chinese tinyint unsigned, english tinyint unsigned, class_id  int NOT NULL);       #创建成绩表 grade  


mysql> insert into grade values(1, '甲', 80, 87, 91, 1),(2,'乙', 72, 64, 89,2),(3, '丙', 54, 69, 87,2),(4,'丁', 78, 79, 89, 1);  #插入多条记录  


mysql> SELECT GROUP_CONCAT(name) name, sum(math) FROM grade GROUP BY class_id;  #按class_id 进行分组,统计数学总分并显示每个分组中的姓名  

总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了MySQL 数据查询使用,而MySQL提供了大量能使我们快速便捷地处理数据的函数和方法。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
SQL 关系型数据库 MySQL
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
|
23小时前
|
SQL 关系型数据库 MySQL
简简单单 My SQL 学习笔记(3)——连接和嵌套查询
简简单单 My SQL 学习笔记(3)——连接和嵌套查询
|
23小时前
|
SQL 关系型数据库 MySQL
简简单单 My SQL 学习笔记(2)——分组和简单数据的查询
简简单单 My SQL 学习笔记(2)——分组和简单数据的查询
|
23小时前
|
关系型数据库 MySQL 数据库管理
【MySQL进阶之路 | 基础篇】子查询之二(不相关子查询与相关子查询)
【MySQL进阶之路 | 基础篇】子查询之二(不相关子查询与相关子查询)
|
1天前
|
关系型数据库 MySQL
【MySQL】复合查询(重点)-- 详解
【MySQL】复合查询(重点)-- 详解
|
1天前
|
SQL Oracle 关系型数据库
【MySQL】基本查询(表的增删改查)-- 详解(下)
【MySQL】基本查询(表的增删改查)-- 详解(下)
|
1天前
|
SQL 关系型数据库 MySQL
【MySQL】基本查询(表的增删改查)-- 详解(上)
【MySQL】基本查询(表的增删改查)-- 详解(上)
|
4天前
|
关系型数据库 MySQL Linux
查询服务器中有没有mysql - 蓝易云
同样,如果MySQL已经安装,这个命令将会显示MySQL的版本信息。如果没有安装,系统将会显示一个错误消息。
56 0
|
4天前
|
SQL 关系型数据库 MySQL
查询mysql版本sql - 蓝易云
执行这个命令后,MySQL将返回当前正在运行的版本信息。
42 0
|
6天前
|
缓存 关系型数据库 MySQL
如何优化MySQL数据库查询性能
MySQL是一款常用的关系型数据库,但在实际使用过程中,由于数据量增加和查询操作复杂度增加,会导致查询性能下降。本文将介绍一些优化MySQL数据库查询性能的方法。