DQL查询数据(最重点)
DQL查询数据(最重点)
DQL
- (Data Query LANGUAGE:数据查询语言)
- 所有的查询操作都用它 Select
- 简单的查询,复杂的查询它都能做~
- 数据库中最核心的语言,最重要的语句
- 使用频率最高的语句
SELECT语法
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] -- 联合查询
[WHERE ....] -- 指定结果需满足的条件
[GROUP BY ....] -- 指定结果按照哪几个字段来分组
[HAVING] -- 过滤分组的记录必须满足的次要条件
[ORDER BY ....] -- 指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];
-- 指定查询的记录从哪条至哪条
注意:[ ]括号代表可选的,{ }括号代表必选得
指定查询字段
-- 查询全部的学生 SELECT 字段 FROM 表
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
-
语法:
SELECT字段....FROM 表 -
去重 DISTINCT
作用:去除SELECT 查询出来的结果中重复的数据,重复的数据只显示一条
-- 查询一下有哪些同学参加了考试,成绩 SELECT * FROM result -- 查询全部的考试成绩 -- 查询有哪些同学参加了考试 SELECT `StudentNo` FROM result -- 发现重复数据,去重 SELECT DISTINCT `StudentNo` FROM result数据库的列(表达式)
-- 查询系统的版本号(函数) SELECT VERSION() -- 用来计算(表达式) SELECT 100*3-1 AS 计算结果 -- 查询自增的步长(变量) SELECT @@auto_increment_increment -- 学员考试成绩 +1分查看 SELECT `StudentNo`,`StudentResult`+1 AS '提分后' FROM result数据中的表达式:文本值,列,Null,函数,计算表达式,系统变量…………..
where条件子句
-
作用:检索数据中
符合条件的值搜索的条件由一个或者多个表达式组成!结果 布尔值
-
-- =============== where =============== SELECT studentNo,`StudentResult` FROM result -- 查询考试成绩在80~100之间 SELECT studentNo,`StudentResult` FROM result WHERE StudentResult >=80 AND StudentResult <=100 -- and && SELECT studentNo,`StudentResult` FROM result WHERE StudentResult >=80 && StudentResult <=100 -- 模糊查询(区间) SELECT studentNo,`StudentResult` FROM result WHERE StudentResult BETWEEN 80 AND 100 -- 查询除了1000号学生之外的同学的成绩 SELECT studentNo,`StudentResult` FROM result WHERE studentNo!=1000; -- != not SELECT studentNo,`StudentResult` FROM result WHERE studentNo NOT = 1000; -
模糊查询:比较运算符
| 运算符 | 语法 | 描述 |
|---|---|---|
| IS NULL | a is null | 如果操作符为NULL,结果为真 |
| IS NOT NULL | a is not null | 如果操作符部位NULL,结果为真 |
| BETWEEN | a between b and c | 若a在b和C之间,结果为真 |
| Like | a like b | SQL匹配,如果a能够匹配b,结果为真 |
| In | a in(a1,a2,a3…) | 假设a在a1,或者a2…其中的某一个值中,结果为真 |
-- =============== 模糊查询 ===============
-- 查询姓刘的同学
-- like解和 %(代表0到任意个字符)_(一个字符)
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '刘%'
-- 查询姓刘的同学,名字后面只有一个字的
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '刘_'
-- 查询姓刘的同学,名字后面只有两个字的
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '刘__'
-- 查询名字中间有雅字的中间 %雅%
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '%雅%'
-- =============== In(具体的一个或者多个值)===============
-- 查询1001,1002,1003号学员
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentNo IN (1001,1002,1003);
-- 查询在北京的学生
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;
联表查询
-
JOIN 对比
-- =============== 联表查询 join =============== -- 查询参加了考试的同学(学号,姓名,科目编号,分数) 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 r.studentNo,StudentName,SubjectNo,StudentResult FROM student AS s RIGHT JOIN result r ON s.studentNo = r.studentNo -- Left JOIN SELECT r.studentNo,StudentName,SubjectNo,StudentResult FROM student AS s RIGHT JOIN result r ON s.studentNo = r.studentNo -
操作 描述 Inner join 如果表中至少有一个匹配,就返回行 left join 会从左表中返回所有的值,即使右表中没有匹配 right join 会从右表中返回所有的值,即使左表中没有匹配 -
自连接(了解)
自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
分页和排序
-
排序:
-- 分页和排序 -- order by 通过哪个字段排序,怎么排 -- 排序: 升序asc ,降序 desc -- 查询的结果根据 成绩降序来排序 SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM `student` s INNER JOIN `result` r ON s.`studentno` = r.`studentno` INNER JOIN `subject` sub ON r.`subjectno` = sub.`subjectno` WHERE `subjectname` = '数据库结构-1' ORDER BY `studentresult` ASC -
分页:
-- 为什么要分页? -- 缓解数据库压力,给人更好的体验 or 瀑布流 -- 分页每页只显示五条数据 -- 语法: limit 当前页 页面的大小 SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM `student` s INNER JOIN `result` r ON s.`studentno` = r.`studentno` INNER JOIN `subject` sub ON r.`subjectno` = sub.`subjectno` WHERE `subjectname` = '数据库结构-1' ORDER BY `studentresult` ASC LIMIT 0,5 -- 规律 -- 第一页 limit 0,5 -----> (1-1)* 5 -- 第二页 limit 5,5 -----> (2-1)* 5 -- 第三页 limit 10,5 -----> (3-1)* 5 -- 第N页 limit 0,5 -----> (n-1)* pageSize pageSize:页面大小 (n-1)* pageSize: 起始值 -- 总页数: 数据综述/页面大小语法:limit(查询起始下标,pageSize)
sq子查询
-
where(这个值是计算出来的)
本质:在where 语句中嵌套一个子查询语句
where (select * from)
-
-- 方式二:使用自查询() SELECT `studentno`,`subjectno`,`studentresult` FROM `result` WHERE studentno = ( SELECT `subjectno` FROM `subject` WHERE `subjectname` = '数据库结构-1' ) ORDER BY `studentresult` DESC;子查询在数据量较大的时候查询效率差
MySQL函数
-
常用函数
-
-- 常用函数 -- 数学运算 SELECT ABS(-7) -- 绝对值 SELECT CEILING (9.4) -- 向上取整 SELECT FLOOR (9.4) -- 向下取整 SELECT RAND () -- 返回一个0~1之间的随机数 SELECT SIGN (-7) -- 判断一个数的符号 0:0 正数:1 负数:-1 -- 字符串函数 SELECT CHAR_LENGTH ('凡王之血,必以剑终') -- 字符串长度 SELECT CONCAT ('厦','门','大','学') -- 拼接字符串 SELECT INSERT ('我爱编程',2,1,'超级爱') -- 查询,从某个位置开始替换某个长度 SELECT LOWER ('xSd') -- 小写字母 SELECT UPPER ('cyy') -- 大写字母 SELECT INSTR ('cssy' 'y') -- 返回 第一次出现的字符串索引 SELECT REPLACE ('坚持就能成功', '坚持','努力') -- 返回指定的字符串(源字符串,截取的位置,截取的长度) SELECT SUBSTR ('坚持就能成功', 4,5) -- 返回指定的字符串(源字符串,截取的位置,截取的长度) SELECT REVERSE ('你好') -- 反转 -- 时间和日期函数(记住) SELECT CURRENT_DATE() -- 获取当前日期 SELECT CURDATE() -- 获取当前日期 SELECT NOW() -- 获取当前的时间 SELECT LOCALTIME() -- 本地时间 SELECT SYSDATE () -- 系统时间 SELECT YEAR(NOW()) -- 年 SELECT MONTH(NOW()) -- 月 SELECT DAY(NOW()) -- 日 SELECT HOUR(NOW()) -- 小时 SELECT MINUTE(NOW()) -- 分钟 SELECT SECOND(NOW()) -- 秒 -- 系统 SELECT SYSTEM_USER () -- 系统用户 SELECT USER() -- 系统用户 SELECT VERSION() -- 系统版本-
聚合函数
-
函数名称 描述 COUNT() 计数 SUM() 求和 AVG() 平均值 MAX() 最大值 MIN() 最小值 … ..
-- ========== 聚合函数 ========== SELECT COUNT(studentname) FROM student; -- COUNT(指定列),会忽略所有的null值 SELECT COUNT(*) FROM student; -- count(*)不会忽略null值 SELECT COUNT(1) FROM result; -- count(1) 不会忽略所有的null值 SELECT SUM(`StudentResult`) AS 总和 FROM result SELECT AVG(`StudentResult`) AS 平均分 FROM result SELECT MAX(`StudentResult`) AS 最高分 FROM result SELECT MIN(`StudentResult`) AS 最低分 FROM result -
分组和过滤
-- 查询不同课程的平均分,最高分,最低分,平均分大于75
-- 核心: (根据不同的课程分组)
SELECT SubjectName,AVG(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo = sub.SubjectNo
GROUP BY r.SubjectNo -- 通过什么字段来分组
HAVING 平均分>75
数据库级别的MD5加密(扩展)
-
什么是MD5?
主要增强算法复杂度和不可逆性。
MD5不可逆,具体的值的md5是一样的
MD5破解网站的原理,背后有一个字典,MD5加密后的值,加密前的值
-- ========== 测试MD5 加密 ==========
CREATE TABLE `testmd5`(
`id` INT(4) NOT NULL,
`name` VARCHAR(20) NOT NULL,
`pwd` VARCHAR(50) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 明文密码
INSERT INTO `testmd5` VALUES(1,'zhangsan',123456),(2,'lisi',123456),(3,'wangwu',123456);
-- 加密
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id = 1;
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id != 1;
UPDATE testmd5 SET pwd=MD5(pwd) -- 加密全部的密码
-- 插入的时候加密
INSERT INTO `testmd5` VALUES(4,'xiaoming',MD5(123456))
-- 如何校验:将用户传递进来的密码,进行md5加密,然后比对加密后的值
SELECT * FROM testmd5 WHERE `name`='xiaoming' AND pwd=MD5('123456')
SELECT小结
顺序最重要:
select 去重 要查询的字段 from 表 (注意:表和字段可以取别名)
xxx join 要连接的表 on 等值判断
where(具体的值,子查询语句)
group by (通过哪个字段来分组)
HAVING(过滤分组后的信息,条件和where是一样的,位置不同)
ORDER BY (通过哪个字段排序)[升序或降序]
LIMIT startindex,pagesize
业务层面:
查询:
跨表,跨数据库....

浙公网安备 33010602011771号