数据库——DQL单表查询
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;
注意:
- =和NULL不可一起使用
=为比较运算符,不可以与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;
注意:
- 当AND和OR一起使用
AND的优先级比OR要高。

--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;


浙公网安备 33010602011771号