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