DQL查询数据

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查询数据)