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 开始数据的所在行,页面行数 -- 业务层面:查询(跨表,跨数据库)
-
指定查询字段
SELECT 字段 FROM 表名; -- 特定字段 SELECT * FROM 表名; -- 所有 SELECT 字段 AS 别名 FROM 表名 AS 别名;-- 表和字段的别名 SELECT CONCAT(字段,字符串) AS 新字段名 FROM 表名; -- 给查询结果添加字符串
语法:
SELECT 字段, ... FROM 表名
,表内可以通过AS
起别名 -
去重复
SELECT DISTINCT 唯一性的字段 FROM 表名; --去重复来查询,去除SELECT语句中查询重复的结果
-
数据库的列
SELECT VERSION() -- 查询系统版本 (函数) SELECT 100*3-1 AS 计算结果 -- 计算表达式(表达式) SELECT @@auto_increment_increment -- 查询自增的步长(变量)
可以获取数据库中的文本值、列、NULL、函数、表达式、系统变量
-
Where
条件字句,用于检索数据中符合条件的值逻辑运算符
运算符 语法 描述 and && a and b a&&b 逻辑与 or || a or b a||b 逻辑或 not ! not a !a 逻辑非 SELECT 属性 FROM 表名 WHERE 条件 [逻辑(与或非)] 条件...
-
模糊查询
本质是比较运算符
运算符 语法 描述 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;
-
联表查询
sql-join.pngJOIN
笛卡儿积 join
自然连接 nature join
内连接 inner join
- 查询两个表中的结果集中的交集
外连接 outer join
左外连接 left join
- 以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
右外连接 right join
- 以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充
等值连接和非等值连接
- 指的是where子句是=连接连个属性还是不等的判断符(如 >)连接两个属性
自连接
- 自己和自己连接,把一张表拆封为两张表
SQL JOIN 中 on 与 where 的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用 left jion 时,on 和 where 条件的区别如下:
on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,但是在建立临时表的时候会按照on条件来建立。
where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
- 分页和排序
语法 : 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 起始位置(数据行),页面大小
- 嵌套子查询
在子句中添加查询子句,如
SELECT studentno,studentname FROM student WHERE studentno IN( SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=( SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2' ) )
- 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(); /*用户*/
- 聚合函数
通过结合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(*)
效率较高。
- 数据库加密
MD5简介
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
md5() -- md5函数,返回一个md5加密后的字符串