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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Oracle SQL基本操作 Oracle数据库基本操作 1.概述 Oracle数据库客户端一般需要安装在服务器上...
    横竖撇捺啊阅读 569评论 0 1
  • SQL语言基础 本章,我们将会重点探讨SQL语言基础,学习用SQL进行数据库的基本数据查询操作。另外请注意本章的S...
    厲铆兄阅读 5,388评论 2 46
  • 1 安装MySQL 进入MySQL官网,登录 如何在Macbook上安装MySQL_百度经验 我之后改了个,怕忘记...
    乔大叶_803e阅读 639评论 0 0
  • 目录 简介 在Android中存储数据有时会用到数据库,Android给我们提供了 一系列的API来操作数据库,非...
    慕涵盛华阅读 1,068评论 1 2
  • ##本单元目标 一、为什么要学习数据库 二、数据库的相关概念 DBMS、DB、SQL 三、数据库存储数据的特点...
    kevinXiao阅读 516评论 0 0