MySQL 数据库(四)—— DQL:数据查询语言 Data Query Language

一、DQL:数据查询语言 Data Query Language

1、单张表的查询

(1)基本查询
① select 关键字

select  字段(*)  from  表名;

例如

SELECT * FROM student1;
SELECT sname FROM student1;

注意, *号是查询表中的所有信息,如果不需要查询所有信息则在select后面指定要查询的内容,另外,一般不推荐使用星号,因为会查询两次。

② as 关键字:别名 ,将这个字段用别名显示,as关键字可以省略。

select  字段(*) as 别名  from  表名
SELECT sname AS 姓名 FROM student1;

select  字段(*)  别名  from  表名
SELECT sname  姓名 FROM student1;

(2)条件查询:where关键字
① where 关键字表示条件查询,后面跟需要判断条件,在查询的时候就会根据这些条件去查找相应数据。

SELECT sname AS 姓名 FROM student1 WHERE sname = '李四';

② 数据库的运算符
比较运算符:= , > , < , <= , >= , <>(!=)
类似java,MySQL中也有运算比较符,但是也有一些不同,比如java中的不等于是 !=,而在MySQL中则用<>表示。

SELECT snum AS 姓名 FROM student1 WHERE snum = 2;
SELECT snum AS 姓名 FROM student1 WHERE snum > 2;
SELECT snum AS 姓名 FROM student1 WHERE snum < 4;
SELECT snum AS 姓名 FROM student1 WHERE snum <> 4;

逻辑运算符:and or not

SELECT snum AS 姓名 FROM student1 WHERE snum > 2 AND snum < 4;
SELECT snum AS 姓名 FROM student1 WHERE snum < 2 OR snum > 4;
SELECT snum AS 姓名 FROM student1 WHERE NOT snum > 2;

(3)模糊查询:like 关键字
关键字l ike 需要和匹配符 %_搭配使用,直接在 like 后面跟 % 或者下划线 _,如:

SELECT sname AS 姓名 FROM student1 where sname LIKE '李%';
SELECT sname AS 姓名 FROM student1 where sname LIKE '李_';

其中,% 后面可以跟一个或多个字符,表示只要是以“李”开头的所有数据都会被查询到;而下划线_ 后面只能跟一个字符,表示只能是以“李”开头而且后面只能跟有一个字符的数据。

(4)聚合与分组:group by 关键字
group by 表示分组,后面跟要分组的条件。

SELECT * FROM student1 GROUP BY snum;

(5)条件查询:having 关键字
having 也是表示条件查询,后面跟聚合函数条件,使用 having 的前提是必须要使用分组group by。

SELECT 字段 FROM 表名 GROUP BY 字段 HAVING 聚合函数条件;

其和where作用一致,区别是:
1> 使用 having 的前提是使用了group by 分组的,并且放在其后面;
2> having 后面的条件是聚合函数.

-- 查询分数表中所有平均分大于80分的学生的学生编号
SELECT snum AS 学生编号 FROM scores1 GROUP BY snum HAVING AVG(sscore) > 80;

(6)聚合函数
求平均值:avg(字段)
求最大值:max(字段)
求最小值:min(字段)
求和:sum(字段)
计数:count(字段)

-- 查询所有学生的平均分
SELECT AVG(sscore) AS 学生编号 FROM scores1;
-- 查询学生成绩中的最高分
SELECT MAX(sscore) AS 学生编号 FROM scores1;
-- 查询学生成绩中的最低分
SELECT MIN(sscore) AS 学生编号 FROM scores1;
-- 计算所有学生成绩的总分
SELECT SUM(sscore) AS 学生编号 FROM scores1;
-- 统计所有学生的人数个数
SELECT COUNT(snum) AS 学生编号 FROM scores1;	

(7)排序:order by 关键字
order by 是排序的指令,后面跟排序规则:ASC 升序和 DESC 降序,其中 ASC 是默认排序方式,可以省略。

-- 排序 order by
-- 查询学生的年龄,按升序排列
SELECT * FROM student ORDER BY sage ASC;
-- 查询成绩表中的成绩,按照降序
SELECT * FROM sc ORDER BY score DESC;
-- 将每个学生的平均成绩按照由大到小排序
SELECT sno,AVG(score) FROM sc GROUP BY sno ORDER BY AVG(score) DESC;

(8)限制(截取):limit 关键字
limit 表示显示多少条数据
格式:limit 起始位置,条数

-- limit 关键字语法
SELECT DISTINCT 字段 FROM 表名 LIMIT 起始位置,条数;
-- 示例:查询学生的前三条数据
SELECT * FROM student LIMIT 0, 3;
-- 使用limit 和order by 模拟找出最大和最小值分数
SELECT * FROM sc ORDER BY score DESC LIMIT 0, 1;
SELECT * FROM sc ORDER BY score ASC LIMIT 0, 1;

