数据查询
**查询数据是指从数据库中获取所需要的数据,eg:数据库已保存的用户表读取当前用户的密码进行验证 。
简单查询
在MySQL中可以通过SQL语句来实现基本数据查询,SQL语句可以通过如下多种使用:
- 查询所有字段数据
- 查询指定字段数据
- 避免重复数据查询
- 对结果进行排序和分组查询
MySQL中,可以使用select语句查询数据,根据查询条件的不同,数据库系统会找到不同的数据
select field1 field2 ... fieldn
FROM tablename
[WHERE CONDITION1]
[GROUP BY fieldm[HAVING CONDITION2]]#满足该条件才能输出
[ORDER BY fieldn[ASC|DESC]];//按fieldn进行排序输出
查询所有字段数据
列出表的所有字段
select field1,field2,..,fieldn from tablename;
"*"符合表示所有字段
select * from tablename
查询指定字段数据
select teacher from class;#如果teacher字段不在class中,将会报错
DISTINCT查询
select distinct field1,field2,...,fieldn from tablename;
关键字DISTINCT 具有去重的作用,例如class中老师是一对多的关系,直接查询会出现一个老师多次,要想去重就可以加上distinct
select distinct teacher from class;
IN 查询
当我们需要查询的目标限定在某个集合中的时候
select field1,field2,...,fieldn from tablename where field in(value1,value2,...,valuen); select field1,field2,...,fieldn from tablename where field not in(value1,value2,...,valuen);
在具体使用关键字IN时,查询的集合中如果存在NULL,则不会影响查询,NULL存不存在的效果都一样;但如果使用关键字NOT IN,查询的集合中如果存在NULL,则不会查询到任何的结果
BETWWEN AND查询
当我们需要查询指定范围内的数据的时候
select field1,field2,...,fieldn from tablename where fieldm between minvalue and maxvalue between minvalue and maxvalue,表示的是一个范围间的判断过程,只针对数字类型。
符合数据范围的数据记录查询
查询语文成绩在80和90之间的学生
create database school; use school; 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); 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');#插入多条记录 select * from class where chinese between 80 and 90; select * from grade where create_date between '2020-05-01' and '2020-06-04';
不符合范围的数据记录查询
查询语文成绩不在80和90之间的学生
select name,chinese from grade where not between 85 and 90; => select name,chinese from grade where chinese < 85 or chinese > 90;
LIKE模糊查询
当我们只想用字符串中间的一部分特征值查找含有特征字串的信息时
select field1,field2,...,fieldn from tablename where fieldm like value; '通过关键字like来判断字段field的值是否与value字符串匹配'
在MySQL中,字符串必须加上单引号和双引号。由于关键字LIKE可以实现模糊查询,因此该关键字后面的字符串参数除了可以使用完整的字符串外,还可以包含通配符
符号 功能描述 _ 该通配符值能匹配单个字符 % 该通配符可以匹配任意长度的字符串,可以是0、…、n个字符
-
带有"%"通配符的查询
-
查询字段teacher中以字母Ma开头的数据
select teacher from class where teacher like 'Ma%'; select teacher from class where teacher like 'MA%';#MySQL不区分大小写
-
查询不是以Ma开头的全部老师,可以执行逻辑非运算符(NOT)
select teacher from class where teacher not like 'Ma%';
-
create database school; use school; create table class(id int unique auto_increment,name varchar(128) unique,teacher varchar(64)); insert into class(id,name,teacher)values(1,'一班','Martin'),(2,'二班','Rock'),(3,'三班','Janny'),(4,'四班','Janny'); select teacher from class where teacher like 'Ma%'; select distinct name from class where name not like 'Ma%';
-
-
带有’_'通配符的查询
-
查询字段teacher中第二个字母为A的数据记录
select * from class where teacher like '_A%';
-
想查询第二个字母不是A的全部老师
select * from class where teacher not like '_A%'; select * from class where not teacher like '_A%';
-
-
使用LIKE关键字查询其他类型数据
-
查询grade表字段English带有数字9的全部学生
select name,english from grade where english like '%9%';
-
对于LIKE关键字,如果匹配 ‘%%’,就表示查询所有数据记录
select name from grade where name like '%%';
-
create database school; #创建数据库school use school; #选择数据库school 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,class_id int not null); #创建成绩表 grade insert into grade values(1, '甲', 80, 87, 91,'2020-02-03',1),(2,'乙', 72, 64, 89,'2020-05-01',2),(3, '丙', 54, 69, 87,'2020-04-21',2),(4,'丁', 78, 79, 89, '2020-06-04',1); # 插入多条记录 select * from grade where english like '9_' ; #查询英语成绩是90 - 99 的记录
-
对查询结果排序
为使得查询的结果有序
select field1,field2,field3,...,fieldn from tablename order by fieldn [ASC|DESC];
如果存在记录该字段时空值,则先输出空值记录
按语文成绩升序
select id,name,chinese from class order by chinese ASC;
简单分组查询
MySQL软件提供了5个统计函数来帮助用户统计数据,可以使用户很方便地对记录进行统计数、计算和、计算平均数、计算最大值和最小值,而不需要查询所有数据。
SELECT function()[,field] from tablename where condition group by field;
在具体进行分组查询时,分组所依据的字段上的值一定要具有重复值,否则分组没有任何意义
五个统计函数
-
统计数量
- COUNT(*);
- COUNT(field);对指定字段记录进行统计,忽略NULL值
-
统计计算平均值
- AVG(field);忽略NULL值
-
统计计算求和
- SUM(field);忽略NULL值
-
统计最大值
- MAX(field);忽略NULL值
-
统计最小值
- MIN(field);忽略NULL值
-
select class_id, sum(math) from grade group by class_id; select class_id, avg(math),avg(chinese),avg(english) from grade group by class_id;
-
在MySQL中,只实现简单的分组查询有时候可能没有任何意义,因为关键字GRUOP BY单独使用时,默认查询出每个分组随机的一条记录。
统计分组查询
如果想显示每个分组中的字段,可通过GROUP_CONCAT() 来实现
select group_concat(field) from tablename where condition group by field;
-
使用GROUP_CONCAT()对班级进行统计分组,并显示每组中学生的姓名
select group_concat(name) name, sum(math) from grade group by class_id;
name sum(math) 乙、丁 151 甲、丙 151