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加密后的字符串
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355