MySQL leetCode 练习题

 自己的笔记过程

-- 查询数据 p1数据 > p2的数据 可以进行排名 过滤 之类的数据
SELECT
* 
FROM
	person AS p1,
	( SELECT person.email email, COUNT( person.email ) count FROM person GROUP BY person.email ) AS p2 
WHERE
	p1.email = p2.email 
-- 上升的温度 # Write your MySQL query statement below
SELECT
	w2.id 
FROM
	Weather AS w1,
	Weather AS w2 
WHERE
	w2.Temperature > w1.Temperature 
	AND datediff( w2.recordDate, w1.recordDate ) = 1;
SELECT
	w1.id 
FROM
	weather AS w1,
	weather AS w2 
WHERE
	w1.Temperature > w2.Temperature 
	AND DATEDIFF( w1.recordDate, w2.recordDate ) = 1;
-- 行程与用户 //写 SQL 先说明思路 然后在进行狡辩 先排除掉 禁用客户数据 /全部数据
SELECT
t.request_at 'Day',
round( sum( IF ( t.STATUS = 'completed', 0, 1 ) ) / count( t.STATUS ), 2 ) AS 'Cancellation Rate' 
FROM
	trips AS T
	JOIN users AS u1 ON ( t.client_id = u1.users_id AND u1.banned = 'No' )
	JOIN users AS u2 ON ( t.driver_id = u2.users_id AND u2.banned = 'No' ) 
WHERE
	t.request_at BETWEEN '2013-10-01' 
	AND '2013-10-03' 
GROUP BY
	t.request_at 
ORDER BY
	t.request_at ASC;
-- 游戏玩法分析 I
SELECT
* 
FROM
	activity AS a1
	LEFT JOIN activity AS a2 ON SELECT
	a1.player_id,
	MIN( a1.event_date ) AS fiest_login 
FROM
	activity AS a1 
GROUP BY
	a1.player_id;
-- 游戏玩法 1.计算出第二天登录的人 2.在计算出总人数 3.round方法 
SELECT
count( a1.player_id ) 
FROM
	activity AS a1,
	activity AS a2 
WHERE
	DATEDIFF( a1.event_date, a2.event_date ) = 1 
	AND a1.player_id = a2.player_id;
-- 思路错误 我这个是临近俩天登录 
SELECT
ROUND( COUNT( DISTINCT a1.player_id ) / COUNT( DISTINCT a.player_id ), 2 ) AS 'fraction' 
FROM
	activity AS a,
	activity AS a1
	JOIN activity AS a2 ON a1.player_id = a2.player_id 
WHERE
	DATEDIFF( a1.event_date, a2.event_date ) = 1;
-- 先找出首次登录的日期 然后找出与首次登录日期相近的相近的登录 
-- sql 执行顺序 
-- from
-- JOIN 
-- WHERE
-- SELECT 
-- GROUP BY
-- HAVING
-- ORDER BY
SELECT
	ROUND( count( a.player_id ) / count( b.player_id ), 2 ) AS 'fraction' 
FROM
	( SELECT player_id, min( event_date ) event_date FROM activity GROUP BY player_id ) AS b
	LEFT JOIN activity AS a ON a.player_id = b.player_id 
	AND DATEDIFF( a.event_date, b.event_date ) = 1;
-- 262.行程与用户
EXPLAIN SELECT
t.request_at 'Day',
round( sum( IF ( t.STATUS = 'completed', 0, 1 ) ) / count( t.STATUS ), 2 ) AS 'Cancellation Rate' 
FROM
	trips AS T
	JOIN users AS u1 ON ( t.client_id = u1.users_id AND u1.banned = 'No' )
	JOIN users AS u2 ON ( t.driver_id = u2.users_id AND u2.banned = 'No' ) 
WHERE
	t.request_at BETWEEN '2013-10-01' 
	AND '2013-10-03' 
GROUP BY
	t.request_at 
