SQL:SELECT 操作

概念:

关键词(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后算法工程师,正在重新梳理我的知识体系!

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容