终极 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 备忘单