Mysql刷题总结

 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 

连接两个两个查询结果组成一张表,前者会去掉重复的行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1while(true){learn}

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值