热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mac11.14mysql_20201119Mysql(牛客网SQL题要点详解)

1.distinct去重函数selecttitleasAssistantEngineer,count(distinctemp_no)astfromtitlesgroupbytitl

1.distinct去重函数

select

title as 'Assistant Engineer',count(distinct emp_no) as t

from

titles

group by title

having t>=2

2.limit的用法 limit 1,2 从位移1截取取2个

//取第二,存在多个人排第二的情况

select emp_no, salary

from salaries

where salary = (

select salary from salaries

group by salary

order by salary desc limit 1,1

)

and to_date = '9999-01-01'

3.牛客网SQL第18题

select s.emp_no, s.salary, e.last_name, e.first_name

from salaries s join employees e

on s.emp_no = e.emp_no

where s.salary = -- 第三步: 将第二高工资作为查询条件

(

select max(salary) -- 第二步: 查出除了原表最高工资以外的最高工资(第二高工资)

from salaries

where salary <

(

select max(salary) -- 第一步: 查出原表最高工资

from salaries

where to_date &#61; &#39;9999-01-01&#39;

)

and to_date &#61; &#39;9999-01-01&#39;

)

and s.to_date &#61; &#39;9999-01-01&#39;

(不支持下面的写法,select中存在非groupby 字段,)

select e.emp_no, max(s.salary),e.last_name,e.first_name

from salaries as s

inner join employees as e

on e.emp_no &#61; s.emp_no

where s.to_date&#61;&#39;9999-01-01&#39;

