MySQL数据库基础查询语句笔记



普通查询

  • 最基本的查询语句是由 CELECT 和 FROM 关键字组成的
查询语句

*:代表所有字段的意思

  • SELECT 语句屏蔽了物理层的操作,用户不比关心数据的真是存储,交由数据库高效的查询数据
  • 通常情况下,SELECT子句中使用了表达式,name这列的名字就默认为表达式,因此需要一中对列明重命名的机制
SELECT
    empno,
    sal*12 AS "income"
FROM t_emp;

查询语句的子句执行顺序

执行顺序

数据分页

比如我们查看朋友圈,只会加载少量部分信息,不会一次性加载全部朋友圈,那样只会浪费CPU时间、内存和网络带宽

如果结果集的记录很多,则可以使用LIMIT关键字限定结果集数量。

数据分页

简写用法

如果LIMIT子句只有一个参数,他表示的是偏移量,起始值默认为0

SELECT empno,ename FROM T_emp LIMIT 10;
# 等价于
SELECT empno,ename FROM T_emp LIMIT 0,10;

执行顺序:FROM -> SELECT -> LIMIT

结果排序

如果没有设置,查询语句不会对结果集进行排序。也就是说,如果想让结果集按照某种顺序排列,就必须使用 ORDER BY子句。

SELECT ...... FROM ...... ORDER BY 列名 [ASC | DESC]; #升序加ASC,降序加DESC
SELECT empno,ename,sal,deptno FROM t_emp ORDER BY sal;#升序
SELECT empno,ename,sal,deptno FROM t_emp ORDER BY sal DESC;#降序

ASC代表升序(默认),DESC代表降序。

升序:按从小到大的顺序排列 (如1、3、5、6、7、9)。 降序:就是按从大到小的顺序排列 (如9、8、6、4、3、1)。

如果排序列的是数字类型,数据库就按照数字大小排序,如果是日期类型,就按照日期大小排序,如果是字符串就按照字符串集序号排序。

排序+分页

ORDER BY子句书写的时候放在LIMIT子句的前面

FROM -> SELECT -> ORDER BY -> LIMIT

去除重复记录

如果我们需要去除重复的数据,可以使用DISTINCT关键字来实现

DISTINCT修饰的不是列名,而是SELECT,即可以连起来看作一个整体SELECT DISTINCT,跟普通的SELECT相比,表明这种查询会执行去重。因此,看起来像是“必须放在第一个字段前面”,实际上它跟字段没关系,是跟SELECT有关系。

重复,指的是结果集中的两行每一列的值都完全一样。如果存在任何一列值不一样,都不算重复。因此,重复不是只看一个列,而是要看一行的所有列。

当SELECT DISTINCT后面跟多个字段时,同样也会做去重(按上面说的重复的定义来判断)。只不过视频中的数据在同时选择job和ename时,没有job和ename都相同的行,所以看起来像是没有做去重,像是“去重失效了”,实际上并没有失效,只是确实没有重复而已。

SELECT DISTINCT 字段 FROM ......;
SELECT DISTINCT job FROM t_emp;

注意事项

使用DISTINCT的SELECT子句中只能查询一列数据,如果查询多列,去除重复记录就会失效。

DISTINCT关键字只能在SELECT子句中使用一次

条件查询 I

很多时候,用户感兴趣的并不是逻辑表里的全部记录,而是他们当中能够满足一种或某几种条件的记录。这类条件要用WHERE子句来实现数据的筛选

SELECT DISTINCT 字段 FROM ... WHERE 条件 [AND | OR] 条件 ...; 
#假设每个条件都需要满足,在每个条件之间添加AND。假设这些条件只需要满足一个,在每个条件之间添加OR
SELECT DISTINCT empno,ename,sal FROM t_emp WHERE deptno=10 AND sal >= 2000;
#想查询10部门里边底薪超过2000的员工

四类运算符

WHERE语句中的条件运算会用到一下四种运算符:

运算符

算数运算符

算数运算符

MySQL ifnull()函数 - MySQL教程™ (yiibai.com)

IFNULL(null,0)把null转换成0

不管什么值与null值进行预算结果都是null,可以用 IFNULL(null,0) 来解决

SELECT empno,sal,ename,hiredate
FROM t_emp
WHERE deptno=10 AND (sal+IFNULL(comm,0))*12>=15000
AND DATEDIFF(NOW(),hiredate)/365>=20;

DATEDIFF(第一个日期,第二个日期)可以返回第一个日期减去第二个日期的天数

NOW()获取当前日期和时间

比较运算符

比较运算符

MySQL IN运算符简介. IN 运算符允许你确定一个指定的值在一组值匹配的任何值或 子查询

SELECT
    deptno,empno,sal,hiredate
FROM t_emp
WHERE deptno IN(10,20,30) AND job!="SALLESMAN" AND hiredate<"1985-01-01";
比较运算符1
SELECT 
    ename,comm,sal
FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 2000 and 3000
AND ename LIKE "_LAKE";

正则表达式的运算符

SELECT 
    ename,comm,sal
FROM t_emp WHERE comm IS NOT NULL
AND sal BETWEEN 1000 and 3000
AND ename REGEXP"^[\\u4e00-\\u9fa5]{2,4}$";
# ^代表字符串的开头$代表字符串的结尾,

条件查询 II

逻辑运算符

逻辑运算符

二进制运算符

二进制运算的实质是将参与运算的两个操作数,按对应的二进制诸位进行逻辑运算

按位运算符

按位运算符

WHERE子句的注意事项

WHERE子句中,条件执行的顺序是从左到右。所以应该把索引条件,或者筛选掉记录最多的条件写在做左侧

SELECT empno,ename FROM t_emp
WHERE ename = "FORD" AND sal >= 2000;
#-------------------------------------
SELECT empno,ename FROM t_emp
WHERE deptno = 10 AND sal >= 2000;

各种子句的执行顺序

FROM –> WHERE -> SELECT -> ORDER BY -> LIMIT

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片