MySql数据库(4)DQL查询数据(重点)
1.DQL
(Data Query LANGUAGE:数据查询语言)
-
-
所有的查询操作都用它 Select
-
简单的查询,复杂的查询都可以做
-
数据库中最核心的语言,最重要的语句
-
使用频率最高的语句
-
2.指定查询字段
语法:SELECT 字段,...... FROM 表
有时候,列名字不是那么的见名知意。我们起别名AS 字段名 as 别名 表名 as 别名
查询全部学生 例如有一个学生表
SELECT *FROM `student`;
查询指定字段
SELECT `studentno`,`studentname` FROM `student`;
别名,给结果起一个别名 as 可以给字段起别名,也可以给表名起别名
SELECT `studentno` AS 学号,`studentname` AS 姓名 FROM `student` AS s;
函数 Concat(a,b)
SELECT CONCAT('姓名:',studentname) AS 姓名 FROM `student`;
去重 distinct
作用:去除SELECT 查询出来的结果中重复的数据,重复的数据只显示一条
SELECT DISTINCT `studentno` FROM `result`;
学员考试成绩 +1分查看
SELECT `studentresult`+1 AS 考试成绩 FROM `result` ;
数据库中的表达式:文本值,列,Null,函数,计算表达式,系统变量......
select 表达式 from 表
3.where 条件字句
作用:检索数据中 符合条件 的值
搜索的条件由一个或者多个表达式组成!结果 布尔值
查询考试成绩在 95-100 分之间
SELECT `studentno`,`studentresult` FROM result
WHERE `studentresult` BETWEEN 80 AND 100; -- 模糊查询(区间)
SELECT `studentno`,`studentresult`FROM result
WHERE `studentresult`>=80 AND `studentresult` <=100
模糊查询:比较运算符

like结合 %(代表0到任意个字符) _(一个字符)
in (具体的一个或者多个值)
查询姓张的同学
SELECT `studentno`,`studentname` FROM `student` WHERE `studentname` LIKE '张_'
查询广东深圳的同学
SELECT `studentno`,`studentname` FROM `student` WHERE `address` IN ('广东深圳');
4.联表查询
思路:1.分析需求,分析查询的字段来自那些表(连接查询)
2.确定使用那种连接查询? 7种 确定交叉点*(这两个表中的那个数据是相同的)
3.判定的条件:学生表的中 studentNo= 成绩表中 studentNo
查询参加考试的同学(学号,姓名,科目编号,分数)
SELECT s.`studentno` AS 学号,s.studentname AS 姓名,r.subjectno AS 科目编号,r.studentresult AS 学生成绩
FROM student AS s INNER JOIN result r ON s.`studentno`=r.`studentno`
-
-
inner join 如果表中至少有一个匹配,就返回行
-
left join 会从左表中返回所有的值,即使右表中没有匹配
-
-
-
right join 会从右表中返回所有的值,即使左表中没有匹配
-
5.自连接
自己的表和自己的表连接,核心:一张表拆为两张一样的表即可

查询父子信息:把一张表看为两个一模一样的表
SELECT a.`categoryname` AS 父栏目,b.`categoryname` AS 子栏目 FROM `category` AS a,
`category` AS b WHERE a.`categoryid`=b.`pid`
6.分页和排序
排序: 升序ASC ,降序DDSC
ORDER BY 通过那个字段排序,怎么排
查询的结果根据,成绩降序,排序
SELECT s.studentno AS 学号,studentname AS 学生姓名,studentresult AS 考试成绩 FROM
student AS s INNER JOIN result AS r ON s.studentno=r.studentno WHERE s.studentno=1000
ORDER BY studentresult DESC;
分页:limit (查询下标起始值,页面的大小)
第N页:(n-1)*pagesize,pagesize pagesize:页面大小
SELECT s.studentno AS 学号,studentname AS 学生姓名,studentresult AS 考试成绩 FROM
student AS s INNER JOIN result AS r ON s.studentno=r.studentno WHERE s.studentno=1000
ORDER BY studentresult DESC LIMIT 0,5
7.子查询
where(这个值是就算出来的)
本质:在where语句中嵌套一个子查询
-- 高等数学-1分数不小于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`='高等数学-1');
8.分组和过滤
-- 查询不同课程的平均分,最高分,最低分
SELECT `subjectname`,AVG(`studentresult`) AS 平均值 ,MAX(`studentresult`) FROM result AS r
INNER JOIN `subject` AS s ON s.`subjectno`=r.`subjectno`
GROUP BY r.`subjectno` -- 通过什么字段来分组
HAVING 平均值>=80


浙公网安备 33010602011771号