文章目录
三表联查
先用双表联查查出来的数据,把它当成一个表,然后第三张表再联查这个表。相当于做了两次双表联查。
示例:
查询A公司的所有30岁以下员工的名字
employee_id company_id
1 101
2 101
3 102
company_id company_name
101 A
102 B
employee_id employee_name employee_age
1 李云 35
2 张飞 23
3 高丽 25
SELECT employee_name
FROM (table3 c LEFT JOIN TABLE1 a
ON c.employee_id=a.employee_id ) as a
LEFT JOIN table2 b ON b.company_id=a.company_id
WHERE company_name ='A' and employee_age<30;
select d1.id,e.name,e.sex,d2.dname
from employees e left join de d1 on e.id = d1.eid
left join department d2 on d2.id = d1.did
SQL的等于符号是 ‘=’ (不是’==’,和java不一样)
select 之后,对字段的大小做判断可以使用’>=‘大于等于号和’<='小于等于号
积分表里面出现三次以及三次以上的积分
group by number having count(number) >= 3
倒序,正序
order by 字段名 desc //倒序
order by 字段名 asc //正序
排序的字段有多个 SQL37 查找后多列排序
order by 字段名1 desc(或asc), 字段名2 desc(或asc)
Limit的用法
LIMIT [参数1]--m,参数2--n;
#表示从跳过m条数据开始取n行数据
#参数1为可选参数,表示跳过m条数据(默认为0),eg:1表示从第二行开始
#参数2为必选参数,表示取几行数据
eg1:
SELECT * FROM table LIMIT 5; //检索前 5 个记录行
等价于
SELECT * FROM table LIMIT 0,5; //检索前 5 个记录行
eg2:
SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
#为了检索某行开始到最后的所有数据,可以设置第二个参数为-1
eg3:
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last
LIMIT 参数1--m OFFSET 参数2--n
#表示跳过n个数据,取m个数据
#参数1表示读取m条数据
#参数2表示跳过n个数据
eg4:
SELECT * FROM table LIMIT 2 OFFSET 1; //跳过1条数据读取2条数据,即读取2-3条数据
LIMIT m,n //表示从第m+1条开始,取n条记录;
LIMIT n // 表示从第0条开始,取n条记录,是limit(0,n)的缩写。
//分页查询。其中start是页码,pageSize是每页显示的条数。
select * from table limit (start-1)*pageSize,pageSize
排序之后才能分页查询,寻找第N条记录
IN、NOT IN、Exists、Not Exists
IN 的意思是只要字段的值等于括号内任意一个元素,条件便成立。
NOT IN 的意思是只要字段的值不等于括号内任意一个元素,条件便成立。
Exists、Not Exists的作用与IN、NOT IN一样,不过IN、NOT IN不能使用索引,如果括号内的元素数量很大,IN、NOT IN执行时间会很长,效率很低。
因此,如果括号内元素数量很多,使用Exists、Not Exists;
如果括号内元素数量很少,使用 IN、NOT IN;
不等于 空值判断
SQL中不等于有两种表达方式:’!=’,’<>’
此时要注意两个会将字段为null的数据也当做满足不等于的条件而将数据筛选掉。
!= ‘1’ :不会取空值
<> ‘1’ :不会取空值
判断字段是否为空只能使用:‘is null’,‘is not null’
字段为空:使用 is null
字段不为空:使用 is not null
count sum
count()是求某一字段有多少条记录,字段为空记为0
count() //使用count()函数,要事先分组,不然求得和不知道是谁的。
count()配合distinct也可以求字段不重复的个数
count(distinct device_id) #求不重复的用户数量
sum()是求某一数值字段的总和
也可以使用sum计算字段满足某一条件的个数,如SQL35 浙大不同难度题目的正确率
sum(case when result = 'right' then 1 else 0 end)
单引号 双引号 字符串
在标准 SQL 中,字符串使用的是单引号。
但在其它的数据库中可能存在对 SQL 的扩展,比如在 MySQL 中允许使用单引号和双引号两种。
WHERE 与 HAVING
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
group by的作用是限定分组条件,而having则是对group by中分出来的组进行条件筛选。
https://www.runoob.com/sql/sql-groupby.html
- WHERE作用于表中实际存在的列,HAVING作用于虚拟列或者子查询的列
- WHERE可以和HAVING同时存在。
- GROUP BY的作用是限定分组条件,而HAVING则是对GROUP BY中分出来的组进行条件筛选。
- WHERE子句的作用是在对查询结果进行分组前,将不符合WHERE条件的行去掉,即在分组之前过滤数据
- HAVING子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数(HAVING子句是聚组函数唯一出现的地方)
- 使用count(列名)当某列出现null值的时候,count(*)仍然会计算,但是count(列名)不会。
当一个查询语句同时出现了WHERE,GROUP BY,HAVING,ORDER BY的时候,执行顺序和编写顺序是:
- 过滤 执行WHERExx对全表数据做筛选,返回第1个结果集。
- 分组 针对第1个结果集使用group by分组,返回第2个结果集。
- 查询 针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。
- 过滤 针对第3个结集执行HAVINGxx进行筛选,返回第4个结果集。
- 排序 针对第4个结果集排序。
查询类容也可以做运算
eg:查找员工编号emp_no为10001其自入职以来的薪水salary涨幅growth
select (max(salary) - min(salary)) as growth
from salaries
where emp_no = 10001
批量插入
INSERT INTO TableName
VALUES(value1, value2, ...), (value1, value2, ...),
...(value1, value2, ...)
replace
replace into student (id, name, sex, email, fenshu, tecid, class) values
('2', 'lisi', '*F', '[email protected]', '80', '2', '1');
- replace语句会删除原有的一条记录, 并且插入一条新的记录来替换原记录
- 一般用replace语句替换一条记录的所有列, 如果在replace语句中没有指定某列, 在replace之后这列的值被置空
- replace根据主键确定被替换的是哪一条记录
- replace语句不能根据where子句来定位要被替换的记录
- 如果执行replace语句时, 不存在要替换的记录, 那么就会插入一条新的记录
- 如果新插入的或替换的记录中, 有字段和表中的其他记录冲突, 那么会删除那条其他记录
三目运算
select
case 字段名
when 判断条件1 then 结果1
when 判断条件2 then 结果2
else 结果3
end
from table_name where 筛选条件
判断查询
select
if(判断条件,判断条件为true的结果,判断条件为false的结果) as 别名
where 筛选条件
模糊查询
Like
%是通配符
#查找以k结尾的名字
where name Like '%k'
#查找包含k的名字
where name Like '%k%'
#查找不包含k的名字
where name Not Like '%k%'
group by 多个字段
会
having语句中是可以使用聚合函数的
group by 字段
group by后面的字段,除了可以是表原有的字段,还可以是select后面用函数处理过的字段,如下
Select
if(age>=25,'25岁以及上','25岁以下' ) as age_cut,
count(device_id) as number
From user_profile
Group by age_cut
裁剪字符串
- LOCATE(substr , str ):返回子串 substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,则返回0;
- POSITION(substr IN str ):返回子串 substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,与LOCATE函数作用相同;
- LEFT(str, length):从左边开始截取str,length是截取的长度;
- RIGHT(str, length):从右边开始截取str,length是截取的长度;
- SUBSTRING_INDEX(str ,substr ,n):返回字符substr在str中第n次出现位置之前的字符串;
- SUBSTRING(str ,n ,m):返回字符串str从第n个字符截取到第m个字符;
- SUBSTRING(str ,n):截取字符串str从第n个字符到最后一个字符;
- REPLACE(str, s1, s2):将字符串str中的字符串s1替换成字符串s2;
- LENGTH(str):计算字符串str的长度。