首页 > 其他 > 详细

DQL查询数据(最重点)

时间:2021-05-15 12:26:54      阅读:13      评论:0      收藏:0      [点我收藏+]

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
业务层面:
查询:
跨表,跨数据库....

DQL查询数据(最重点)

原文:https://www.cnblogs.com/saxonsong/p/14769308.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!