SQL基础操作总结

三表联查

先用双表联查查出来的数据,把它当成一个表,然后第三张表再联查这个表。相当于做了两次双表联查。
示例:
查询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条记录

参考:MySQL中使用LIMIT进行分页的方法

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的时候,执行顺序和编写顺序是:

  1. 过滤 执行WHERExx对全表数据做筛选,返回第1个结果集。
  2. 分组 针对第1个结果集使用group by分组,返回第2个结果集。
  3. 查询 针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。
  4. 过滤 针对第3个结集执行HAVINGxx进行筛选,返回第4个结果集。
  5. 排序 针对第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');
  1. replace语句会删除原有的一条记录, 并且插入一条新的记录来替换原记录
  2. 一般用replace语句替换一条记录的所有列, 如果在replace语句中没有指定某列, 在replace之后这列的值被置空
  3. replace根据主键确定被替换的是哪一条记录
  4. replace语句不能根据where子句来定位要被替换的记录
  5. 如果执行replace语句时, 不存在要替换的记录, 那么就会插入一条新的记录
  6. 如果新插入的或替换的记录中, 有字段和表中的其他记录冲突, 那么会删除那条其他记录

三目运算

SQL27 查看不同年龄段的用户明细

select 
	case 字段名 
		when 判断条件1 then 结果1 
		when 判断条件2 then 结果2 
		else 结果3  
	end
from table_name where  筛选条件

判断查询

计算25岁以上和以下的用户数量

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

裁剪字符串

  1. LOCATE(substr , str ):返回子串 substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,则返回0;
  2. POSITION(substr IN str ):返回子串 substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,与LOCATE函数作用相同;
  3. LEFT(str, length):从左边开始截取str,length是截取的长度;
  4. RIGHT(str, length):从右边开始截取str,length是截取的长度;
  5. SUBSTRING_INDEX(str ,substr ,n):返回字符substr在str中第n次出现位置之前的字符串;
  6. SUBSTRING(str ,n ,m):返回字符串str从第n个字符截取到第m个字符;
  7. SUBSTRING(str ,n):截取字符串str从第n个字符到最后一个字符;
  8. REPLACE(str, s1, s2):将字符串str中的字符串s1替换成字符串s2;
  9. LENGTH(str):计算字符串str的长度。

Guess you like

Origin blog.csdn.net/weixin_43260719/article/details/109015997