SQL每日一練【180605】
題目:匯總各個部門當前員工的title類型的分配數目_牛客網
來源:牛客網
匯總各個部門當前員工的title類型的分配數目,結果給出部門編號dept_no、dept_name、其當前員工所有的title以及該類型title對應的數目count
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_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 IF NOT EXISTS `titles` (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);
select de.dept_no, de.dept_name, t1.title, t1.emp_count as count
from (select d.dept_no, t.title, count(emp_no) as emp_count
from dept_emp d inner join titles t on d.emp_no = t.emp_no
where d.to_date = "9999-01-01" and t.to_date = "9999-01-01"
group by d.dept_no, t.title) as t1 inner join departments de on t1.dept_no = de.dept_no;
我的解答:
select de.dept_no, de.dept_name, t1.title, t1.emp_count as countfrom (select d.dept_no, t.title, count(t.emp_no) as emp_countfrom dept_emp d inner join titles t on d.emp_no = t.emp_nowhere d.to_date = "9999-01-01" and t.to_date = "9999-01-01"group by d.dept_no, t.title) as t1 inner join departments de on t1.dept_no = de.dept_no;
牛客網上提供的答案:
SELECT de.dept_no, dp.dept_name, t.title, COUNT(t.title) AS countFROM titles AS t INNER JOIN dept_emp AS de ON t.emp_no = de.emp_no AND de.to_date = 9999-01-01 AND t.to_date = 9999-01-01INNER JOIN departments AS dp ON de.dept_no = dp.dept_noGROUP BY de.dept_no, t.title
對比我的答案和牛客網提供的答案,有以下不同:
1)對於題目的理解。count部分我用了emp_no,因為我覺得計算同一個title的數量說到底還是算有這個title的人頭有多少;但其實按照參考答案的,計算這個title出現的次數也是可行的。感覺這裡我的思維稍微繞了個彎。
2)我用了子查詢,但是參考答案沒有。現階段沒看出運行上有什麼差異……
小疑問:
關於count。當我看到「t1.emp_count as count」里的第二個count被標紅的時候還以為SQL像python一樣,不能用和關鍵字一樣的名字去命名欄位,後來發現是多慮了。
推薦閱讀:
※MySQL |Self Join
※MySQL5.7.17 編譯安裝及二進位安裝詳解
※MySQL資料庫應用總結(九)—MySQL資料庫視圖的操作
※MySQL資料庫應用總結(四)—MySQL資料庫表的基本操作(上)
※半同步複製介紹