2日目|オフネットワークSQLの戦闘2つのブラシ牛

免責事項:この記事はブロガーオリジナル記事です、ソースを明記してください。https://blog.csdn.net/weixin_44915703/article/details/91352022

2日目|オフネットワークSQLの戦闘2つのブラシ牛

「牛オフネットワークSQL戦闘2のブラシは、」ノートボーエンを学ぶのシリーズです、今日6つのトピックを解析するSQLは〜7-12の質問の最初の日です!ブログの記事の他のシリーズは、〜に、「私のブログ」で見ることができます

各ノートのフォーマットは大まかに、3つの主要なセクション:

  • アウトライン
  • タイトル(タイトル説明、アイデア、コード、関連資料/ Q)
  • レビュー

今日概要!

まず、アウトライン

質問 知識ポイント
7 COUNT()関数、GROUP BY、HAVING節
8 DISTINCT(大量使用にBY GROUP)、ORDER BY
9 INNERは/パラレルクエリを登録しよう
10 LEFTはNOT IN、NULL IS、登録しよう
11 用法「等しくありません」
12 MAX()、GROUP BY

第二に、タイトル

数が15倍以上の従業員番号の給与とそれに対応するTのEMP_NOバラ7.検索

  • タイトル説明

給料を探すバラのtバラEMP_NO 15倍以上の従業員の数とそれに対応する数
のCREATE TABLE salaries
emp_noint型(11)NOT NULL、
salaryint型(11)NOT NULL、
from_dateDATE NOT NULL、
to_dateDATE NOT NULL、
PRIMARY KEY( 、));emp_nofrom_date

  • 出力説明
EMP_NO トン
10001 17
10004 16
10009 18
  • 考え
  1. それは各従業員のグループ、グループの統計情報に基づいているので、COUNT()関数は、使用してGROUPでカウントして、「15回以上ローズ」。
  2. 説明の出力、COUNT(の結果)を算出し、そしてTとして指定されています。
  3. 使用中having句のgropuby限界T> 15、復帰条件が成立EMP_NOあります。
  • コード
SELECT emp_no, COUNT(emp_no) AS t
FROM salaries
GROUP BY emp_no
HAVING t > 15
  • Q&A - WHERE VS HAVING
    SQL文では、where句とhaving句を持つことができます。有し、where句を同様の条件を設定するために定義され;
    1)役割を句である場合、クエリ結果をグループ化する前に線、すなわち、前のデータパケットをフィルタリングするために、除去された条件を満たさなくなり、条件が含まれていないことができ特定回線状態表示を使用する多機能、
    効果2)の条件句を満足するフィルタを有する基、すなわち、である後に、データパケットのフィルタリング条件はしばしばポリ機能を含みます。
    出典:https://www.cnblogs.com/cuihongyu3503319/p/9322457.html

8.全従業員の現在の給与の給与を識別

  • タイトル

現在のすべての従業員を探す(TO_DATE =「9999-01-01」)特定の給与給与、一度だけショーのために同じ給与、および表示する逆の順序で
のCREATE TABLE salaries
emp_no)(NOT NULLを11 int型、
salaryint型(11)NOT NULL 、
from_dateDATE NOT NULL、
to_dateDATE NOT NULL、
PRIMARY KEY( 、))emp_nofrom_date

  • 出力説明
給料
94692
94409
88958
88070
74057
72527
59755
43311
25828
  • 考え
  1. DISTINCT重いを使用するために、「同じ給料のためにだけ、一度に示します」。
  2. ORDER BYを使用して、「逆の順序で表示され、」ソート。
  • コード
SELECT DISTINCT salary FROM salaries
WHERE to_date = '9999-01-01'
ORDER BY salary DESC
  • 他のアイデアや液- 代わりDISTINCTのBY GROUP
    「Superyouyo」は、大量のデータが、異なる効率が高くない場合、によってグループを繰り返すことによって問題を解決することができる、と指摘しました。それはああ✨私の目が明るくなります!
SELECT salary FROM salaries 
WHERE to_date = '9999-01-01'
GROUP BY salary
ORDER BY salary DESC

出典:https://www.nowcoder.com/questionTerminal/ae51e6d057c94f6d891735a48d1c2397

9.現在の給与状況の現在のマネージャのすべての部門を取得

  • タイトル説明

現在のマネージャのすべてのセクタの現在の給与、所与DEPT_NO、EMP_NOと給与を取得し、これは= TO_DATE '9999-01-01'は
CREATE TABLE dept_manager
dept_noCHAR(4)NOT NULL、
emp_noINT(11)NOT NULL、
from_dateDATE NOT NULL、
to_dateNULL NOT DATE、
PRIMARY KEY( 、));emp_no CREATE TABLE 。INT(11)NOT NULL、(11)INT NOT NULL、DATE NOT NULL、DATE NOT NULL、PRIMARY KEY( 、))。dept_no
salaries
emp_no
salary
from_date
to_date
emp_nofrom_date

  • 出力説明
