
SQL
hmyqwe
这个作者很懒,什么都没留下…
展开
-
SQL 语言分类-DDL、DML、DQL、DCL
SQL 语言分为四大类:数据查询语言 DQL,数据操纵语言 DML,数据定义语言 DDL,数据控制语言 DCL。数据查询语言 DQL(Data Query Language)基本结构是由 SELECT 子句,FROM 子句,WHERE 子句组成的查询块:SELECT <字段名表>FROM <表或视图名>WHERE <查询条件>数据操纵语言 DML(Data Manipulation Language)主要有三种形式:1)插入:INSERT2)更新原创 2021-11-22 10:36:01 · 551 阅读 · 0 评论 -
SQL 语句的执行顺序
SQL 语句的执行顺序以下方语句作为示例:(7) SELECT(8) DISTINCT <select_list>(1) FROM <left_table>(3) <join_type> JOIN <right_table>(2) ON <join_condition>(4) WHERE <where_condition>(5) GROUP BY <group_by_list>(.原创 2021-07-02 16:15:39 · 210 阅读 · 0 评论 -
牛客SQL练习-76-考试分数(五)
SELECT id, job, score, dn rank FROM ( SELECT id, job, score, rank () over ( PARTITION BY job ORDER BY score ) rn,--正序位置 rank () over ( PARTITION BY job ORDER BY score DESC ) dn,--倒序位置 count() over ( PARTITION BY job ) cnt --参与排序总数 FROM ..原创 2020-10-19 09:47:21 · 268 阅读 · 0 评论 -
牛客SQL练习-75-考试分数(四)
SELECT job,CASE WHEN total % 2 = 0 THEN total / 2 ELSE ( total + 1 )/ 2 END AS `start`,CASE WHEN total % 2 = 0 THEN total / 2+1 ELSE ( total + 1 )/ 2 END AS `end` FROM ( SELECT job, COUNT( 1 ) AS total FROM grade GROUP BY job ) t原创 2020-10-16 17:17:08 · 164 阅读 · 0 评论 -
牛客SQL练习-74-考试分数(三)
SELECT g.id, l.NAME, g.score FROM ( SELECT *, dense_rank () over ( PARTITION BY language_id ORDER BY score DESC ) AS rank FROM grade ) g, LANGUAGE l WHERE g.language_id = l.id AND g.rank <= 2 ORDER BY l.NAME ASC, g.score DESC, g.id ASC..原创 2020-10-16 16:41:41 · 324 阅读 · 0 评论 -
牛客SQL练习-73-考试分数(二)
每个岗位的平均分sql代码如下:(select job,round(avg(score*1.000),3) as avg from gradegroup by job) 可以上面查询出来的数据看成一个新表,用现在的表去联立这个新表,获得当job相同时,现在的表大于新表的分数,就可以得到各个岗位大于平均数的信息,最后按照id升序select grade.* from grade join (select job,round(avg(score*1.000),3) as avg from...原创 2020-10-13 18:02:18 · 829 阅读 · 0 评论 -
牛客SQL练习-72-考试分数(一)
SELECT job, ROUND( AVG( score * 1.0000 ), 3 ) AS `avg` FROM grade GROUP BY job ORDER BY `avg` DESC原创 2020-10-13 17:53:42 · 231 阅读 · 0 评论 -
牛客SQL练习-71-牛客每个人最近的登录日期(六)
分析: 简单求滚动sumSELECT u.NAME AS u_n, c.NAME AS c_n, pn.date AS date, sum( pn.number ) over ( PARTITION BY pn.user_id ORDER BY pn.date ) AS ps_num FROM passing_number pn INNER JOIN USER u ON pn.user_id = u.id INNER JOIN login l ON pn.user_id = l....原创 2020-10-13 17:40:38 · 191 阅读 · 0 评论 -
牛客SQL练习-70-牛客每个人最近的登录日期(五)
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 = b.user_id AND b.date = date( a.date, '+1 day' ) GROUP BY a...原创 2020-10-13 15:23:36 · 230 阅读 · 0 评论 -
SQL 中的窗口函数使用总结
窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。语法<窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>)<窗口函数>的位置,可以放以下两种函数:专用窗口函数,比如rank, dense_rank, row_number等聚合函数,如sum. avg, count, max, min等使用专用窗口原创 2020-10-13 10:46:27 · 552 阅读 · 0 评论 -
牛客SQL练习-69-牛客每个人最近的登录日期(四)
首先得到每个日期里面,用户登录的数目select l1.date,count(distinct l1.user_id)from login l1group by l1.date再加一个where判断条件就能从这每个日期里面,用户登录的数目取出哪些是新用户select l1.date,count(distinct l1.user_id)from login l1where l1.date =(select min(date) from login where user_id=l1...原创 2020-10-12 18:02:22 · 212 阅读 · 0 评论 -
牛客SQL练习-68-牛客每个人最近的登录日期(三)
思路:(第一天登录的新用户并且第二天也登录的用户)/(总用户)即为新登录用户的次日成功的留存率总用户计算如下:select count(distinct user_id) from login找到每个用户第一天登陆的日子,和前面找最近登录的日子差不多,一个是max,一个是min,如下:select user_id,min(date) from login group by user_id找到所有的在第一天登录的新用户并且第二天也登录的用户,以及第二天的日期,如下:selec..原创 2020-10-12 17:15:40 · 371 阅读 · 0 评论 -
牛客SQL练习-67-牛客每个人最近登录的日期(二)
SELECT USER .NAME AS u_n, client.NAME AS c_n, login.date FROM login JOIN USER ON login.user_id = USER.id JOIN client ON login.client_id = client.id WHERE ( login.user_id, login.date ) IN ( SELECT user_id, max( date ) FROM login GROUP BY login....原创 2020-10-12 17:01:49 · 187 阅读 · 1 评论 -
牛客SQL练习-66-牛客每个人最近登录的日期(一)
SELECT max( date ) AS d FROM login GROUP BY user_id ORDER BY user_id原创 2020-10-12 10:32:15 · 166 阅读 · 0 评论 -
牛客SQL练习-65-异常的邮件概率
SELECT e.date, round( sum( CASE e.type WHEN 'no_completed' THEN 1 ELSE 0 END )* 1.0 / count( e.type ), 3 ) AS p FROM email e WHERE send_id IN ( SELECT id FROM USER WHERE is_blacklist = 0 ) AND receive_id IN ( SELECT id FROM USER WHERE is_blackli...原创 2020-10-12 10:25:01 · 210 阅读 · 0 评论 -
牛客SQL练习-64-找到每个人的任务
SELECT p.id, p.NAME, t.content FROM person AS p LEFT JOIN task AS t ON p.id = t.person_id ORDER BY p.id原创 2020-10-12 09:56:32 · 197 阅读 · 0 评论 -
牛客SQL练习-63-刷题通过的题目排名
SELECT p1.id, p1.number, count( DISTINCT p2.number ) rank FROM passing_number p1, passing_number p2 WHERE p1.number <= p2.number GROUP BY p1.id ORDER BY rank ASC, p1.id ASC或者SELECT a.id, a.number, ( SELECT count( DISTINCT b.number ) ..原创 2020-10-10 16:57:16 · 199 阅读 · 0 评论 -
牛客SQL练习-62-出现三次以及三次以上相同积分的情况
SELECT number FROM grade GROUP BY number HAVING COUNT( number ) >= 3原创 2020-10-10 15:42:22 · 323 阅读 · 0 评论 -
牛客SQL练习-61-对于employees表中,输出first_name排名(按first_name升序排序)为奇数的first_name
SELECT e1.first_name FROM employees e1 WHERE ( SELECT count(*) FROM employees e2 WHERE e1.first_name >= e2.first_name )% 2 = 1原创 2020-10-10 14:24:02 · 447 阅读 · 0 评论 -
牛客SQL练习-60-统计salary的累计和running_total,其中running_total为前N个当前( to_date = ‘9999-01-01‘)员工的salary累计和
SELECT a.emp_no, a.salary, sum( b.salary ) FROM salaries AS a, salaries AS b WHERE b.emp_no <= a.emp_no AND a.to_date = '9999-01-01' AND b.to_date = '9999-01-01' GROUP BY a.emp_no原创 2020-10-10 14:09:50 · 235 阅读 · 0 评论 -
sql中的case when使用总结
CASE具有两种格式。简单CASE函数和CASE搜索函数。简单CASE函数CASE sexWHEN '1' THEN '男'WHEN '2' THEN '女'ELSE '其他' ENDCase搜索函数CASE WHEN sex = '1' THEN '男'WHEN sex = '2' THEN '女'ELSE '其他' END或者CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'WHEN col_1 IN ('a') THEN '原创 2020-10-09 17:55:36 · 129 阅读 · 0 评论 -
牛客SQL练习-59-获取有奖金的员工相关信息,给出emp_no、first_name、last_name、奖金类型btype、对应的当前薪水情况salary以及奖金金额bonus
SELECT e.emp_no, e.first_name, e.last_name, b.btype, s.salary, ( CASE b.btype WHEN 1 THEN s.salary * 0.1 WHEN 2 THEN s.salary * 0.2 ELSE s.salary * 0.3 END ) AS bonus FROM employees AS e INNER JOIN emp_bonus AS b ON.原创 2020-10-09 17:51:18 · 774 阅读 · 0 评论 -
牛客SQL练习-58-获取employees中的行数据,且这些行也存在于emp_v中。注意不能使用intersect关键字
SELECT * FROM employees WHERE emp_no IN ( SELECT emp_no FROM emp_v)原创 2020-10-09 17:41:22 · 290 阅读 · 0 评论 -
SQL中的EXISTS,IN,NOT EXISTS, NOT IN使用总结
EXISTS 和 IN在主表和从表都对关联的列建立索引的前提下:当主表比从表大时,IN查询的效率较高;当从表比主表大时,EXISTS查询的效率较高;举例如下:A表小,B表大;select * from A where cc in (select cc from B)效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)效率高,用到了B表上cc列的索引;反过来select .原创 2020-10-09 17:36:31 · 264 阅读 · 0 评论 -
牛客SQL练习-57-使用含有关键字exists查找未分配具体部门的员工的所有信息
SELECT * FROM employees WHERE NOT EXISTS ( SELECT emp_no FROM dept_emp WHERE employees.emp_no = dept_emp.emp_no)或者 not inSELECT * FROM employees WHERE emp_no NOT IN ( SELECT emp_no FROM dept_emp) 拓展:EXISTS 和 IN在主表和从表都对关联的.原创 2020-10-09 17:28:41 · 315 阅读 · 0 评论 -
牛客SQL练习-56-获取所有员工的emp_no、部门编号dept_no以及对应的bonus类型btype和received,没有分配奖金的员工不显示对应的bonus类型btype和received
SELECT em.emp_no, de.dept_no, eb.btype, eb.received FROM employees AS em INNER JOIN dept_emp AS de ON em.emp_no = de.emp_no LEFT JOIN emp_bonus AS eb ON de.emp_no = eb.emp_no原创 2020-10-09 16:09:36 · 259 阅读 · 0 评论 -
SQL中的 substr(X,Y,Z) 或 substr(X,Y) 函数
substr(X,Y,Z) 或 substr(X,Y) 函数;X是要截取的字符串;Y是字符串的起始位置(注意第一个字符的位置为1,不为0),取值范围是±(1~length(X)),当Y等于length(X)时,截取最后一个字符;当Y等于负整数-n时,从倒数第n个字符处截取;Z是要截取字符串的长度,取值范围是正整数;若Z省略,则从Y处一直截取到字符串末尾;若Z大于剩下的字符串长度,截取到字符串末尾为止;...原创 2020-10-08 17:33:32 · 550 阅读 · 0 评论 -
SQL中的聚合函数 group_concat(X,split)
聚合函数group_concat(X,split),X表示需要连接的列名,split表示连接的分隔符,默认为逗号;group_concat()聚合函数需要结合group by一起来使用,通过group by 来指定字段进行分组;原创 2020-10-08 17:32:15 · 614 阅读 · 0 评论 -
SQL中的分页问题
LIMIT 后的数字代表返回几条记录,OFFSET 后的数字代表从第几条记录开始返回(第一条记录序号为0),也可理解为跳过多少条记录后开始返回;在 LIMIT X,Y 中,Y代表返回几条记录,X代表从第几条记录开始返回(第一条记录序号为0)...原创 2020-10-08 17:31:11 · 135 阅读 · 0 评论 -
牛客SQL练习-55-分页查询employees表,每5行一页,返回第2页的数据
SELECT * FROM employees LIMIT 5 OFFSET 5或者SELECT * FROM employees LIMIT 5,5拓展:LIMIT 后的数字代表返回几条记录,OFFSET 后的数字代表从第几条记录开始返回(第一条记录序号为0),也可理解为跳过多少条记录后开始返回;在 LIMIT X,Y 中,Y代表返回几条记录,X代表从第几条记录开始返回(第一条记录序号为0)...原创 2020-10-08 17:29:14 · 202 阅读 · 0 评论 -
牛客SQL练习-54-查找排除最大、最小salary之后的当前(to_date = ‘9999-01-01‘ )员工的平均工资avg_salary
SELECT AVG( salary ) AS avg_salary FROM salaries WHERE to_date = '9999-01-01' AND salary NOT IN ( SELECT MAX( salary ) FROM salaries WHERE to_date = '9999-01-01' ) AND salary NOT IN ( SELECT MIN( salary ) FROM salaries WHERE to_date = '9.原创 2020-10-08 17:24:15 · 374 阅读 · 0 评论 -
牛客SQL练习-53-按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees
SELECT dept_no, group_concat( emp_no ) AS employees FROM dept_emp GROUP BY dept_no或者SELECT dept_no, group_concat( emp_no, ',') AS employeesFROM dept_emp GROUP BY dept_no拓展:聚合函数group_concat(X,split),X表示需要连接的列名,split表示连接的分隔符,默认为逗号;group_c.原创 2020-10-08 17:18:20 · 211 阅读 · 0 评论 -
牛客SQL练习-52-获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列
SELECT first_name FROM employees ORDER BY substr( first_name, length( first_name )- 1 )拓展:substr(X,Y,Z) 或 substr(X,Y) 函数;X是要截取的字符串;Y是字符串的起始位置(注意第一个字符的位置为1,不为0),取值范围是±(1~length(X)),当Y等于length(X)时,截取最后一个字符;当Y等于负整数-n时,从倒数第n个字符处截取;Z是要截取字符串的长度,取值范围是.原创 2020-10-08 17:00:22 · 464 阅读 · 0 评论 -
牛客SQL练习-51-查找字符串‘10,A,B‘ 中逗号‘,‘出现的次数cnt
SELECT (length("10,A,B")-length(replace("10,A,B",",","")))/length(",") AS cnt原创 2020-10-08 16:45:41 · 107 阅读 · 0 评论 -
牛客SQL练习-50-将employees表中的所有员工的last_name和first_name通过(‘)连接起来
SELECT last_name || "'" || first_name FROM employees注意:MySQL下写为:SELECT concat( last_name, "‘", first_name ) AS NAME FROM employees原创 2020-10-08 16:40:08 · 235 阅读 · 0 评论 -
牛客SQL练习-49-针对库中的所有表生成select count(*)对应的SQL语句
SELECT "select count(*) from " || NAME || ";" AS cnts FROM sqlite_master WHERE type = 'table'**注意:**MySQL中如下:SELECT concat( "select count(*) from ", " ", table_name, ";" ) AS cnts FROM ( SELECT table_name FROM information_schema.TABLES ) AS new.原创 2020-10-08 16:36:29 · 189 阅读 · 0 评论 -
牛客SQL练习-48-将所有获取奖金的员工当前的(salaries.to_date=‘9999-01-01‘)薪水增加10%
UPDATE salaries SET salary = salary * 1.1 WHERE emp_no IN ( SELECT emp_no FROM emp_bonus ) AND to_date = '9999-01-01'原创 2020-10-07 10:09:50 · 288 阅读 · 0 评论 -
牛客SQL练习-46-在audit表上创建外键约束,其emp_no对应employees_test表的主键id
DROP TABLE audit;CREATE TABLE audit ( EMP_no INT NOT NULL, create_date datetime NOT NULL, FOREIGN KEY ( EMP_no ) REFERENCES employees_test ( ID ) );或DROP TABLE audit;CREATE TABLE audit( EMP_no INT NOT NULL REFERENCES employees_test(ID.原创 2020-10-06 17:38:05 · 153 阅读 · 0 评论 -
SQL中的修改表名及添加列问题-RENAME TO和ADD COLUMN的使用小结
修改表名语法:ALTER TABLE 旧表名 RENAME TO 新表名增加列语法:ALTER TABLE 表名 ADD COLUMN 列名 数据类型原创 2020-10-06 17:27:15 · 1833 阅读 · 0 评论 -
牛客SQL练习-45-将titles_test表名修改为titles_2017
RENAME TABLE titles_test TO titles_2017或者ALTER TABLE titles_test RENAME TO titles_2017原创 2020-10-06 17:19:32 · 155 阅读 · 0 评论