ORDER BY
	t.request_at ASC;
-- 570.至少有5名直属经理 //首先记录 manager 次数超过 5次 通过记录 去确定 NAME // jion 只包含俩个数据 才显示表 LEFT RIGHT 以左右俩次表为主 可以为空 //因为关联的关系 显示的表导致数据不一样 主要还是关联的条件

SELECT
	groupby orderby
CASE
		
		WHEN em.NAME IS NULL THEN
		'----' ELSE em.NAME 
	END AS `name` SELECT
	* 
FROM
	employee AS em
	RIGHT JOIN ( SELECT e.managerId, count( e.managerId ) count FROM employee AS e GROUP BY e.managerId HAVING count >= 5 ) AS emb ON em.id = emb.managerId;
-- 577.员工奖金 
SELECT
e.NAME,
b.bonus 
FROM
	employee AS e
	LEFT JOIN bonus AS b ON e.empId = b.empId 
WHERE
	b.bonus < 1000 
	OR b.bonus IS NULL;
--  584.寻找用户 
SELECT NAME 
FROM
	customer 
WHERE
	referee_id != '2' 
	OR referee_id IS NULL;
-- 585.2016年工资 
SELECT
* 
FROM
	Insurance AS a
	LEFT JOIN Insurance AS b ON a.tiv_2015 = b.tiv_2015 
	AND a.tiv_2016 != b.tiv_2016 
	AND a.pid != b.pid;
-- 586.订单最多的客户 
SELECT
customer_number 
FROM
	orders 
GROUP BY
	customer_number 
ORDER BY
	count( customer_number ) DESC 
	LIMIT 1;
-- 大的国家 
SELECT NAME
,
population,
area 
FROM
	world 
WHERE
	area >= 3000000 
	OR population >= 25000000;
-- 506.超过5名学生的课 
SELECT
class 
FROM
	courses 
GROUP BY
	class 
HAVING
	count( class ) >= 5;
-- 查找出 人数最高的次数 重点痛点 : ROW_NUMBER ( ) OVER ( ORDER BY id ) 是一个窗口函数,它根据 "id" 列的值对结果集中的行进行排序,并为每一行分配一个行号(行号从 1开始递增,按照 "id" 的顺序分配)。这个窗口函数不会改变结果集中的行的顺序,但它为每一行分配一个行号 
WITH t1 AS ( SELECT *, id - row_number ( ) over ( ORDER BY id ) AS rk FROM stadium WHERE people >= 100 ) SELECT
id,
visit_date,
people 
FROM
	t1 
WHERE
	rk IN ( SELECT rk FROM t1 GROUP BY rk HAVING count( rk ) >= 3 );
-- 好有申请,谁有最多的好友 
-- ORDER BY LIMIT 分组根据排序结果集  进行分页 
SELECT
	ids AS id,
	count( ids ) AS num 
FROM
	( SELECT requester_id AS ids FROM requestaccepted UNION ALL SELECT accepter_id FROM requestaccepted ) AS t1 
GROUP BY
	t1.ids 
ORDER BY
	num DESC 
	LIMIT 1;
// 树节点
-- CASE WHEN 多条件过滤 
SELECT
		t.id,
	CASE
			WHEN t.id = ( SELECT id FROM tree WHERE p_id IS NULL ) THEN
			'Root' 
			WHEN t.id IN ( SELECT p_id FROM tree ) THEN
			'Inner' ELSE 'left' 
		END AS Type 
	FROM
		tree AS t 
	ORDER BY
		t.id;
	//判断三角形 
	SELECT
	*,
	CASE
			WHEN x + y > z THEN
			'true' ELSE 'false' 
		END AS Etriangle 
	FROM
		triangle;
	//修改性别 及其状态 
	UPDATE salary 
	SET sex =
	IF
		( sex = 'f', 'm', 'f' );
	UPDATE salary 
	SET sex =
	CASE
			sex 
			WHEN 'f' THEN
			'm' ELSE 'f' 
		END;
