概念:
关键词(KeyWord):SQL组成部分的保留字。关键字不能用作表或列的名字。
⚠️ 多条SQL语句必须以分号(;)分隔。
⚠️ SQL语句不区分大小写
1 SELECT 操作
表达式:SELECT <列名>,... FROM <表名>;
查询所有列:SELECT * FROM employees;
查询特定列:SELECT name, salary FROM employees;
1.1 检索不同的值:使用 DISTINCT 关键词
查询某一列的不同值:SELECT DISTINCT ids FROM employees;
⚠️ DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。
1.2 限制结果:使用 LIMIT 子句(在 MYSQL 中)
⚠️ 针对不同的 DBMS,限制的语法不同,例如“查询前 5 行数据”:
SQL Server/Access:SELECT TOP 5 salary FROM employees;
DB2:SELECT salary FROM employees FETCH FIRST 5 ROWS ONLY;
Oracle:SELECT salary FROM employees WHERE ROWNUM <=5;
MySQL/PostgreSQL/MariaDB:SELECT salary FROM employees LIMIT 5;
1.3 排序检索的数据:使用 ORDER BY 子句
按特定列排序:SELECT name, salary FROM employees ORDER BY name;
多列排序:SELECT name, salary FROM employees ORDER BY name, salary;
按列位置排序:SELECT id, name, salary FROM employees ORDER BY 2, 3;(按照查询结果中第二列和第三列的值进行排序)
在标准的 SQL 查询中,子句的顺序通常是固定的,但当涉及到 LIMIT 或 OFFSET 时,情况会稍有不同。以下是更准确的顺序:
1. SELECT:指定要返回的列。
2. FROM:指定数据来源的表。
3. WHERE:指定过滤条件。
4. GROUP BY:对结果进行分组。
5. HAVING:对分组后的结果进行过滤。
6. ORDER BY:对结果进行排序。
7. LIMIT/OFFSET:限制返回的行数或跳过行数。
⚠️ 在多列排序中,允许你在第一列的值相同时,根据第二列(或更多列)进行进一步排序。
1.4 在检索时指定排序方向:使用 ASC/DESC 关键词
升序排序(从A到Z):默认的排序顺序,关键字是ASC
降序排序(从Z到A):必须指定 DESC 关键字
按特定列降序:SELECT name, salary FROM employees ORDER BY name DESC;
多个列排序,特定列降序:SELECT name, salary FROM employees ORDER BY name DESC, salary;
⚠️ 如果想在多个列上进行降序排序,必须对每一列指定DESC关键字。
1.5 在检索时过滤数据:使用 WHERE 子句
在 SQL 查询中,WHERE子句的作用是根据指定的条件过滤数据,从而只返回满足条件的记录。WHERE子句通常位于 FROM子句之后,用于在查询过程中筛选出符合特定条件的数据。
表达式:SELECT <列名>,... FROM <表名> WHERE <条件表达式>;
WHERE子句操作符(并非所有DBMS都支持这些操作符):
查询特定条件:SELECT name, salary FROM employees WHERE name = 'JOhn';
查询不匹配条件:SELECT name, salary FROM employees WHERE name <> 'JOhn';
范围值查询:SELECT name, salary FROM employees WHERE salary BETWEEN 5 AND 10;
查询某列是否存在空值:SELECT name, salary FROM employees WHERE salary IS NULL;
⚠️ !=和<>都表示不等于,通常可以互换。但并非所有 DBMS 都支持这两种操作符,具体需要查阅相应文档。
WHERE子句的组合:以AND子句或OR子句的方式使用。
查询满足某些特定条件:SELECT name, salary FROM employees WHERE name = 'JOhn' AND salary <= 10;
查询满足某些特定条件之一:SELECT name, salary FROM employees WHERE name = 'JOhn' OR salary <= 10;
如果没有适当使用括号来明确指定运算的顺序,可能会导致逻辑错误:
1. 逻辑运算符优先级
2. 括号使用不当
3. 逻辑短路
4. 性能问题
WHERE子句:IN操作符
IN操作符:指定条件范围,范围中的每个条件都可以进行匹配。
IN取一组由逗号分隔、括在圆括号中的合法值。
SELECT name, salary FROM employees WHERE name IN ('John','Amy');
WHERE子句:NOT操作符
NOT操作符:否定其后所跟的任何条件。
NOT从不单独使用,它总是与其他操作符一起使用。以下两者等价:
SELECT name, salary FROM employees WHERE NOT name = 'John';
SELECT name, salary FROM employees WHERE name <> 'John';
1.6 在检索时过滤数据:LIKE 操作符
之前所有操作符都是针对已知值进行过滤的,但 LIKE 操作符不是。
通配符(wildcard) :用来匹配值的一部分的特殊字符。
搜索模式(search pattern) :由字面值、通配符或两者组合构成的搜索条件。
通配符:
百分号(%):任何字符出现任意次数
下划线(_):它只匹配单个字符,而不是多个字符
⚠️ DB2 不支持 _,Microsoft Access 使用的是 ? 而不是 _
方括号([]):指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符
找出所有以词 Fish 起头的名字:SELECT name FROM employees WHERE name LIKE 'FISH%';
找出所有名字含有 Fish 的名字:SELECT name FROM employees WHERE name LIKE '%FISH%';
找出所有名字以 Fish 结尾,长度为 6 的名字:SELECT name FROM employees WHERE name LIKE '__FISH';
找出所有名字以 J 或 M 起头的人:SELECT name FROM employees WHERE name LIKE '[JM]%';
找出所有名字不以 J 或 M 起头的人:SELECT name FROM employees WHERE name LIKE '[^JM]%';
⚠️ 子句WHERE prod_name LIKE '%'不会匹配产品名称为NULL的行。
我是一个失业的95后算法工程师,正在重新梳理我的知识体系!