DQL单表查询
id | name | gender | age | score |
---|---|---|---|---|
111111 | 刘一 | 女 | 20 | NULL |
186222 | 陈二 | 男 | 30 | 90 |
275933 | 张三 | 女 | 24 | 92 |
266055 | 李十四 | 男 | 20 | 92 |
134444 | 王五 | 女 | 18 | 92 |
225573 | 赵十六 | 男 | 22 | 94 |
一、简单查询(SELECT...FROM...)
1.查询所有字段(*)
--SELECT * FROM 表名;
SELECT * FROM class1;--SELECT 表中所有的字段 FROM 表名;
SELECT id,name,gender,age,score FROM class1;
2.查询指定字段
--SELECT 字段1,字段2... FROM 表名;
SELECT name,id FROM class1;
3.查询去重数据(DISTINCT)
--当关键字DISTINCT应用于一个字段,该关键字会对表中相同成绩的同学进行除去
--SELECT DISTINCT 字段 FROM 表名;
SELECT DISTINCT score FROM class1;
--当关键字DISTINCT应用于多个字段,该关键字会对表中性别和成绩都相同的同学进行除去
--SELECT 字段1,字段2... FROM 表名;
SELECT DISTINCT gender,score FROM class1;
二、条件查询(SELECT * FROM ... WHERE... 运算符...)
1.带比较运算符的查询
--SELECT * FROM 表名 WHERE 字段 IS NULL;
SELECT * FROM class1 WHERE score IS NULL;
--SELECT * FROM 表名 WHERE 字段 LIKE '_ _ _';
--找到name是三个字的数据
SELECT * FROM class1 WHERE name LIKE '___';--#SELECT * FROM 表名 WHERE 字段 LIKE '1%';
--找到id是1开头的数据
SELECT * FROM class1 WHERE id LIKE '1%';
--SELECT * FROM 表名 WHERE 字段 BETWEEN 值 AND 值;
--找到年龄18-22的数据(包含18和22)
SELECT * FROM class1 WHERE age BETWEEN 18 AND 22;
--SELECT * FROM 表名 WHERE 字段 IN(20,30);
--找到年龄20和30的数据
SELECT * FROM class1 WHERE age IN(20,30);
--SELECT * FROM 表名 WHERE 字段 = 值;(其他运算符类似)
--若值为字符串则需要用''对数据进行包裹
SELECT * FROM class1 WHERE name = '刘一';
SELECT * FROM class1 WHERE age = 20;
SELECT * FROM class1 WHERE age < 20;
SELECT * FROM class1 WHERE age <= 20;
SELECT * FROM class1 WHERE age => 20;
SELECT * FROM class1 WHERE age <> 20;
SELECT * FROM class1 WHERE age != 20;
注意:
- <>和 != 的区别
<>和!=都用来比较操作数是否不相等,<>运算符适用于所有的数据类型,!=不适用于BLOB和TEXT数据类型。
NULL不能使用二者进行比较。
- 字符 % 和 _ 的转义
当通配符在字符串中有特殊含义的时候用到\进行转义。
2.带逻辑运算符的查询
--SELECT * FROM 表名 WHERE 字段 表达式1 AND(&&) 表达式2;
--找到年龄20和id为4的数据
SELECT * FROM class1 WHERE age = 20 AND id =111111;
SELECT * FROM class1 WHERE age = 20 && id =111111;
--SELECT * FROM 表名 WHERE 字段 表达式1 OR(||) 表达式2;
--找到年龄20,id为4的数据
SELECT * FROM class1 WHERE age = 20 OR id =111111;
SELECT * FROM class1 WHERE age = 20 || id =111111;
--SELECT * FROM 表名 WHERE 字段 NOT IN(20,30);
--找到年龄不是20和30的数据
SELECT * FROM class1 WHERE age NOT IN(20,30);--找到年龄不是20的数据
SELECT * FROM class1 WHERE age !=20;
三、聚合查询(SELECT 函数(...) FROM ...)
1.COUNT函数
--SELECT COUNT(*) FROM 表名,使用该语句会计算为NULL的语句
--查询表中的总行数
SELECT COUNT(*) FROM class1;--SELECT COUNT(字段) FROM 表名,使用该语句不会计算为NULL的语句
--查询score除了NULL的行数
SELECT COUNT(score) FROM class1;
2.SUM函数
--SELECT SUM(字段) FROM 表名,使用该语句不会计算为NULL的语句
--字段中值的总和
SELECT SUM(score) FROM class1;
3.AVG函数
--SELECT AVG(字段) FROM 表名,使用该语句不会计算为NULL的语句
--字段中值的平均数
SELECT AVG(score) FROM class1;
4.MAX函数
--SELECT MAX(字段) FROM 表名
--字段中值的最大值
SELECT MAX(age) FROM class1;
5.MIN函数
--SELECT MIN(字段) FROM 表名
--字段中值的最大值
SELECT MIN(age) FROM class1;
四、分组查询(SELECT ... FROM ...GROUP BY...)
1.单独使用
--SELECT 字段 FROM 表名 GROUP BY 字段
SELECT age FROM class1 GROUP BY age;
2.与聚合函数一起使用
--SELECT 字段1,函数1(字段2),函数2(字段3) FROM 表名 GROUP BY 字段
SELECT age,AVG(score),SUM(age) FROM class1 GROUP BY age;
3.与HAVING关键字一起使用
--SELECT 字段1,函数1(字段2) FROM 表名 GROUP BY 字段 HAVING表达式
SELECT age,SUM(age) FROM class1 GROUP BY age HAVING SUM(age)<30;
注意:当使用 GROUP BY时 WHERE 和 HAVING的区别
WHERE是在GROUP BY分组之前进行的条件判断,HAVING是在GROUP BY分组之后进行的。
SELECT age,AVG(score) FROM class1 WHERE age<24 GROUP BY age;
SELECT age,AVG(score)FROM class1 WHERE age<24 GROUP BY age HAVING AVG(score)=92;
五、排序查询(SELECT ... FROM ...ORDER BY...)
1.ASC(默认)
--SELECT 字段 FROM 表名 ORDER BY 字段 [参数];
SELECT score FROM class1 ORDER BY score ;
SELECT score FROM class1 ORDER BY score ASC;--SELECT 字段1,字段2 FROM 表名 ORDER BY 字段1 [参数],字段2 [参数];
SELECT score,age FROM class1 ORDER BY score,age;
SELECT score,age FROM class1 ORDER BY score ASC,age ASC;
2.DESC
--SELECT 字段 FROM 表名 ORDER BY 字段 [参数];
SELECT score FROM class1 ORDER BY score DESC;
六、限量查询(SELECT * FROM ... LIMIT...)
--SELECT * FROM 表名 LIMIT [OFFSET偏移量],每一页多少条记录;
SELECT * FROM class1 LIMIT 2;
SELECT * FROM class1 LIMIT 0,2;
SELECT * FROM class1 LIMIT 2,2;
SELECT * FROM class1 LIMIT 4,2;
七、内置查询(SELECT 函数(...) FROM ...)
1.数学函数
2.字符串函数
3.CONCAT函数
--SELECT CONCAT(字段1,连接符,字段2) FROM 表名,若连接符为字符,需要用''将连接符进行一个包裹。
#对输入的字段进行连接
SELECT CONCAT(name,666,score,666,id) FROM class1;
SELECT CONCAT(name,'_',score,'_',id) FROM class1;
4.IF()函数
--SELECT 字段1,IF(表达式,返回值1,返回值2) FROM 表名,类似于三目表达式,表达式成立返回返回值1,不成立返回返回值2。
SELECT name,IF(ISNULL(score),'缺考',score) FROM class1;
八、设置别名(AS)
1.为数据表取别名
--SELECT * FROM 表名 [AS] '别名';
SELECT * FROM class1 c1;
SELECT * FROM class1 AS c1;#使用别名的方法
SELECT * FROM class1 c1 WHERE cl.score = 92;
2.为字段取别名
--SELECT 字段1 [AS] 别名,字段2[AS] FROM 表名;
SELECT name '名字' FROM class1;
SELECT name AS '名字' FROM class1;SELECT id '学号',name'名字',gender '性别',age '年龄',score '成绩' FROM class1;