終極 SQL 備忘單,供以後使用 [2022]

已發表: 2022-06-17

SQL 或結構查詢語言是一組用於管理關係數據庫操作(如刪除、創建、更新、讀取等)的命令。

自 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';
ASCasc結束順序返回數據,與 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;
用於快速參考的 SQL 命令備忘單

聚合函數

聚合函數是適用於 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 備忘單