not in不是目标范围中的一个
例如:183. 从不订购的客户 - 力扣(LeetCode) (leetcode-cn.com)
select name as 'Customers' from customers
where customers.id not in (select customerid from orders)
查询的结果中有自己创建的列,bonus不存在于原表中
if的用法
select employee_id,if(employee_id%2!=0 or name like 'M%',0,salary) bonus from employees
case when then else end 的用法
case 指定列 when后面跟条件,如果满足则执行then,否则执行else,end给结果重命名
select employee_id,
case
when(employee_id%2!=0 and left(name,1)!='M')
then salary
else 0
end bonus
from Employees
变更性别
UPDATE salary set sex=case sex when 'm' then 'f' else 'm' end
Truncate table xxx
清除表中的数据
自连接删除重复的电子邮箱
DELETE p1 FROM Person p1,Person p2 WHERE p1.Email = p2.Email and p1.id>p2.id;
CONCAT(str1,str2):连接两个字符串
UPPer(str):将字符串变为大写,LOWER(str):将字符串变为小写
COUNT():记录次数
DISTINCT:去重,返回不重复的值
group_concat:
将group by产生的同一个分组中的值连接起来,返回一个字符串结果。group_concat函数首先根据group by指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔。
ORDER BY一般配合group by使用对分组进行排序,默认升序
group by一般配合having使用,增加分组时的条件
UNION 操作符
用于合并两个或多个 SELECT 语句的结果集。UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
横表转竖表用UNION ALL,竖表转横表用CASE WHEN
IF语句
IF(expr1,expr2,expr3)如果1为真执行2,假执行3
IFNULL(expr1,expr2)
查询第n高的薪水
176. 第二高的薪水 - 力扣(LeetCode) (leetcode-cn.com)
imit n子句表示查询结果返回前n条数据,offset n表示跳过x条语句
首先将薪水逆序排列,使用offset跳过前n-1条数据就是第n高的,再使用imit返回前n条子句
考虑到重复问题需要用distinct去重
CROSS JOIN:交叉连接
用于从两个或者多个连接表中返回记录集的笛卡尔积,即将左表的每一行与右表的每一行合并。
on增加限制条件
DATEDIFF()
DATEDIFF() 函数返回两个日期之间的时间。
如果日期1比日期2小返回1,否则返回-1
BETWEEN
expr [NOT] BETWEEN begin_expr AND end_expr;
expr
, begin_expr
和 end_expr
必须具有相同的数据类型。
BETWEEN
操作如果的值返回真 expr
大于或等于(> =)的值 begin_expr
,且小于或等于的(<=)的值 end_expr
,否则它返回零。
使用顺序
where>group by>having>order by
count(*)
查询select结果集中的数量
如果是:select count(*) from xxx则查询的是该表中有多少条记录
如果是:select actor_id,director_id
from actordirector
GROUP BY actor_id,director_id
HAVING count(*)>=3
查询的是actor_id和director_id中记录数大于3条的数据
如果结果集根据group by进行分组了,count就是每个组内的数量
least和greatest
least(exp1,exp2)取两个中的较小值
greatest(exp1,exp2)取;两个中的较大值
DATE_FORMAT()
用于以不同的格式显示日期/时间数据。
DATE_FORMAT(NOW(),'%m-%d-%Y')月,日,年
ROUND()
Round函数返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果。除数值外,也可对日期进行舍入运算。
round(3.14,1)取3.14小数点后一位
查找不重复的数字
select num from my_numbers group by num having count(*) = 1 order by num desc
将相同的数字进行分组,统计次数为1的(不重复的),降序排序
窗口函数
1.rank() : 阶梯排序-前两个是并列的1,接下来就是第3名
2.dense_rank(): 连续排序-前两个是并列的1,接下来就是第2名
3.row_number(): 不会出现重复的排序
<窗口函数> over (partition by <分组列名> order by <排序列名>)
例如:
rank() over (partition by student_id order by grade desc, course_id asc ) as ranking
using
等价于join操作中的on
on a.id=b.id等价于using(id)
双链接
1440. 计算布尔表达式的值 - 力扣(LeetCode) (leetcode-cn.com)
select e.left_operand, e.operator, e.right_operand,
CASE e.operator
WHEN '>' THEN IF(v1.value>v2.value,'true','false')
WHEN '<' THEN IF(v1.value<v2.value,'true','false')
ELSE IF(v1.value=v2.value,'true','false')
END value
from Expressions e
LEFT JOIN variables v1 on v1.name=e.left_operand
LEFT JOIN variables v2 on v2.name=e.right_operand
UNION all和UNION
连接两个两个查询结果组成一张表,前者会去掉重复的行