-- 1045.购买所有产品 1.错误点 比较每个用户的总的商品量 ( 去重 ) 不是用户买的总的商品量 ( 可能每个用户对于一个商品进行多买 ) count记录值那个字段都可以 
	SELECT
	customer_id 
	FROM
		customer 
	GROUP BY
		customer_id 
	HAVING
		count( DISTINCT product_key ) = ( SELECT count( product_key ) FROM product );
	SELECT
		customer_id,
		count( customer_id ) 
	FROM
		customer 
	GROUP BY
		customer_id;
	SELECT
		customer_id,
		count( DISTINCT product_key ) 
	FROM
		customer 
	GROUP BY
		customer_id;
-- 	1050.至少合作过3次的选手 思路 :查询全部的高于 3次的演员 
-- 	盲点 :如果是多表使用 
-- 	GROUP BY	要指定表的名称 单表则不使用
		SELECT
		a1.actor_id AS actor_id,
		a1.director_id AS director_id,
		a1.TIMESTAMP AS TIMESTAMP 
	FROM
		actordirector AS a1
		LEFT JOIN actordirector AS a2 ON a1.actor_id = a2.actor_id 
		AND a1.director_id = a2.director_id 
	GROUP BY
		a1.TIMESTAMP,
		a1.actor_id,
		a1.director_id 
	HAVING
		count( a1.TIMESTAMP ) >= 3;
-- 	同时对每个字段进行分组 就能过滤相同 字段的次数 
-- 	例如 :只过滤一个字段 出现的次数为 5次 那么再过滤一个字段出现是三次 那么最终出现的是三次
	SELECT
	actor_id,
	director_id,
	count( TIMESTAMP ) 
	FROM
		ActorDirector 
	GROUP BY
		actor_id,
		director_id 
	HAVING
		COUNT( TIMESTAMP ) >= 3;
	SELECT
		actor_id,
		director_id,
		TIMESTAMP,
		COUNT( TIMESTAMP ) AS timestamp_count 
	FROM
		ActorDirector 
	GROUP BY
		actor_id,
		director_id,
		TIMESTAMP;
--  1070.销售分析 III todo :窗口函数回头复习 
-- 	GROUP BY
-- 		分组之后 不能对其他 clounms 进行展示 
-- 	GROUP BY
-- 		作用的只有分组列和聚合函数列,其他列不管用,返回的其他列只有对应的第一行
		SELECT
		p.product_id,
		s.YEAR AS first_year,
		quantity,
		price 
	FROM
		sales AS s
		LEFT JOIN product AS p ON s.product_id = p.product_id 
	WHERE
		( s.product_id, YEAR ) IN ( SELECT product_id, min( YEAR ) FROM sales GROUP BY product_id );
	SELECT
		product_id,
		min( YEAR ) AS first_year,
		quantity,
		price 
	FROM
		sales 
	GROUP BY
		product_id 
-- // 1075.项目员工 SELECT
		project_id,
		ROUND( AVG( experience_years ), 2 ) average_years 
	FROM
		project AS p
		JOIN employee AS e ON p.employee_id = e.employee_id 
	GROUP BY
		project_id;
-- 	// 1084.销售分析 思路 : 要想查询单位时间内的出现的数据 其他时间出现的不算 就是单位时间内出现的次数 =出现的总数 我之前错误的思路是因为只有单位时间内出现一次 才能算这个商品
	SELECT
	product_id,
	product_name 
	FROM
		product 
	WHERE
		product_id IN (
		SELECT
			product_id 
		FROM
			sales 
		WHERE
		product_id IN ( SELECT product_id FROM sales GROUP BY product_id HAVING count( sale_date BETWEEN '2019-01-01' AND '2019-03-31' OR NULL ) = count( product_id ) ) 
	);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值