# SQL notes ## https://pjchender.dev/database/sql-query/ ## ctrl+/: 註解/註解取消 # 撈資料 ## select...from ```sql= -- select ... from select * from 'employee' -- 按照 salary 由低到高排序 select * from 'employee' order by 'salary'; -- 按照 salary 由高到低排序 select * from 'employee' order by 'salary' desc; -- 取得薪水前三高的員工 select * from 'employee' order by 'salary' desc limit 3; -- 取得所有員工名字 select 'name' from 'employee'; -- 取得所有員工性別(不重複) 加 distinct select distinct 'sex' from 'employee'; - 列出 column 中不重複的值 SELECT DISTINCT column FROM table_name; -- 列出 column_1 且 column_2 不重複的值(會結合 column_1 和 column_2) SELECT DISTINCT column_1, column_2, ... FROM table_name; -- SELECT DISTINCT ON (column1) column_alias FROM table_name ORDER BY column1, column2; ``` ## 聚合函數 ```sql= -- 取得員工人數(*換成employee的其他欄位也可) select count(*) from 'employee'; -- 取得出生於1970-01-01 之後的女性員工人數 select count(*) from 'employee' where 'birth_date' > '1970-01-01' and 'sex'= 'F' SELECT column1, column2, … FROM table_name WHERE condition; -- =:等於 -- > -- < -- >= -- <= -- <> 不等於 -- BETWEEN -- LIKE -- IN -- -- 驗證是否有重複資料 SELECT COUNT(column1) FROM table_name; SELECT COUNT(DISTINCT column1) FROM table_name -- Select中再Select SELECT Count(*) AS DistinctCountries FROM (SELECT DISTINCT column1 FROM table_name); -- 取得員工人數平均薪水 select avg('salary') from 'employee'; -- 取得員工人數總和薪水 select sum('salary') from 'employee'; -- 取得員工薪水最高者 select max('salary') from 'employee'; -- 取得員工薪水最低者 select min('salary') from 'employee'; ``` ## wildcards 萬用字元 %代表多個字元, _代表一個字元 ``` sql= -- 取得電話號碼尾數是 335 的客戶 select * from 'cilent' where 'phone' like '%335'; -- 取得電話號碼開頭是 254 的客戶 select * from 'cilent' where 'phone' like '254%'; -- 取得生日在12月的員工 select * from 'cilent' where 'birthday' like '_____12%'; -- group by 進行分組 SELECT column_1, aggregate_function(column_2) FROM table GROUP BY column_1; ``` ## union 聯集(把兩個搜尋的結果合併一起) ``` sql= -- 1.員工名字 union 客戶名字(把3個搜尋的結果合併一起) select 'name' from 'employee' union select 'client_name' from 'client' union select 'branch_name' from 'branch' -- 2.員工id+員工名字 union 客戶id+客戶名字 -- as... 將合併後的表欄位名稱改成... select 'employee_id' as 'total_id','name' as total_name from 'employee' union select 'client_id','client_name' from 'client' ``` ## join 連接 ``` sql= -- 取得所有部門的名字 select * from 'employee' join 'brach' on 'employee'.'emp_id'= 'brach'.'manager_id'; -- left join(左邊的表格不管條件有無成立,都會回傳所有資料給我們) select 'employee'.'emp_id', 'employee'.'name', 'brach'.'branch_name' from 'employee' left join 'branch' on 'employee'.'emp_id'='branch'.'manager_id'; -- right join(右邊的表格不管條件有無成立,都會回傳所有資料給我們) select 'employee'.'emp_id', 'employee'.'name', 'brach'.'branch_name' from 'employee' right join 'branch' on 'employee'.'emp_id'='branch'.'manager_id'; ``` ## subquery 子查詢 ## on delect ## 建立資料庫 ```sql= CREATE DATABASE `sql_tutorial`; SHOW databases; USE `sql_tutorial`; CREATE TABLE `student`( `student id` INT, `name` VARCHAR(20), `major` VARCHAR(20), PRIMARY KEY(`student id`) ); DESCRIBE `student`; DROP TABLE `student`; ALTER TABLE `student` ADD gpa decimal(3,2); ALTER TABLE `student` DROP COLUMN gpa; INSERT INTO `student` VALUES(3,'小綠',NULL); INSERT INTO `student` (`name`,`major`,`student id`) VALUES(NULL,'英語',5); INSERT INTO `student` (`name`,`major`,`student id`) VALUES('小紅','英語',5); INSERT INTO `student` (`name`,`major`,`student id`) VALUES('小綠','歷史',6); DROP TABLE `student`; SELECT * FROM `student`; -- constraints 限制 約束 CREATE TABLE `student`( `student id` INT, `name` VARCHAR(20) NOT NULL, `major` VARCHAR(20) UNIQUE, PRIMARY KEY(`student id`) ); CREATE TABLE `student`( `student id` INT AUTO_INCREMENT, `name` VARCHAR(20) NOT NULL, `major` VARCHAR(20) DEFAULT '歷史', PRIMARY KEY(`student id`) ); INSERT INTO `student`(`name`,`major`)VALUES('小白','英語'); INSERT INTO `student`(`name`,`major`)VALUES('小綠','國文'); INSERT INTO `student`(`name`,`major`)VALUES('小黑','數學'); ``` ## 修改 刪除資料 ```sql= SET SQL_SAFE_UPDATES=0; CREATE TABLE `student`( `student id` INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(20) NOT NULL, `major` VARCHAR(20), `score` INT ); INSERT INTO `student`(`name`,`major`, `score`)VALUES('小白','數學',84); INSERT INTO `student`(`name`,`major`, `score`)VALUES('小a','國文',86); INSERT INTO `student`(`name`,`major`, `score`)VALUES('小b','英語',81); INSERT INTO `student`(`name`,`major`, `score`)VALUES('小c','英語',81); SELECT * FROM `student`; UPDATE `student` SET `major` ='英語文學' WHERE `student id`= 3 OR `major` =`化學`; UPDATE `student` SET `name` ='小灰', `major`='物理' WHERE `student id`= 1; DELETE FROM `student` WHERE `student id`= 2; DELETE FROM `student`; ``` ## 取得資料 ```sql= select * FROM `student` ORDER BY `score` ; select * FROM `student` LIMIT 1; select * FROM `student` WHERE `major` ='英語' and `score`<>81; select * FROM `student` WHERE `major` IN('歷史','英語','生物'); ```