文章目录
- DQL
- 指定查询字段
- where条件子句
- 联表查询
- 分页和排序
- 子查询
DQL
(Data Query Language:数据查询语言)
- 所有的查询操作都要用到它 select
- 简单的查询,复杂的查询都要用到它
- 数据库最核心的语言,最重要的语言
- 使用频率最高的语言
指定查询字段
-- 查询所有的学生 select 字段 from 表
select * from student
-- 查询指定字段
select studentno,studentname from student
-- 给结果起一个名字 , As,可以给字段起别名,也可以给表起别名
select studentno as 学号,studentname as 学生姓名 from student
select studentno 学号,studentname 学生姓名 from student
-- 函数 concat(a,b)
select CONCAT('姓名:',studentname) as 新名字 from student
语法:select 字段 from 表
有时候,列的名字不是那么的见名之意,我们可以用as给字段起别名
字段名 as 别名 或者是 表名 as 表别名
去重 distinct
作用:去除select查询出来的结果中重复的数据,重复的数据只显示一条
-- 查询一下有哪些同学参加了考试
select * from result -- 查询全部的考试成绩
select studentno from result -- 查询有哪些学生参加了考试
select distinct studentno from result -- 去重
数据库的列(表达式)
select version() -- 查询系统版本号(函数)
select 100*3-2 -- 用来计算(表达式)
select @@auto_increment_increment -- 查询自增的步长(变量)
-- 学生考试成绩+1分查看
select studentno,studentresult+1 as '提分后' from result
数据库中的表达式:文本值,列,null,函数,计算表达式,系统变量
select 表达式 from 表
where条件子句
作用:检索符合条件的值
搜索的条件都是由一个或者多个表达式组成!结果都是布尔值
逻辑运算符
select studentno,studentresult from result
-- 查询考试成绩在95~100之间的
-- and &&
select studentno,studentresult from result
where studentresult>=95 and studentresult<=100
-- 模糊查询(区间)
select studentno,studentresult from result
where studentresult between 95 and 100
-- ! not
select studentno,studentresult from result
where not studentno=1000
模糊查询:比较运算符
-- ===========模糊查询========================
-- 查询姓张的同学
-- like结合%(代表0到任意个字符) _(一个字符)
select studentno,studentname from student
where studentname like '张%'
-- 查询姓张的同学,名字只有两个字
select studentno,studentname from student
where studentname like '张_'
-- ======in(具体的一个或者多个值)========
-- 查询学号1000,1001的学生
select studentno,studentname from student
where studentno in(1000,1001)
-- 查询在北京的学生
select studentno,studentname from student
where address in('北京朝阳')
-- ========null not null====================
-- 查询地址为空的同学 null或者''
select studentno,studentname from student
where address='' or address is null
-- 查询出生日期不为空的学生
select studentno,studentname from student
where borndate is not null
联表查询
-- 查询参加考试的同学(学号,姓名,科目编号,分数)
select * from student
select * from result
/*思路:
1.分析需求:分析查询的字段来自哪些表(连接查询)
2.确定使用哪种连接查询? 7种
确定交叉点,这两个表中哪些数据是相同的
判断的条件:学生表的studentno=成绩表 studentno
*/
select s.studentno,studentname,subjectno,studentresult
from student as s
inner join result as r
where s.studentno=r.studentno
-- right join
select s.studentno,studentname,subjectno,studentresult
from student as s
right join result as r
on s.studentno = r.studentno
-- left join
select s.studentno,studentname,subjectno,studentresult
from student as s
left join result as r
on s.studentno = r.studentno
练习:
-- ===============联表查询==================
-- 查询参加考试的同学(学号,姓名,科目编号,分数)
select * from student
select * from result
/*思路:
1.分析需求:分析查询的字段来自哪些表(连接查询)
2.确定使用哪种连接查询? 7种
确定交叉点,这两个表中哪些数据是相同的
判断的条件:学生表的studentno=成绩表 studentno
*/
-- join(连接的表) on(判断的条件) 连接查询
-- where 等值查询
select s.studentno,studentname,subjectno,studentresult
from student as s
inner join result as r
where s.studentno=r.studentno
select s.studentno,studentname,subjectno,studentresult
from student as s
inner join result as r
on s.studentno=r.studentno
-- right join
select s.studentno,studentname,subjectno,studentresult
from student as s
right join result as r
on r.studentno = s.studentno
-- left join
select s.studentno,studentname,subjectno,studentresult
from student as s
left join result as r
on s.studentno = r.studentno
-- 查询缺考的同学(只要让成绩为null,就能找到)
select s.studentno,studentname,subjectno,studentresult
from student as s
left join result as r
on s.studentno = r.studentno where studentresult is null
-- 查询了参加考试的同学信息:学号,学生姓名,科目名称,分数
-- 表 student result subject
-- 右查询
-- 交叉点:学生表 studentno=成绩表 studentno
-- 成绩表 subjectno=科目表 subjectno
select s.studentno,studentname,sub.subjectname,studentresult
from student as s
right join result as r
on r.studentno=s.studentno
inner join `subject` as sub
on r.subjectno=sub.subjectno
-- 我要查询哪些数据 select ...
-- 从哪几个表中查询 from 表 xxx join 连接的表 on 较差条件
-- 假设存在一种多张表查询,先查询两张表开始,然后再慢慢增加
-- from a left join b
-- from a right join b
自连接
自己的表和自己的表连接;
核心:一张表拆分成两张一样的表即可
父类表:
子类表
查询父类对应的子类关系
-- 查询父子信息:把一张表看为两个一模一样的表
select a.categoryname as '父栏目',b.categoryname as '子栏目'
from category as a,category as b
where a.categoryid = b.pid
分页和排序
排序
-- 排序:升序 ASC 降序DESC
-- 通过哪个字段排序,怎么排
select s.studentno,studentname,subjectname,studentresult
from student as s
inner join result as r
on s.studentno = r.studentno
inner join `subject` as sub
on sub.subjectno=r.subjectno
where subjectname = '高等数学-1'
order by studentresult DESC
分页
-- 为什么要分页
-- 缓解数据库的压力,给人更好的体验 ---瀑布流
-- 分页,每页显示五条数据
-- 语法:limit 起始值,页面的大小
-- 网页应用:当前页,总页数,页面的大小
-- limit 0,5 1~5条数据
-- limit 1,5 2~6条数据
select * from student limit 0,5
-- 第一页 limit 0,5 (1-1)*5
-- 第二页 limit 5,5 (2-1)*5
-- 第二页 limit 10,5 (3-1)*5
-- 第N页 limit (n-1)*5
-- pageSize:页面的大小
-- (n-1)*pageSize:起始值
-- n:当前页
-- 数据总数/页面大小=总页数
语法:limit (查询起始下标,pageSize)
子查询
where (值是固定的,这个值是计算出来的)
本质:在where语句中嵌套一个子查询语句
-- 查询高等数学-1的所有考试结果(学号,科目编号,成绩),降序排列
-- 方式1
select studentno,subjectno,studentresult
from result as r
inner join `subject` as sub
on r.subjectno=sub.subjectno
where subjectname='高等数学-1'
order by studentresult DESC
-- 方式2:使用子查询
select studentno,subjectno,studentresult
from result
where subjectno=(
select subjectno from `subject`
where subjectname='高等数学-1'
)order by studentresult DESC
-- 查询所有高等数学-1的学生的学号
select subjectno from `subject` where subjectname='高等数学-1'
-- 查询分数不小于80分的学生的学号和姓名
select studentno,studentname
from student
where studentno=(
select distinct studentno from result where studentresult>=80
)
-- 查询课程为高等数学-2并且分数不小于80分的同学的学号和姓名
-- 联表查询
select s.studentno,studentname
from student as s
inner join result as r
on s.studentno=r.studentno
inner join `subject` as sub
on r.subjectno=sub.subjectno
where subjectname='高等数学-2' and studentresult>=80
-- 子查询
select DISTINCT s.studentno,studentname
from student as s
inner join result as r
on s.studentno=r.studentno
where studentresult>=80 and subjectno=(
select subjectno from `subject` where subjectname='高等数学-2'
)
-- 子查询:(由里及外)
select studentno,studentname
from student where studentno in(
select studentno from result where studentresult>=80 and subjectno=(
select subjectno from `subject` where subjectname='高等数学-2'
)
)