目录
一.模糊查询
查询列名中含字符a的数据:
SELECT *
FROM 表名
WHERE 列名 LIKE '%a%';
查询列名中开头字符为a的数据:
SELECT *
FROM 表名
WHERE 列名 LIKE 'a%';
查询a 在前 e在后的数据:
SELECT *
FROM 表名
WHERE 列名 LIKE '%a%e%';
查询含a和e的数据 :
SELECT *
FROM 表名
WHERE 列名 LIKE '%a%e%' OR 列名 LIKE '%e%a%';
查询第二个字符为a的数据:
SELECT *
FROM 表名
WHERE 列名 LIKE '_a%';
类推: '__a'为第三个字符为a
查询第二个字符为 _ 第三个字符为a的数据:
SELECT *
FROM 表名
WHERE 列名 LIKE '_\_a%';
\ 是转义字符 , \后的符号进行转义,如不转义,查询的是第三个字符为 a 的数据
二.过滤查询
SELECT *
FROM 表名
WHERE 过滤条件;
显示出符合过滤条件的数据
筛选出内容为null的数据
SELECT * FROM employess WHERE id <=> NULL;
//IS NULL 相当于 <=> NULL (IS NOT NULL)
范围查询
BETWEEN ... AND ... 相当于 a>=.. && ..<=a
NOT BETWEEN ... AND ... 相当于 a<=.. && a>=..
where 语句后可添加order by语句
order by ... ; 升序
order by ... asc; 升序
order by ... desc; 降序
order by A desc , B ; A降序,B升序
order by A , B desc; B降序,A升序
三.运算符查询
1.加减乘除
除法:/ 或 DIV
取模:% 或 mod
涉及到字符的运算时,'1'会隐式转换为1 'a'会转换为0做运算处理
其中除法的所有结果默认为小数形式
分母为零,结果为null
取模运算如果涉及负数,其结果按照被取模数的正负号来取
任何运算涉及null结果均为null
2.等号
0 != 'a' , 1 = '1' , 'a' != 'b', 'ab' = 'ab'
做等号运算时字母和0不相等,数字字符可以通过隐式转换为数字
当两边都为等号是字母时,按照ANSI比较
涉及null结果均为null
null = null 结果为0
应用:SELECT * FROM employess WHERE id = NULL;
本意是想显示出id列为null的行
但是id = NULL 本身结果为null 所有不会有任何结果
安全等于 <=> 主要用途 NULL <=> NULL 结果为1
所以要将上述示例改为SELECT * FROM employess WHERE id <=> NULL;
不等号 <> 和 !=
3.关键字运算
此方法多用于
SELECT *
FROM 表名
WHERE 过滤条件;
的过滤条件中
IS NULL 相当于 <=> NULL (IS NOT NULL)
LEAST(value1,value2,...) 返回最小值
有多个字符时从左到右比较单个字符大小,
以比较的单个字符大小为准,显示出小的值
GREATEST(value1,value2,...) 返回最大值
有多个字符时同理
BETWEEN ... AND ... 相当于 a>=.. && ..<=a
NOT BETWEEN ... AND ... 相当于 a<=.. && a>=..
a=10 OR a=20 OR a=30 相当于a IN(10,20,30) , a NOT IN(10,20,30)同理
4.逻辑运算符
NOT 或 ! | 非 |
AND 或 && | 与 |
OR 或 || | 或 |
XOR | 异或(两侧条件分别只有一个为真时满足) |
5.位运算符
按照二进制数位 进行的逻辑运算,满足逻辑按位取1,否则取0
四.基本运算
1.acount() 运算
求满足条件的元组个数,可以对任意数据类型的数据使用
SELECT COUNT(*)
FROM Student
WHERE SEX = 'man';
#求男生人数
2.sum() 运算
求满足条件列的数字之和,对数值型数据使用
select sum(core)
from student
where class = 4;
#求4班所有学生的分数之和
3.avg() 运算
求满足条件列的数字平均值,对数值型数据使用
select avg(core)
from student
where class = 4 and core >= 60;
#求四班成绩及格学生的平均分
4.max() 和 min() 运算
求满足条件列的最大最小元组,可以对任意数据类型的数据使用
5. 基本运算方法的内运算
CASE WHEN <条件运算> THEN <表达式A> ELSE <表达式B> END
#满足条件返回A否则返回B
例如sum(CASE WHEN score >= 60 THEN score ELSE 0 END)
在sum运算中成绩没有达到60的返回0,即不算,达到60的计入sum运算
五.分组查询
将所有元组按条件分成特定组,并进行运算
select count(id),avg(score),max(score),min(score)
from students
group by classID;
#按照每个班分组
#分别显示每个班人数,平均分,最高分,最低分
使用多个组:
group by classID,groupID;
在每个班分组的基础上按小组分类
注:GROUP BY中使用WITH ROLLUP
使用 WITH ROLLUP 关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。不能和升序降序同时使用。
GROUP BY department_id WITH ROLLUP;
HAVING
- 行已经被分组。
- 使用了聚合函数。
- 满足HAVING 子句中条件的分组将被显示。
- HAVING 不能单独使用,必须要跟 GROUP BY 一起使用。
例
select count(core) as 课程数
where core>=90
group by StudentID
having count(core)>3;
#求出3门科目分数在90分以上的学生
六.多表查询
1. INNER JOIN(内连接)
INNER JOIN 返回符合连接条件的行,即两个表之间的交集。语法如下:
SELECT columns
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;
#inner 可以省略
2. LEFT JOIN(左连接)
LEFT JOIN 返回左表的所有行,以及与右表匹配的行。如果右表中没有匹配项,则返回 NULL。语法如下:
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;
3. RIGHT JOIN(右连接)
RIGHT JOIN 与 LEFT JOIN 相反,返回右表的所有行,以及与左表匹配的行。如果左表中没有匹配项,则返回 NULL。语法如下:
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;
4. FULL JOIN(全连接)
FULL JOIN 返回左右两个表的所有行,如果某个表中没有匹配项,则返回 NULL。语法如下:
SELECT columns
FROM table1
FULL JOIN table2 ON table1.column_name = table2.column_name;
七.嵌套查询
SQL嵌套查询是指在一个SQL查询的WHERE子句或FROM子句中包含另一个完整的SQL查询。嵌套查询也被称为内部查询或子查询。
嵌套查询通常用于在一个查询中使用另一个查询的结果来进一步过滤数据或进行比较。
例
SELECT COUNT(*)
FROM orders
WHERE customer_id IN (SELECT customer_id FROM customers WHERE country = 'CHINA');
#在所有订单中查询订单地区在中国的订单数量