and s.salary <(select max(salary) from salaries where salaries.to_date &#61; &#39;9999-01-01&#39;);

4.牛客网SQL第22题(有意义的写法)

select

d.dept_no,

d.dept_name,

(select

sum((select

sum((select

case

# 记录数为0说明是第一条记录(原来的答案里有这一条&#xff0c;测试后发现加上去答案和预期不符)

# when count(*) &#61; 0 then 0

# 最近一次工资变化比当前工资低判定为涨工资

when s0.salary

# 其他情况判定为不是涨工资

else 0 end

# 查询最近一次工资变化情况

from salaries s0 where s0.emp_no &#61; s.emp_no and s0.to_date

# 查询出每个成员的每次工资变化情况

from salaries s where s.emp_no &#61; de.emp_no))

# 查询出部门中的每个成员

from dept_emp de where de.dept_no &#61; d.dept_no) as sum

from departments d;

5.牛客网SQL第23题(非窗口写法)

#注意去重

select a.emp_no &#xff0c;a.salary&#xff0c;

count(distinct b.salary)

from salaries as a,salaries as b

where a.to_date &#61; &#39;9999-01-01&#39;

and b.to_date &#61;&#39;9999-01-01&#39;

and a.salary<&#61; b.salary

order by salary desc;

6.牛客网SQL第25题(有点麻烦)

select

t1.emp_no as emp_no,t2.emp_no as manager_no,

t1.salary as emp_salary,t2.salary as manager_salary

from

(

select

dept_emp.emp_no,dept_no,salary

from

dept_emp

join

salaries

on dept_emp.emp_no &#61;salaries.emp_no

and dept_emp.to_date&#61;&#39;9999-01-01&#39;

and salaries.to_date&#61;&#39;9999-01-01&#39;) as t1

join

(select

dept_no,salary,dept_manager.emp_no

from

dept_manager

join

salaries

on dept_manager.emp_no &#61;salaries.emp_no

and dept_manager.to_date&#61;&#39;9999-01-01&#39;

and salaries.to_date&#61;&#39;9999-01-01&#39;

) as t2

on t1.dept_no &#61; t2.dept_no

and t1.salary > t2.salary

7.牛客网SQL第29题(注意事项)

最后一句若写成 ON f.film_id &#61; fc.film_id AND fc.category_id IS NULL&#xff0c;则意义变

成左连接两表 film_id 相同的记录&#xff0c;且 film_category 原表中的 fc.category 的值为

null。显然&#xff0c;原表中的 fc.category 的值恒不为 null&#xff0c;因此(f.film_id &#61; fc.film_id

AND fc.category_id IS NULL)恒为 FALSE&#xff0c;左连接后则只会显示 film 表的数

据&#xff0c;而 film_category 表的数据全显示为 null

8.牛客网SQL第35题(mysql语法补充)

加入数据存在忽略.insert

insert IGNORE into actor values (&#39;3&#39;, &#39;WD&#39;, &#39;GUINESS&#39;, &#39;2006-02-15 12:34:33&#39;);

9.牛客网SQL 第42题(犯了一个逻辑错误)

(我在group by 后面添加了having count()>1 导致min(id)中没有此项id not in 故删除了干这个数据)

(当然正向思维找出需要删除的id也可以having count() > 1 找出1 2 3 )

delete from titles_test

where titles_test.id not in

(

select

min(id)

from

titles_test

group by emp_no

)

10.牛客网SQL第51题(使用replace方法)

length( &#39;10,A,B&#39;) - length(REPLACE( &#39;10,A,B&#39;,&#39;,&#39;,&#39;&#39;));

11.牛客网第52题(使用substr,第二个参数客为负数,从后面截取)

select

first_name

from

employees

order by substr(first_name,-2,2)

12.牛客网第53题(group_concat(X,Y))

聚合函数group_concat(X,Y)&#xff0c;其中X是要连接的字段&#xff0c;Y是连接时用的符号&#xff0c;可省略&#xff0c;默认为逗号。此函数必须与 GROUP BY 配合使用。此题以 dept_no 作为分组&#xff0c;将每个分组中不同的emp_no用逗号连接起来(即可省略Y)

select

dept_no,

group_concat(emp_no)

from

dept_emp

group by dept_no

13.牛客网第55题,limit()实现分页

select *

from employees

limit 5, 5;

14.牛客网SQL第65题(case when 求和)

(我本来是count(tpye&#61;&#39;&#39;)来求和,忽视了casewhen的用法)

select

t1.date,

sum(case t1.type when&#39;completed&#39; then 0 else 1 end) *1.0/count(t1.type)

from

(

select

*

from

email

where

send_id not in

(

select

id

from

user

where is_blacklist &#61;1)

and receive_id not in (

select

id

from

user

where is_blacklist &#61;1)) t1

group by t1.date

15.牛客网SQL68题(次留存)

select round(1.0*count(distinct user_id)/(select count(distinct user_id) from login),3)

from login

where (user_id, date) in (

select user_id, date(min(login.date),"&#43;1 day")

from login

group by user_id

);

select round(1.0*count(distinct a.user_id)/(select count(distinct user_id) from login),3)

from (

select *, dense_rank() over (partition by user_id order by date) as rank

from login

) as a

join (

select *, dense_rank() over (partition by user_id order by date) as rank

from login

) as b on a.user_id &#61; b.user_id and a.rank &#61; 1 and b.rank &#61; 2

where b.date &#61; date(a.date,"&#43;1 day");

16.牛客网SQL69题(每日新登录人数)

(sum case when 的用法赋值)

select a.date,

sum(case when t_rank&#61;1 then 1 else 0 end) new

from

(select date, row_number() over(partition by user_id order by date) t_rank

from login) a

group by date;

(我的写法.......没想到使用case when)

select

t4.date,ifnull(t3.new,0)

from

(select

date

from

login

group by date) t4

left join

(select

t2.date,count(user_id) as new

from

(

select

t1.user_id,t1.date

from

(

select

user_id,

date,

row_number() over(partition by user_id order by date) as number

from

login) t1

where number &#61; 1) t2

group by t2.date) t3

on t4.date &#61; t3.date

17.牛客网SQL70题(每个日期新用户的次日留存率)

SELECT a.date, ROUND(COUNT(b.user_id) * 1.0/COUNT(a.user_id), 3) AS p

FROM (

SELECT user_id, MIN(date) AS date

FROM login

GROUP BY user_id) a

LEFT JOIN login b

ON a.user_id &#61; b.user_id

AND b.date &#61; date(a.date, &#39;&#43;1 day&#39;)

GROUP BY a.date

UNION

SELECT date, 0.000 AS p

FROM login

WHERE date NOT IN (

SELECT MIN(date)

FROM login

GROUP BY user_id)

ORDER BY date;

18.牛客网SQL74题(非窗口函数写法取最大然后取第二)

(不用排序排序函数的写法,先找到最大的,接着找到第二大的)

SELECT

g.id,

l.name,

g.score

FROM

grade g JOIN LANGUAGE l

ON g.language_id &#61; l.id

WHERE score >&#61; (SELECT IFNULL(MAX(score),0) FROM grade g2

WHERE g2.language_id &#61; g.language_id

AND score <(SELECT MAX(score) FROM grade g3

WHERE g3.language_id &#61; g.language_id))

ORDER BY l.name ASC , g.score DESC

19.牛客网75题(使用(count(*)&#43;1) /2来避免奇偶性小数的出现)

SELECT

job,

CASE WHEN total%2&#61;0 THEN total/2 ELSE (total&#43;1)/2 END AS &#96;start&#96;,

CASE WHEN total%2&#61;0 THEN total/2&#43;1 ELSE (total&#43;1)/2 END AS &#96;end&#96;

FROM

(SELECT job,COUNT(1) AS total

FROM grade

GROUP BY job)t;

20.牛客网76题(使用abs方法)

select id,

job,

score,

dn rank

from

(select id,

job,

score,

row_number() over(partition by job order by score) rn,--正序位置

row_number() over(partition by job order by score desc) dn,--倒序位置

count() over(partition by job) cnt--参与排序总数

from grade)

where (cnt%2&#61;1 and rn &#61; dn) -- 若排序总数为奇数&#xff0c;则中位数的正序位置与倒序位置相等

or (cnt%2&#61;0 and abs(rn-dn)&#61;1) --若排序总数为偶数&#xff0c;则中位数的正序位置与倒序位置正好差1

order by id



推荐阅读
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • MySQL外键1对多问题的解决方法及实例
    本文介绍了解决MySQL外键1对多问题的方法,通过准备数据、创建表和设置外键关联等步骤,实现了用户分组和插入数据的功能。详细介绍了数据准备的过程和外键关联的设置,以及插入数据的示例。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • MySQL插入数据的四种方式及安全性分析
    本文介绍了MySQL插入数据的四种方式:插入完整的行、插入行的一部分、插入多行和插入查询结果,并对其安全性进行了分析。在插入行时,应注意字段的定义和赋值,以提高安全性。同时指出了使用insert语句的不安全性,应尽量避免使用。建议在表中定义相关字段,并根据定义的字段赋予相应的值,以增加插入操作的安全性。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
author-avatar
a98246813
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有