DEPT_NO EMP_NO 給料
D001 10002 72527
D004 10004 74057
D003 10005 94692
D002 10006 43311
D006 10010 94409
  • 考え
  1. INNERは、2つのテーブルを結合するために、JOIN、またはパラレル問合せを持ちます。
  2. 二つの「現在」 - 現在のマネージャ、現在の給与。
  • コード
  1. 方法の一つ:INNER JOINを
SELECT dm.dept_no, dm.emp_no, s.salary
FROM dept_manager AS dm INNER JOIN salaries AS s 
ON dm.emp_no = s.emp_no AND dm.to_date = '9999-01-01' AND s.to_date = '9999-01-01'
  1. 方法2:パラレルクエリ
SELECT dm.dept_no, dm.emp_no, s.salary
FROM dept_manager AS dm, salaries AS s 
WHERE dm.emp_no = s.emp_no AND dm.to_date = '9999-01-01' AND s.to_date = '9999-01-01'

10.すべての非管理者の従業員を取得しますEMP_NO

  • タイトル説明

获取所有非管理的员工EMP_NO
TABLE CREATE dept_manager
dept_noCHAR(4)NOT NULL、
emp_noINT(11)NULL NOT、
from_date日付NULL NOT、
to_date日付NOT NULL、
PRIMARY KEY( 、))。emp_no CREATE TABLE INT(11)NOT NULL、日付NULL NOT、VARCHAR(14)NOT NULL、VARCHAR(16)NOT NULL、CHAR(1)NULL NOT、日付NOT NULL、PRIMARY KEY( ))。dept_no
employees
emp_no
birth_date
first_name
last_name
gender
hire_date
emp_no

  • 出力説明
EMP_NO
10001
10003
10007
10008
10009
10011
  • 考え
  1. 思路一:employees 表 LEFT JOIN dept_emp 表,通过判断 dept_emp对应为空的记录,可以筛选出 「非manager的员工」;
  2. 思路二:在表employees中排除dept_emp表中的记录,用NOT IN字段。
  • 代码
  1. 方法一:IS NULL
SELECT e.emp_no
FROM employees AS e LEFT JOIN dept_manager AS dm ON e.emp_no = dm.emp_no
WHERE dm.dept_no IS NULL

注意⚠️,是 IS NULL, 不能用 = NULL,详见参考。

  1. 方法二: NOT IN
SELECT emp_no FROM employees 
WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager)
  • 参考
  1. 如果对LEFT JOIN掌握不足,可以参考题5,可跳转**《牛客网SQL实战二刷 | Day1》**查看,这道题是在T5的基础上,又复杂一些,筛选出为NULL的记录。
    来源:https://blog.csdn.net/weixin_44915703/article/details/91348696)

  2. 关于几种JOINS
    在这里插入图片描述

  3. 关于 IS NULL 和 = NULL
    1)“ = NULL ” 是错误的语法!
    2) SQL中,使用 is NULL 或 is not NULL判断字段是否为空
    来源:https://blog.csdn.net/qq_16234613/article/details/65627166

11. 获取所有员工当前的manager

  • 题目

获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date=‘9999-01-01’。
结果第一列给出当前员工的emp_no,第二列给出其manager对应的manager_no。
CREATE TABLE dept_emp (
emp_no int(11) NOT NULL,
dept_no char(4) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));
CREATE TABLE dept_manager (
dept_no char(4) NOT NULL,
emp_no int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));

  • 输出描述
emp_no manager_no
10001 10002
10003 10004
10009 10010
  • 思路
  1. INNER JOIN 通过关键字 dept_no连接两张表;
  2. 「如果当前的manager是自己的话结果不显示」,即dept_manager表的emp_no 与 dept_emp表的emp_no相同的记录,应去掉。
  • 代码
SELECT de.emp_no, dm.emp_no AS manager_no
FROM dept_emp AS de INNER JOIN dept_manager AS dm ON dm.dept_no = de.dept_no
WHERE dm.to_date = '9999-01-01' AND de.to_date = '9999-01-01' AND de.emp_no <> dm.emp_no

12. 获取所有部门中当前员工薪水最高的相关信息

  • 题目

获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary
CREATE TABLE dept_emp (
emp_no int(11) NOT NULL,
dept_no char(4) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));
CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));

  • 输出描述
dept_no emp_no salary
d001 10001 88958
d002 10006 43311
d003 10005 94692
d004 10004 74057
d005 10007 88070
d006 10009 95409
  • 思路
  1. 「薪水最高」,即MAX(salary);
  2. 根据输出描述,可见需按照dept_no 分组,即group by dept_no;
  3. 两张表通过INNER JOIN 连接。
  • 代码
SELECT de.dept_no, de.emp_no, MAX(salary)
FROM dept_emp AS de INNER JOIN salaries AS s ON de.emp_no = s.emp_no
WHERE de.to_date = '9999-01-01' and s.to_date = '9999-01-01'
GROUP BY de.dept_no

三、回顾

总结Day2的知识点~

知识点 题号
HAVING子句 7
去重 8
“为空” 10
表连接 9、10
“不等于”/ “不在某子集” 10、11
GROUP BY 7、8、12
函数 7「COUNT()」、12「MAX()」

除此之外,特别的收获,GROUP BY作为去重的新功能!

おすすめ

転載: blog.csdn.net/weixin_44915703/article/details/91352022