目录
DQL是啥?
DQL(Data Query Language,数据查询语言)
查询数据库数据,如SELECT语句
简单的单表查询或多表的复杂查询和嵌套查询
数据库语言中最核心、最重要的语句
使用频率最高的语句
一、查询数据
SELECT [ALL | DISTINCT]
{ * | table.* | [ table.field1 [ as alias1] [,table.field2 [as alias2]][,…]] }
FROM table_name [ as table_ alias ]
[left|out|inner join table_name2] #联合查询
[ WHERE … ] #指定结果需满足的条件
[ GROUP BY …] #指定结果按照哪几个字段来分组
[ HAVING …] #过滤分组的记录必须满足的次要条件
[ ORDER BY… ] #指定查询记录按一个或者多个条件排序
[ LIMIT { [ offset,] row_count | row_count OFFSET offset }] ;
#指定查询的记录从哪条至哪条
(一)直接查询
语法:select 字段 from 表名;
#从 student 表中查询 name 与 age
select name, age from student;
(二)WHERE 条件查询
用于检索数据表中符合条件的记录
搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假
语法:select 字段 from 表名 where 条件;
#从 student 表中查询 age = 15 的 name
select name from student where age = 15;
(三)LIKE 模糊查询
语法:
select 字段 from 表名 where 字段 like '%数据%';
#从 student 表中查询 name 中含有 '张' 的所有记录
select * from student where name like '%张%';
#从 student 表中查询 name 中含姓'张' 的所有记录
select * from student where name like '张%';
#从 student 表中查询 name 中名字为'张X' 的所有记录
select * from student where name like '张_';
# %匹配多位
# _匹配一位
(四)算数查询
语法:>(大于), <(小于), =(等于), !=(不等于), <>(不等于), >=(大于等于), <=(小于等于)
#从 student 表中查询 age < 15 的所有记录
select * from student where age < 15;
(五)逻辑查询
语法:and(且), or(或), not(非)
#从 student 表中查询 age = 15 或 sex = 'man' 的所有记录
select * from student where age = 15 or sex = 'man';
(六)IN和NOT IN运算符
语法:select 字段 from 表名 where 字段 in(列表)//或 not in(列表);
#从 student 表中查询 age 为 (13, 14, 15) 之间的所有记录
select * from student where age in(13, 14, 15);
(七)范围查询
语法:用来替换算术运算符
select 字段 from 表名 where 字段 between 范围1 and 范围2;
select * from student where age between 13 and 15;
#等价于:
select * from student where age >= 13 and age <= 15;
(八)AS子句 别名
可给数据列取一个新别名
可给表取一个新别名
可把经计算或总结的结果用另外一个新名称来代替
SELECT s.Sno as '学号' FROM student as s;
(九)DISTINCT 去重
去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条
SELECT DISTINCT 字段名1, 字段名2... FROM 表名
#查询学生信息表中班级
SELECT DISTINCT s.Class FROM student as s;
(十)NULL 空值条件查询
NULL代表“无值”
区别于零值0和空符串“”
只能出现在定义允许为NULL的字段
须使用 IS NULL 或 IS NOT NULL 比较操作符去比较
(十一)ORDER BY 排序
对SELECT语句查询得到的结果,按某些字段进行排序与DESC或ASC搭配使用,默认为ASC
## 排序查询
语法:select 字段 from 表名 order by 字段 排序方式(升序 asc, 降序 desc);
#从 student 表中查询所有记录并按照 age 升序排序
select * from student order by age asc
(十二)LIMIT 分页
LIMIT可以使用在MySQL、PGSQI、MariaDB、sQLite等数据库中使用,表示分页。
不能使用在sQL Server、DB2、oracle !
语法:
LIMIT [m,]n 或 LIMIT n OFFSET m
m 制定第一个返回记录行的偏移量
n 制定返回记录行的最大数目
SELECT * FROM `result` LIMIT 5 #返回前5条记录
SELECT * FROM `result` LIMIT 5,10 #返回6-15条记录
(十三)GROUP BY 分组
语法:
SELECT 列名1,列名2 FROM 表名 [ WHERE 条件 ] `[ GROUP BY …]`;
注意:
对所有的数据进行分组统计
分组的依据字段可以有多个,并依次分组
与HAVING结合使用,进行分组后的数据筛选
group by 声明放在from …where 条件后面,
order by…limit 条件前面,group by后面跟having
(十四)HAVING 筛选
having 通常与group by 配合使用也是一种筛选条件,放在group by 之后。与where条件相似但是使用场景不同 分组之后的数据再次筛选需要用having
SELECT job_id ,MIN(salary)
FROM employees
GROUP BY job_id
HAVING MIN(salary) >= 6000 #对分组后的数据再次进行条件筛选
二、连接查询
如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
分类:
内连接(inner join):等值和非等值的连接查询;自身连接查询
外连接(out join):左连接(left join);右连接(right join)
连接对比:
操作符名称 | 描述 |
---|---|
INNER JOIN ( JOIN ) | 如果表中有至少一个匹配,则返回行 |
LEFT JOIN | 不论右表是否有匹配,都会返回左表的所有行 |
RIGHT JOIN | 不论左表是否有匹配,都会返回右表的所有行 |
三、内连接
内连接(Inner Join)查询返回两个表中满足连接条件的数据。内连接使用关键字 INNER JOIN 表示,也可以简写成 JOIN。内连接的原理如下图所示(连接条件为两个表的 id 相等)
(一)等值和非 等值连接
与单表查询类似,都是SELECT语句
把多个表放到FROM后,并用逗号隔开
可使用AS关键字取别名,便于引用
如无重名查询字段则可省略数据表的指定
1、等值连接
连接查询中的 ON 子句与 WHERE 子句类似,可以支持各种条件运算符。其中最常用的是等号(=)运算符,这种连接查询也被称为等值连接
等值连接返回两个表中连接字段值相等的数据,我们最常使用的连接就是等值连接
#等值查询
SELECT SubjectName, GradeName FROM subject, grade
WHERE subject.GradeID = grade.GradeID;
2、非等值连接
除等号运算符外,连接条件中也可以使用其他比较运算符或者逻辑运算符,例如>=、!=、BETWEEN、AND 等,这种连接查询被称为非等值连接。
#非等值连接查询
SELECT SubjectName, GradeName FROM subject, grade;
(二)自连接
自连接(Self Join)查询是指一个表和它自己进行连接查询。自连接本质上并没有什么特殊之处,主要用于处理那些对自身进行了外键引用的表。
#员工表中的经理字段(manager)引用了员工表自身的编号字段(emp_id)。如果我们想要查看员工以及他的经理,可以通过自连接查询实现
SELECT e.emp_name AS "员工姓名",
m.emp_name AS "经理姓名"
FROM employee e
LEFT JOIN employee m ON (m.emp_id = e.manager)
WHERE e.emp_id = 9;
#查询所有学生的姓名和成绩
#1、内连接 INNER JOIN
SELECT student.Sname,score.Degree FROM student INNER JOIN score ON student.Sno = score.Sno;
四、外连接
(一)左连接
左外连接(Left Outer Join)查询首先返回左表中的全部数据。之后,如果右表中存在满足连接条件的数据,就返回该数据;如果没有相应的数据,就返回空值。左外连接使用关键字 LEFT OUTER JOIN 表示,也可以简写成 LEFT JOIN。
#查询所有学生的姓名和成绩
#左连接 LEFT JOIN 以左表为主表,显示主表的所有内容
SELECT student.Sname,score.Degree FROM student LEFT JOIN score ON student.Sno = score.Sno
(二)右连接
右外连接(Right Outer Join)查询首先返回右表中的全部数据。如果左表中存在满足连接条件的数据,就返回该数据;如果没有相应的数据,就返回空值。右外连接使用关键字 RIGHT OUTER JOIN 表示,也可以简写成 RIGHT JOIN。
#查询所有学生的姓名和成绩
#右连接 RIGHT JOIN 以右表为主表,显示主表的所有内容
SELECT student.Sname,score.Degree FROM student RIGHT JOIN score ON student.Sno = score.Sno;
五、自然连接
如果连接查询同时满足以下条件,我们可以使用 USING 替代 ON 来简化连接条件的输入:
-
连接条件是等值连接。
-
两个表中的连接字段名称相同,类型也相同。
#从一个包含栏目ID,栏目名称和父栏目ID的表中,查询父栏目名称和其子栏目名称,
CREATE TABLE IF NOT EXISTS category(
categoryId int(10) auto_increment primary key,
categoryName varchar(32) not null ,
pid int(10)
);
六、子查询
-
子查询的使用大大增强了select查询的能力
子查询在主查询之前一次执行完成
子查询的结果被主查询使用
在查询语句中的WHERE条件子句中,又嵌套了另外一个查询语句
在返回列中嵌套一个查询
#3.查询没学过"张三"老师授课的同学的信息
SELECT stu.* FROM student as stu #返回没有选该课程学生的信息
WHERE stu.s_id not in (#查找选修过该课程号的学生学号
SELECT sco.s_id FROM score as sco
WHERE c_id = ( #查找教师名为“张三”带的课程号
SELECT cou.c_id FROM teacher as tea
LEFT JOIN course as cou ON tea.t_id = cou.t_id
WHERE tea.t_name = "张三")
);
#编写技巧:从里往外写,从外往里写