美文网首页
DQL查询数据

DQL查询数据

作者: 奥利夫羊 | 来源:发表于2020-08-19 04:49 被阅读0次

    DQL查询数据

    Data Query Language

    MySQL文档地址:

    • 5.7 https://dev.mysql.com/doc/refman/5.7/en/
    • 8.0 https://dev.mysql.com/doc/refman/8.0/en/
    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 表 -- 表和字段可以取别名
    xxx JOIN 要连接的表 ON 等值判断
    WHERE 具体的值,子查询语句
    GROUP BY 通过那个字段来分组
    HAVING 过滤分组后的信息,类似where子句
    ORDER BY 通过那个字段排序 DESC -- 默认升序ASC 降序为DESC
    LIMIT 开始数据的所在行,页面行数
    
    -- 业务层面:查询(跨表,跨数据库)
    
    1. 指定查询字段

      SELECT 字段 FROM 表名; -- 特定字段
      SELECT * FROM 表名; -- 所有
      SELECT 字段 AS 别名 FROM 表名 AS 别名;-- 表和字段的别名
      SELECT CONCAT(字段,字符串) AS 新字段名 FROM 表名; -- 给查询结果添加字符串
      

      语法:SELECT 字段, ... FROM 表名,表内可以通过AS起别名

    2. 去重复

      SELECT DISTINCT 唯一性的字段 FROM 表名; --去重复来查询,去除SELECT语句中查询重复的结果
      
    3. 数据库的列

      SELECT VERSION() -- 查询系统版本 (函数)
      SELECT 100*3-1 AS 计算结果 -- 计算表达式(表达式)
      SELECT @@auto_increment_increment -- 查询自增的步长(变量)
      

      可以获取数据库中的文本值、列、NULL、函数、表达式、系统变量

    4. Where条件字句,用于检索数据中符合条件的值

      逻辑运算符

      运算符 语法 描述
      and && a and b a&&b 逻辑与
      or || a or b a||b 逻辑或
      not ! not a !a 逻辑非
      SELECT 属性 FROM 表名
      WHERE 条件 [逻辑(与或非)] 条件...
      
    1. 模糊查询

      本质是比较运算符

      运算符 语法 描述
      IS NULL * IS NULL 如果*为NULL,返回true
      IS NOT NULL * IS NOT NULL 如果*不为NULL,返回true
      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,a3...里面,结果为真
      -- 模糊查询 between and \ like \ in \ null
      
      -- =============================================
      -- LIKE
      -- =============================================
      -- 查询姓刘的同学的学号及姓名
      -- 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 '%嘉%';
      
      -- 查询姓名中含有特殊字符的需要使用转义符号 '\'
      -- 自定义转义符关键字: ESCAPE ':'
      
      -- =============================================
      -- IN
      -- =============================================
      -- 查询学号为1000,1001,1002的学生姓名
      SELECT studentno,studentname FROM student
      WHERE studentno IN (1000,1001,1002);
      
      -- 查询地址在北京,南京,河南洛阳的学生
      SELECT studentno,studentname,address FROM student
      WHERE address IN ('北京','南京','河南洛阳');
      
      -- =============================================
      -- NULL 空
      -- =============================================
      -- 查询出生日期没有填写的同学
      -- 不能直接写=NULL , 这是代表错误的 , 用 is null
      SELECT studentname FROM student
      WHERE BornDate IS NULL;
      
      -- 查询出生日期填写的同学
      SELECT studentname FROM student
      WHERE BornDate IS NOT NULL;
      
      -- 查询没有写家庭住址的同学(空字符串不等于null)
      SELECT studentname FROM student
      WHERE Address='' OR Address IS NULL;
      
    1. 联表查询JOIN

      sql-join.png
    • 笛卡儿积 join

    • 自然连接 nature join

    • 内连接 inner join

      • 查询两个表中的结果集中的交集
    • 外连接 outer join

    • 左外连接 left join

      • 以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
    • 右外连接 right join

      • 以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充
    • 等值连接和非等值连接

      • 指的是where子句是=连接连个属性还是不等的判断符(如 >)连接两个属性
    • 自连接

      • 自己和自己连接,把一张表拆封为两张表

    SQL JOIN 中 on 与 where 的区别

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

    在使用 left jion 时,onwhere 条件的区别如下:

    1. on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,但是在建立临时表的时候会按照on条件来建立。

    2. where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    1. 分页和排序

    语法 : ORDER BY

    • ORDER BY 语句用于根据指定的列对结果集进行排序。
    • ORDER BY 语句默认按照ASC升序对记录进行排序。
    • 如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
    • 在查询的后面通过ORDER BY 属性获得按照指定属性的查询结果

    语法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
    好处 : (用户体验,网络传输,查询压力)

    推导:

    • 第一页 : limit 0,5(显示0、1、2、3、4的数据)
    • 第二页 : limit 5,5(显示5、6、7、8、9的数据)
    • 第三页 : limit 10,5(显示10、11、12、13、14的数据)
    • ......
    • 第N页 : limit (pageNo-1)*pageSzie,pageSzie
    • [pageNo:页码,pageSize:单页面显示条数]

    (开始索引,页面大小),所以下一页从开始索引+1开始

    SELECT ... FROM ...
    WHERE ...
    ORDER BY 排序的属性 DESC -- 通过指定属性排序
    LIMIT x,y -- LIMIT 起始位置(数据行),页面大小
    
    1. 嵌套子查询

    在子句中添加查询子句,如

    SELECT studentno,studentname FROM student WHERE studentno IN(
       SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
           SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2'
      )
    )
    
    1. MySQL函数

    5.7 文档地址:https://dev.mysql.com/doc/refman/5.6/en/function-reference.html


    -- 数学运算
    
    ABS() -- 绝对值
    CEILING() -- 向上取整
    FLOOR() -- 向下取整
    RAND() -- 返回0-1的随机数
    SIGN() -- 判断一个数的符号,复数-1,整数1
    
    -- 字符串函数
    CHAR_LENGTH(''); /*返回字符串包含的字符数*/
    CONCAT('我','爱','程序');  /*合并字符串,参数可以有多个*/
    INSERT('我爱编程helloworld',1,2,'超级热爱');  /*替换字符串,从某个位置开始替换某个长度*/
    LOWER(''); /*小写*/
    UPPER(''); /*大写*/
    LEFT('hello,world',5);   /*从左边截取*/
    RIGHT('hello,world',5);  /*从右边截取*/
    REPLACE('','','');  /*替换字符串*/
    SUBSTR('',,) /*截取字符串,开始和长度*/
    REVERSE(''); /*反转
    
    -- 查询姓周的同学,改成邹
    -- SELECT REPLACE(studentname,'周','邹') AS 新名字
    -- FROM student WHERE studentname LIKE '周%';
    
    -- 日期和时间函数
    CURRENT_DATE();   /*获取当前日期*/
    CURDATE();   /*获取当前日期*/
    NOW();   /*获取当前日期和时间*/
    LOCALTIME();   /*获取当前日期和时间*/
    SYSDATE();   /*获取当前日期和时间*/
    
    -- 获取年月日,时分秒
    YEAR(NOW());
    MONTH(NOW());
    DAY(NOW());
    HOUR(NOW());
    MINUTE(NOW());
    SECOND(NOW());
    -- 系统信息函数
    VERSION();  /*版本*/
    USER();     /*用户*/
    
    1. 聚合函数

    通过结合GOURP BY,从而获取按照分组之后的函数结果

    函数名称 描述
    COUNT() 返回满足Select条件的记录总和数,如 select count(*) 【不建议使用 *,效率低】
    SUM() 返回数字字段或表达式列作统计,返回一列的总和。
    AVG() 通常为数值字段或表达列作统计,返回一列的平均值
    MAX() 可以为数值字段,字符字段或表达式列作统计,返回最大的值。
    MIN() 可以为数值字段,字符字段或表达式列作统计,返回最小的值。

    GROUP BY

    分组,分组后的聚集函数结果只有一个值

    GROUP BY 分组依据字段
    

    Having

    过滤分组后的数据

    HAVING 条件
    

    count()

    从含义上讲,count(1)count(*) 都表示对全部数据行的查询。
    count(字段)会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。
    count(*) 包括了所有的列,相当于行数,在统计结果的时候,包含字段为null 的记录;
    count(1) 用1代表代码行,在统计结果的时候,包含字段为null 的记录 。

    很多人认为count(1)执行的效率会比count(*)高,原因是count(*)会存在全表扫描,而count(1)可以针对一个字段进行查询。其实不然,count(1)count(*)都会对全表进行扫描,统计所有记录的条数,包括那些为null的记录,因此,它们的效率可以说是相差无几。而count(字段)则与前两者不同,它会统计该字段不为null的记录条数。

    下面它们之间的一些对比:

    1)在表没有主键时,count(1)count(*)
    2)有主键时,主键作为计算条件,count(主键)效率最高;
    3)若表格只有一个字段,则count(*)效率较高。

    1. 数据库加密

    MD5简介

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

    md5() -- md5函数,返回一个md5加密后的字符串
    

    相关文章

      网友评论

          本文标题:DQL查询数据

          本文链接:https://www.haomeiwen.com/subject/rrozdktx.html