(9)去重:distinct关键字
使用 distinct 时不能使用其他字段

-- 语法
SELECT DISTINCT 去重字段 from 表名;
-- 示例
SELECT DISTINCT sno from sc group by sno;

(10)完整的查询语句

-- 一条完整的查询语句
SELECT DISTINCT 字段 FROM 表名 
	WHERE 条件过滤 
		GROUP BY 分组字段 
			HAVING 过滤条件 
				ORDER BY 排序字段 排序规则 
					LIMIT 起始位置,条数;

完整语句执行顺序
① from:找到数据源(表),并且将这张表的数据写入到内存中
② where:进行普通字段的过滤
③ group by:将内存中的数据进行分组
④ 计算出聚合函数:查看是否要执行聚合函数,如果有聚合函数则计算出聚合函数(聚合函数必须要分组才能使用,默认分为一个组)
⑤ 查看是否有 having 进行过滤,有则使用 having 进行过滤
⑥ 去重,去掉相同的字段,只显示一条
⑦ order by:排序
⑧ limit:截取符合条件的数据(只能放置语句的最后)

2、多张表的查询

(1)子查询:关键字 in/not in/any/all/exists
使用多张表一起查询,将从一个表查询的到结果作为另一张表或是条件。
子查询的 = 号:表示子查询的结果只能有一条结果数据作为主表的条件;
子查询的 in:比 = 强大,可以一次性匹配多个条件,作为另一张表供主表查询。

-- 子查询
SELECT * FROM student WHERE sno = 
	(SELECT sno FROM sc ORDER BY score DESC limit 0, 1);

-- 查询学过谌燕老师教过的课的学生的姓名、性别、年龄、学号
SELECT * FROM student where sno in 
	(SELECT sno FROM sc where cno in 
		(SELECT cno from course where tno = 
			(SELECT tno from teacher where tname like "谌燕%")));

-- 查询学过s001学生学过的课程的学生的姓名、性别、年龄、学号
SELECT * FROM student WHERE sno in 
	(SELECT sno FROM sc WHERE cno in 
		(SELECT cno FROM sc WHERE sno = 's001')) 
			and not sno LIKE "s001";

子查询 any和all:需要配子查询结果:

> any(子查询语句);  大于最小值
< any(子查询语句);  小于最大值
> all(子查询语句);  大于最大值
< all(子查询语句);  小于最小值

(2)连接查询
① 全连接:结果会产生笛卡尔积,所以一般不使用。

-- 全连接:将学生表和成绩表连接在一起
SELECT * FROM student AS st,sc AS s WHERE st.sno = s.sno;

② 内连接

select 字段 from 表1 [inner] jion 表2 on 连接条件(主外键相等条件)

jion可以省略,字段如果是两个重复的名字,必须使用别名.字段或者表名.字段。

-- 内连接:将学生表和成绩表连接在一起
SELECT st.sno,sname,sage,ssex,cno,score from student AS st 
	INNER JOIN sc AS s ON st.sno = s.sno;
	
-- 查询每个老师的课程,显示课程名字、课程号、老师id和老师姓名
SELECT cno,cname,tr.tno,tname FROM course AS ce 
	INNER JOIN teacher AS tr ON tr.tno = ce.tno;

③ 外连接
左外连接:left 表示以左边表为主,左边的表的数据一定会有,如果右边的表没有数据,以 null 填充。

select 字段 from 表1 left [outer] jion 表2 on 连接条件

-- 左外连接:将学生表和成绩表连接在一起(左边表为主)
SELECT * FROM student AS st LEFT OUTER JOIN sc as s ON st.sno = s.sno;

-- 查询学生学号、姓名、性别、年龄以及所学课程编号、名称、成绩
SELECT st.sno,sname,ssex,sage,ce.cno,cname,s.score 
	FROM student AS st LEFT OUTER JOIN sc as s ON st.sno = s.sno
		LEFT OUTER JOIN course AS ce ON s.cno = ce.cno;

右外连接:right 表示以右边表为主,右边的表的数据一定会有,如果左边的表没有数据,以 null 填充。

select 字段 from 表1 right [outer] jion 表2 on 连接条件

-- 右外连接:将学生表和成绩表连接在一起(右边表为主)
SELECT * FROM sc AS s RIGHT OUTER JOIN student as st ON st.sno = s.sno;

注意:使用连接查询的前提是两张表一定存在关系(主外键关系)!

(3)联合查询
将两张结构一样的表连接成一张。

-- 联合查询
select 字段 from 表1 union select 字段 from 表2
select 字段 from 表1 union all select 字段 from 表2

其中,union会自动去重,union all 不会自动去重。

发布了40 篇原创文章 · 获赞 0 · 访问量 344

猜你喜欢

转载自blog.csdn.net/baidu_27414099/article/details/104440016