終極 SQL 備忘單,供以後使用 [2022]
已發表: 2022-06-17SQL 或結構化查詢語言是一組用於管理關係數據庫操作(如刪除、創建、更新、讀取等)的命令。
自 1987 年以來,SQL 一直是關係數據庫使用的國際標準。SQL 命令有四種類型:
- 數據定義語言 (DDL) – 這些命令定義數據庫的結構。 例如,刪除、重命名、更改和創建。 它們影響數據庫結構。 例如,創建數據庫或重命名表。
- 數據操作語言 (DML) – 這些命令用於處理數據。 例如,插入、選擇、更新、刪除。 這些不會影響表或數據庫結構,但會影響表中存在的數據。 例如,插入新行或更新行中的值。
- 事務控制語言 (TCL) – 這些命令控制數據庫中的事務處理。 例如,回滾、保存、提交。 這些命令對數據庫有永久影響。 例如,即使一個進程失敗,也將整個事務回滾到之前的狀態。
- 數據控制語言 (DCL) – 數據控制命令用於授權用戶並僅向用戶或組授予必要的權限。 例如,一個用戶可以擁有隻讀權限,而另一個用戶可以擁有讀寫權限。 訪問控制是使用grant、deny 和revoke 命令完成的。
下面是包含最有用命令的 SQL 備忘單。 備忘單將幫助您使用正確的語法和預期的查詢結果快速引用所需的命令。 在本備忘單中,我們將重點放在 DDL 和 DML 命令上,因為其他兩種類型使用起來非常簡單。
數據定義和操作查詢
命令 | 描述 | 例子 |
添加 | 將列或約束(按指定)添加到現有表。 | ALTER TABLE employee ADD last_name varchar2(255); ALTER TABLE employee ADD CONSTRAINT emp_det PRIMARY KEY (id, last_name); ALTER TABLE employee ADD last_name varchar2(255); ALTER TABLE employee ADD CONSTRAINT emp_det PRIMARY KEY (id, last_name); |
更改表 | 更改指定的表以添加、更新或刪除表的列。 | ALTER TABLE employee ADD last_name varchar2(255); ALTER TABLE employee DROP COLUMN last_name; |
更改列 | 更改列的數據類型。 例如,要將employee 表的joining_date 列的類型從varchar2 更改為datetime。 | ALTER TABLE employee ALTER COLUMN joining_date datetime; |
全部 | 與 SELECT、WHERE 和 HAVING 一起使用的邏輯運算符,如果所有值都滿足子查詢條件,則返回 true | SELECT employee_name, joining_date from employee WHERE employee_id = ALL (select employee_id from department_details WHERE department = 'R&D'); |
和 | 僅當 WHERE 子句中的所有條件都滿足時才返回 true 的邏輯運算符。 | SELECT employee_name, salary from employee WHERE city = 'California' AND salary > 2000; |
任何 | 邏輯運算符; 如果即使有一個子查詢值滿足 where 子句中的條件,則返回 true | SELECT employee_id, employee_name from employee WHERE employee_id = ANY (select employee_id from department_details WHERE department = 'HR' OR department = 'R&D'); |
作為 | 在查詢執行之前為表或列創建別名,在多次使用該名稱時很有用,尤其是在表連接期間 | SELECT count(employee_id) AS employees_from_houston from employee WHERE city = 'Houston'; |
ASC | 以asc結束順序返回數據,與 ORDER BY 子句一起使用。 ORDER BY 本身默認按升序對結果進行排序。 | SELECT employee_name, joining_date, salary from employee ORDER BY employee_name ASC; |
之間 | 選擇範圍內的值 | SELECT employee_name, joining_date, department_id from employee WHERE salary BETWEEN 40000 AND 100000; |
案子 | 由一組語句組成; 返回為真的語句的值,如果不滿足任何條件,則執行 ELSE 部分中的條件。 如果沒有 else,則返回 NULL。 | SELECT order_amount, customer_id, contact_email CASE WHEN order_amount > 3000 THEN "Eligible for 40% discount" WHEN order_amount between 2000 and 3000 THEN "Eligible for 25% discount" ELSE "Eligible for 5% discount" END FROM order_details; |
創建數據庫 | 創建具有指定名稱的新數據庫 | CREATE DATABASE movies_development; |
創建表 | 使用指定的表名和列名和類型創建一個新表 | CREATE TABLE movie_info (movie_name varchar2(255), release_date datetime, lead_actor varchar2(255), music_director varchar2(255)); |
默認 | 為指定列設置默認值,與 CREATE 或 ALTER TABLE 命令一起使用 | CREATE TABLE employee (joining_date SET DEFAULT CURRENT_DATE); ALTER TABLE product ALTER is_available SET DEFAULT true; |
刪除 | 從指定表中刪除數據 | DELETE from employee where employee_id = 345; |
DESC | 以 de sc結束順序返回數據,與 ORDER BY 子句一起使用。 | SELECT employee_name, joining_date, salary from employee ORDER BY employee_name DESC; |
刪除列 | 從指定表中刪除指定列。 | ALTER TABLE employee DROP COLUMN employee_name; |
刪除數據庫 | 刪除整個數據庫 | DROP DATABASE movies_development; |
刪除默認值 | 刪除指定列的默認值 | ALTER TABLE employee ALTER COLUMN is_available DROP DEFAULT; |
刪除表 | 刪除指定的表 | DROP TABLE employee; |
存在 | 檢查子查詢中是否存在記錄,如果找到一個或多個結果,則返回 true。 | SELECT employee_id, contact_number FROM employee WHERE EXISTS (SELECT employee_id, department FROM department WHERE employee_id = 345 AND department = 'HR'); |
從 | 指定應從中選擇或刪除數據的表 | SELECT * FROM employee; DELETE FROM employee where employee_id = 345; |
通過...分組 | 根據指定列對數據進行分組,用於聚合函數 | 顯示每個國家/地區的員工人數SELECT COUNT(employee_id), country from employee GROUP BY country; 顯示每個部門員工的平均評分 SELECT AVG(rating), department from employee GROUP BY department; |
在 | 用於在 WHERE 子句中一次選擇多個值,而不是使用多個 OR 條件 | SELECT employee_name FROM employee WHERE country IN ('India', 'United Kingdom', 'Singapore', 'Australia'); |
指數 | 索引使查詢數據更加高效和快捷。 索引通常是在搜索最多的列上創建的。 | 創建索引:CREATE INDEX idx_employee ON employee (first_name, last_name); 創建一個值不能重複的唯一索引: CREATE UNIQUE INDEX idx_employee ON employee (first_name, last_name); 刪除索引: ALTER TABLE employee DROP INDEX idx_employee; |
插入 | 在表格中添加新行 | INSERT INTO employee (employee_id, employee_name, salary, core_skill) VALUES (451, 'Lee Cooper', 40000, 'Java'); |
一片空白 | 檢查空值 | SELECT employee_id from employee where employee_name IS NULL; |
不為空 | 檢查不為空的值 | SELECT employee_id, core_skill from employee where core_skill IS NOT NULL; |
喜歡 | 返回與給定模式匹配的所有值 | SELECT employee_id, first_name, last_name where first_name LIKE '%tony'; |
不喜歡 | 返回與給定模式不匹配的所有值 | SELECT employee_id, first_name, last_name where first_name NOT LIKE '%tony'; |
或者 | 如果滿足 where 子句中的條件之一,則返回 true | SELECT * from employee where country = 'India' OR country = 'Australia'; |
訂購方式 | 以升序(默認)或查詢中指定的順序( asc結尾或desc結尾)對結果進行排序 | SELECT employee_name, salary from employee ORDER BY salary DESC; |
行號 | 返回查詢的 WHERE 子句中提到的指定行數 | SELECT * from employee where ROWNUM <= 5; This will return the first five rows in the resultset. |
選擇 | 根據給定條件選擇表中提到的列。 如果指定 *,則返回所有列值。 | SELECT employee_id from employee; SELECT * from employee; |
選擇進入 | 將數據從源表複製到另一個目標表。 您可以選擇所有列 (*) 或特定列。 | SELECT * INTO new_employee_info FROM employee; SELECT employee_name, joining_date, core_skill INTO new_employee_info FROM employee; |
選擇頂部 | 從表中選擇指定數量的記錄 | SELECT TOP 5 employee_id from employee where employee_rating = 5; |
放 | 在 UPDATE 操作期間將列的值設置為新的指定值。 | UPDATE employee SET first_name = 'Tony' WHERE employee_id = 345; |
一些 | 如果滿足子查詢中的條件之一,則返回 true。 SOME 類似於 ANY 命令。 | SELECT employee_id, employee_name from employee WHERE salary > SOME (select salary from employee WHERE department = 'HR'); |
截斷表 | 從表格中刪除數據——記住表格不會被刪除。 | TRUNCATE TABLE log_info; |
聯盟 | 從連接的 2 個或更多表中返回不同的值。 要獲取重複值,請使用 UNION ALL。 | SELECT city from employee UNION SELECT city from office_locations; |
獨特的 | 向指定列添加唯一約束,這意味著該列不能有重複值。 可以在 table create 或 alter 命令期間使用。 | CREATE TABLE employee (employee_id int NOT NULL, UNIQUE(employee_id)); ALTER TABLE employee ADD UNIQUE(employee_id); |
更新 | 用新值更新指定列的值 | UPDATE employee SET first_name = 'Tony' WHERE employee_id = 345; |
價值觀 | 與 INSERT 命令一起使用,將新的一行值添加到表中 | INSERT INTO employee (employee_id, employee_name, salary, core_skill) VALUES (451, 'Lee Cooper', 40000, 'Java'); |
在哪裡 | 添加條件以過濾 select 語句的結果集 | SELECT * from employee WHERE salary > 20000; |
聚合函數
聚合函數是適用於 int 和 float 等數值列的數據操作命令。 這些有助於在數據庫級別本身過濾和排序數據。 一些常用的聚合函數有:

功能 | 描述 | 例子 |
平均 | 返回指定列的平均值 | SELECT AVG(marks) from students where subject = 'English'; |
最小 | 返回指定列的最小值 | SELECT MIN(price) from product WHERE product_category = 'shoes'; |
最大限度 | 返回指定列的最大值 | SELECT MAX(quantity), product_name from inventory; |
數數 | 返回滿足查詢的行數 | 顯示員工表中的記錄總數。SELECT COUNT(*) from employee; 顯示工資大於20000的員工數量 SELECT COUNT(*) from employee where salary > 20000; |
和 | 返回指定數值列的值的總和 | SELECT SUM(marks) from students where subject = 'English'; |
SQL 連接
SQL 連接非常重要,因為它們連接和過濾來自多個表的數據。 連接有點棘手,如果沒有正確執行,可能會產生意想不到的結果。 下表將幫助您快速參考這 4 種 SQL 連接:
加入類型 | 描述 | 句法 | 例子 |
內部聯接 | 返回在加入的表中匹配的記錄; 它類似於十字路口。 | SELECT column1, column2… from table1 INNER JOIN table2 on table1.columnN = table2.columnN; | select c.customer_id, o.order_id, c.customer_phone from customer c INNER JOIN order o on c.customer_id = o.customer_id; |
全(外)連接 | 返回在任一側(左側或右側)具有匹配項的所有記錄。 它類似於工會。 | SELECT column1, column2… from table1 FULL OUTER JOIN table2 on table1.columnN = table2.columnN; | select c.customer_id, o.order_id, c.customer_phone from customer c FULL OUTER JOIN order o on c.customer_id = o.customer_id; |
左連接 | 返回左表的所有記錄和右表匹配條件的記錄 | SELECT column1, column2… from table1 LEFT JOIN table2 on table1.columnN = table2.columnN; | select c.country_id, c.country_name, l.location_name from country c LEFT JOIN locations l on c.country_id = l.country_id; |
右加入 | 返回右表中的所有記錄以及與左表中的條件匹配的記錄 | SELECT column1, column2… from table1 RIGHT JOIN table2 on table1.columnN = table2.columnN; | select c.country_id, c.country_name, l.location_name from country c RIGHT JOIN locations l on c.country_id = l.country_id; |
其他資源
SQL 是軟件開發人員、數據科學家和分析師等人的重要工具。 以備忘單的形式方便地參考 SQL 命令可以為您節省大量時間,並幫助您了解每個關鍵字的預期輸出。
有關其他信息,請參閱以下資源:
SQL 教程:SQL 備忘單
Intellipaat:SQL 命令備忘單
網站設置:SQL 備忘單
ProgrammingWithMosh:SQL 備忘單
PostgreSQL 備忘單