3.4 数据查询

 

思维导图:

 

前言:

---

### 概述
- 数据查询是数据库操作的核心,主要通过SQL中的`SELECT`语句来实现。
- `SELECT`语句提供了非常丰富的查询功能,包括单表查询、多表连接查询和嵌套查询等。

### SELECT语句的基本格式

SELECT [ALL|DISTINCT] <目标列表达式>[, <目标列表达式>...]
FROM <表名或视图名>[, <表名或视图名>...]
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];

### 主要组成部分

1. **SELECT子句**
    - 用于指定要返回的列。可选择所有列(`*`)或指定的列。
    - `ALL`(默认)返回所有匹配的记录,而`DISTINCT`返回唯一的记录。

2. **FROM子句**
    - 指定查询来源的基本表、视图或派生表。
    - 可包含多个表或视图,之间用逗号分隔。

3. **WHERE子句**
    - 定义查询的筛选条件,只有满足条件的记录才会被返回。

4. **GROUP BY子句**
    - 用于将结果按指定的列值分组,该列值相同的记录被视为一个组。
    - 通常与聚合函数(如SUM, AVG等)结合使用。

 

5. **HAVING子句**
    - 对GROUP BY分组后的组进行筛选,只返回满足条件的组。

6. **ORDER BY子句**
    - 对查询结果进行排序。默认为升序(ASC),也可选择降序(DESC)。

### 注意事项
- `GROUP BY`和`HAVING`通常结合使用,但`HAVING`必须在`GROUP BY`之后。
- `ORDER BY`子句始终放在SELECT语句的最后。

### 实例分析
以学生-课程数据库为例,可以进行各种查询,如简单的单表查询、多表连接查询以及更复杂的嵌套查询。

 

---

**结论**:`SELECT`语句是SQL中的核心,其功能丰富而灵活,能满足各种复杂的查询需求。掌握其使用方法和注意事项是进行有效数据查询的关键。

 3.4.1 单表查询

**3.4.1 单表查询**

---

### 概述
- 单表查询只涉及一个表的查询操作。
- 它可以通过选择表中的全部或部分列来实现。

### 查询内容

1. **选择指定的列**
    - 如果用户只对某几列感兴趣,可以在SELECT子句的<目标列表达式>中指定要查询的列。
    - 示例:
   

        SELECT Sno, Sname FROM Student;


        从`Student`表中选择学号与姓名。

2. **选择所有列**
    - 查询表的所有列可以简单地用`*`来表示。
    - 示例:
 

     SELECT * FROM Student;


        与
   

    SELECT Sno, Sname, Ssex, Sage, Sdept FROM Student;


        这两条语句是等价的,都查询学生表的所有信息。

3. **查询计算值**
    - <目标列表达式>可以是表达式,如算术表达式、函数等。
    - 示例:
     

      SELECT Sname, 2014 - Sage FROM Student;


        查询学生的姓名和出生年份。

       

      SELECT Sname, 'Year of Birth:', 2014 - Sage, LOWER(Sdept) FROM Student;


        这里不仅用了算术表达式,还转换了系名为小写形式。

4. **指定列的别名**
    - 为查询的列指定别名可以使查询结果更具可读性。
    - 对于包含计算、函数等的列尤为有用。
    - 示例:
     

        SELECT Sname AS NAME, 'Year of Birth:' AS BIRTH, 2014 - Sage AS BIRTHDAY, LOWER(Sdept) AS DEPARTMENT FROM Student;

### 要点总结
- 单表查询通常是数据库查询的基础,可以选择表的部分列或所有列。
- 通过算术运算、函数和字符串操作,可以在查询中实现丰富的数据处理功能。
- 为查询结果指定列的别名可以增加结果的可读性。

---

**结论**:单表查询虽然简单,但它是数据库查询的基础。掌握这一部分的知识,对于进行更复杂的查询至关重要。

**第3章 关系数据库标准语言SQL**
---

**3.4.2 选择表中的若干元组**

---

 ### ②确定范围
- 使用`BETWEEN...AND...`与`NOT BETWEEN...AND...`来筛选属性值在指定范围内或外的元组。
    - 示例:
     

   SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23;
        SELECT Sname, Sdept, Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;

### ③确定集合
- 使用`IN`与`NOT IN`谓词来筛选属性值在指定集合内或外的元组。
    - 示例:
     

        SELECT Sname, Ssex FROM Student WHERE Sdept IN ('CS', 'MA', 'IS');
        SELECT Sname, Ssex FROM Student WHERE Sdept NOT IN ('CS', 'MA', 'IS');

### ④字符匹配
- 使用`LIKE`谓词进行字符串匹配。
    - `%`代表任意长度的字符串。
    - `_`代表任意单个字符。
    - 示例:
     

     SELECT * FROM Student WHERE Sno LIKE '201215121'; //等同于 SELECT * FROM Student WHERE Sno = '201215121';
        SELECT Sname, Sno, Ssex FROM Student WHERE Sname LIKE '刘%';
        SELECT Sname FROM Student WHERE Sname LIKE '欧阳_'; //注意字符集。
        SELECT Sname, Sno FROM Student WHERE Sname LIKE '_阳%';
        SELECT Sname, Sno, Ssex FROM Student WHERE Sname NOT LIKE '刘%';


    - 如果匹配字符串包含`%`或`_`,使用`ESCAPE`进行转义。
    - 示例:
   

   SELECT Cno, Ccredit FROM Course WHERE Cname LIKE 'DB\_Design' ESCAPE '\';

---

**结论**:SQL提供了多种查询方法,使我们能够根据不同的标准筛选数据。无论是按范围、集合还是字符串模式进行选择,SQL都为我们提供了灵活且强大的筛选工具。

1. 区别化查询
   - 使用DISTINCT短语进行区别化查询。

注意:

课后习题3-03第二题考察了投影和SQL语言的转换关系,我当时没想到如果A和B分别是S#和Score这样的话表中如果直接SELECT就会出现大量冗余的元组,所以要用DISTINCT来筛除重复元组。这道题目其实就是再告诉我们,在转换过程中要注意重复元组避免冗余,而且检查答案的时候要把这个因素考虑在内。其次暴露了我考虑任意符号就是S(A,B,C,D)时候对任意理解的不足刚开始我只考虑到了S#和C#没有考虑SCORE ,收获不少。

2. 确定范围查询
   - 谓词`BETWEEN...AND...`和`NOT BETWEEN...AND...`用于范围内或范围外的属性值查找。

3. 确定集合查询
   - 谓词`IN`和`NOT IN`用于查找属性值是否属于指定集合。

4. **字符匹配**
   - 谓词`LIKE`用于字符串匹配,支持通配符%和_。使用`ESCAPE`进行转义。

5. **涉及空值查询**
   - `IS NULL`和`IS NOT NULL`用于查找空或非空的属性值。

6. **多重条件查询**
   - 逻辑运算符`AND`和`OR`连接多个查询条件。

7. **排序查询结果**
   - `ORDER BY`子句用于按属性列的升序(ASC)或降序(DESC)排列查询结果。

8. **聚集函数**
   - SQL提供了一系列的聚集函数,如`COUNT()`, `SUM()`, `AVG()`, `MAX()`, `MIN()`等。
   - 可以使用`DISTINCT`短语来排除重复值。

9. **分组查询**
   - `GROUP BY`子句按某一列或多列的值分组查询结果。
   - `HAVING`短语指定筛选条件对分组后的组进行筛选。

 

 

**重点示例笔记:**

- 查询年龄在20~23岁的学生信息:

  SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23;

- 查询计算机科学系、数学系和信息系学生的姓名和性别:
 

  SELECT Sname, Ssex FROM Student WHERE Sdept IN ('CS', 'MA', 'IS');

- 使用`LIKE`进行模糊查询姓刘的学生:

 SELECT Sname, Sno, Ssex FROM Student WHERE Sname LIKE '刘%';

- 聚集函数示例:查询学生总人数:
 

  SELECT COUNT(*) FROM Student;

- 分组查询示例:求各个课程号及相应的选课人数:

 SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno;

- 使用`HAVING`进行筛选: 查询选修了三门以上课程的学生学号:

  SELECT Sno FROM SC HAVING COUNT(Cno) > 3;

通过这章节的学习,应掌握SQL中的基础查询技巧,如范围、集合、模糊查询等,并了解如何使用聚集函数与分组来处理数据。

 
****GROUP BY与HAVING的使用**

**5. 分组查询** 

- 使用`GROUP BY`子句可以按一个或多个属性列的值对查询结果进行分组。

- 使用`HAVING`子句对分组后的数据进行筛选。

重点示例笔记:

- 查询选修了三门以上课程的学生学号:
 

  SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) > 3;


  说明:此查询首先使用`GROUP BY`子句按学生编号`Sno`对记录进行分组。然后,通过`HAVING`子句筛选出元组数量大于3的组,这意味着一个学生选择了超过三个课程。

- `WHERE`子句与`HAVING`子句的区别:
  - `WHERE`子句用于筛选基表或视图中的元组。
  - `HAVING`子句用于筛选通过`GROUP BY`子句产生的分组。

- 误用`WHERE`子句查询平均成绩为90的学生学号(不正确的方法):
 

 SELECT Sno, AVG(Grade) FROM SC WHERE AVG(Grade) = 90 GROUP BY Sno;


  说明:这是一个错误的示例,因为`WHERE`子句中不能使用聚集函数作为条件表达式。

- 正确查询平均成绩大于等于90的学生学号及其平均成绩:
 

 SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade) >= 90;


  说明:这是一个正确的查询,首先使用`GROUP BY`子句按学生编号`Sno`对记录进行分组,然后通过`HAVING`子句筛选出平均成绩大于或等于90的组。

通过本部分的学习,应加深对SQL中`GROUP BY`和`HAVING`子句的理解,知道如何正确地使用它们进行分组和筛选操作,并注意避免在`WHERE`子句中误用聚集函数。

 3.4.2 连接查询

**第3章 关系数据库标准语言SQL**

**3.4.2 连接查询**

连接查询用于从两个或更多的表中选择信息。这些查询类型包括等值连接、非等值连接、自然连接、自身连接、外连接和复合条件连接。

**1. 等值与非等值连接查询**

- 连接查询的`WHERE`子句中的条件称为连接条件或连接谓词。
  
  格式:
 

 [<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>

  其中比较运算符可以是`=、>、<、>=、<=、!=`。如果运算符为`=`,则称为等值连接。其他运算符为非等值连接。

  连接条件中的列称为**连接字段**。这些字段的类型必须是可以比较的,但名称可以不同。

- **例3.49**:查询学生及其选修的课程。

  SELECT Student.*, SC.*
  FROM Student, SC
  WHERE Student.Sno = SC.Sno;

  在此查询中,两个表通过学号(Sno)属性连接。输出结果将展示学生的全部信息和他们选修的课程。

  连接操作的执行方式是:逐一遍历`Student`表中的每个元组,然后从`SC`表中找到所有与当前`Student`元组有相同Sno的元组,并将它们合并。这个基本方法称为嵌套循环连接算法。

  如有索引,查询效率会提高,因为不需要完全扫描`SC`表。可以通过索引直接找到匹配的`SC`元组。

  自然连接是等值连接的一个特例,其中结果中删除了重复的列。

- **例3.50**:使用自然连接查询学生及其选修的课程。

  SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
  FROM Student, SC
  WHERE Student.Sno = SC.Sno;

  在此查询中,只选择了一次学号(Sno)。

- SQL允许在一条语句中同时执行选择和连接查询。`WHERE`子句可以由连接谓词和选择谓词组合而成。

- **例3.51**:查询选修了2号课程并且成绩超过90分的学生的学号和姓名。

  SELECT Student.Sno, Sname
  FROM Student, SC
  WHERE Student.Sno = SC.Sno 
  AND SC.Cno = '2' 
  AND SC.Grade > 90;

  优化这种查询的一种方法是首先从`SC`表中选择满足条件的元组,然后再与`Student`表中的元组连接。

**总结**:
连接查询是关系数据库中的核心查询之一,允许我们从多个表中获取信息并将它们组合在一起。正确地使用连接查询,特别是当涉及大数据集时,对于查询性能至关重要。

**3.4.2 连接查询笔记摘要**

**总述**: 
连接查询允许我们从两个或多个表中同时检索数据。这是关系数据库中非常常见和重要的查询。

**主要连接查询类型**:
- 等值连接

- 非等值连接
- 自然连接
- 自身连接
- 外连接

1. **等值与非等值连接查询**
    - 用于连接两个表的条件称为连接条件或连接谓词。
    - 等值连接使用=作为比较运算符,而非等值连接使用其他比较运算符。

2. **自身连接**
    - 表可以与其自身进行连接。
    - 主要用于查找与表中相同的属性关联的数据。
    
3. **外连接**


    - 当不满足连接条件的元组时,外连接允许结果仍然包括它们。
    - 左外连接:包含左侧表中的所有元组。
    - 右外连接:包含右侧表中的所有元组。
    
示例与解释:
1. 通过Student和SC两个表的连接查询,通过学生编号(Sno)连接两个表并选择相关信息。
2. 自身连接的例子是从Course表中找出间接先修课,这需要将Course表与其自身连接。
3. 使用外连接,我们可以从主表(如Student)检索所有学生的数据,即使其中一些学生在另一个表(如SC)中没有对应的数据。

注意:
1. 在进行连接查询时,为了避免混淆,最好为属性名添加表名前缀。
2. 为了提高查询性能,可以为表上的关键列建立索引。

**定义**:
- **多表连接**,如其名所示,涉及两个以上的表进行连接。
- 连接操作不限于两表连接或自身连接,可以扩展到多个表。

**关键点**:
1. 当执行多表连接时,查询的效率和性能可能会受到影响。因此,设计合适的连接策略和优化技巧很重要。
2. 通常情况下,关系数据库管理系统首先进行两个表的连接,然后将结果与第三个(或更多)表进行连接。这样的策略是基于优化连接操作的效率。

**示例**:
- 为了查询每个学生的学号、姓名、选修的课程名及成绩,需要连接三个表:Student、SC和Course。示例查询如下:

 

SELECT Student.Sno, Sname, Cname, Grade
FROM Student, SC, Course
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;


  - 此查询首先基于学生编号(Sno)连接Student和SC表,然后使用课程编号(Cno)连接SC和Course表。
  
**实践建议**:
1. 当涉及多表连接时,确保连接条件清晰且明确,以避免产生笛卡尔乘积。
2. 尽量使用合适的索引和优化策略,以提高查询性能。
3. 在设计数据库时,确保表之间的关系设计得当,以便进行高效的多表连接。

总结:多表连接是数据库查询中的常见操作,尤其在复杂的业务逻辑中。理解其工作原理及如何优化其性能是关系数据库管理的核心组成部分。

 3.4.3 嵌套查询

**3.4.3 嵌套查询笔记摘要**

**定义**:
- **嵌套查询 (Nested Query)**:在SQL中,当一个查询块(SELECT-FROM-WHERE语句)被嵌入另一个查询块的WHERE子句或HAVING子句中时,被称为嵌套查询。
- 查询块分为:外层查询(父查询)和内层查询(子查询)。
  
**基本概念**:
1. **子查询**:在主查询内部的查询。其结果可以为单个值或值的集合。

2. **不相关子查询**:子查询的查询条件不依赖于父查询。
3. **相关子查询**:子查询的查询条件依赖于父查询。

**关键点**:
1. SQL语言允许多层嵌套查询,但子查询中不能使用ORDER BY子句。
2. 嵌套查询增强了SQL的查询能力,允许用户通过结构化方式构造复杂的查询。
3. IN谓词是嵌套查询中经常使用的,因为子查询的结果往往是一个集合。
  
**示例**:
- **例3.55**:查询与“刘晨”在同一个系学习的学生。
  - 子查询不依赖于父查询,因此先执行子查询,再使用结果构建父查询的查找条件。
  - 可以使用自连接或嵌套查询实现。

- **例3.56**:查询选修了课程名为“信息系统”的学生学号和姓名。
  - 需要连接Student、SC和Course表。
  - 可以使用嵌套查询或连接查询来实现。

实践建议:
1. 有些嵌套查询可以通过连接查询替代,但并非所有。
2. 相对于连接运算,当前的关系数据库管理系统对嵌套查询的优化还不够完善。因此,在实际应用中,能用连接运算表示的查询,应优先采用连接运算。
3. 设计数据库查询时,需要考虑查询效率。可能需要数据库编程人员具备一些数据库性能调优技术。

**总结**:嵌套查询为用户提供了构建复杂查询的能力。尽管它们在某些场景中非常有用,但在实际应用中,为了获取更好的性能,可能需要考虑其他查询策略,如连接查询。

 3.4.3 嵌套查询

**第3章 关系数据库标准语言SQL - 嵌套查询笔记**

---

**3.4.3 嵌套查询概述**
- **定义**: 嵌套查询是一个查询块内部还嵌有其他查询块。
    - 外层查询块称为 **父查询**。
    - 内层查询块称为 **子查询**。
- 嵌套查询可以实现多层次的查询逻辑。
- 子查询中不可以使用 **ORDER BY** 子句,只能在最外层使用。
- **结构化**: 通过嵌套查询,SQL 提供了结构化的程序设计。

**1. 带有IN谓词的子查询**
- 使用 **IN** 可以测试某个字段的值是否在一个集合中。
- 子查询如果不依赖父查询称为 **不相关子查询**。
- 示例:

   

    SELECT Sno, Sname, Sdept
    FROM Student
    WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname='刘晨');

**2. 带有比较运算符的子查询**
- 当子查询返回单值时,可以使用常见的比较运算符。
- 示例:

   SELECT Sno, Sname, Sdept
    FROM Student
    WHERE Sdept = (SELECT Sdept FROM Student WHERE Sname='刘晨');

问题: 


- **相关子查询**: 当子查询依赖父查询时,称为相关子查询。
    - 示例:

   SELECT Sno, Cno
        FROM SC x
        WHERE Grade >= (SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno);

**3. 带有ANY(SOME)或ALL谓词的子查询**
- 当子查询返回多值时,可以使用 **ANY** 或 **ALL** 进行比较。
- **ANY (SOME)**: 与子查询返回的某个值进行比较。
- **ALL**: 与子查询返回的所有值进行比较。
- 示例 (ANY):
   

  SELECT Sname, Sage
    FROM Student
    WHERE Sage < ANY (SELECT Sage FROM Student WHERE Sdept='CS')
    AND Sdept != 'CS';


- 示例 (ALL):

 SELECT Sname, Sage
    FROM Student
    WHERE Sage < ALL (SELECT Sage FROM Student WHERE Sdept='CS')
    AND Sdept != 'CS';

**建议**: 虽然可以使用嵌套查询来实现多关系的查询,但很多关系数据库优化器对于嵌套查询的优化不够完善。因此,实际应用中应尽量使用连接查询。当然,根据实际情况和数据库的性能,可以选择合适的查询方式。

---

**总结**: 嵌套查询提供了在SQL中实现复杂逻辑的能力,不过需要根据实际情况和查询的复杂性来选择最佳的查询方法,以保证查询性能和结果的准确性。

**第3章 关系数据库标准语言SQL**

---

**3.4 数据查询**

---

**ANY,ALL和IN谓词的等价关系**

- 表3.7展示了ANY(或SOME)、ALL谓词与聚集函数、IN谓词的等价转换关系。
  
  - =ANY 等价于 IN
  - !=ANY 或 ◇ANY 等价于 NOT IN
  - <ANY 等价于 <MAX
  - >ALL 等价于 >MIN
  - ... (类似地对应其他关系)

---

**EXISTS谓词与子查询**

- EXISTS是一个存在量词,用于检查子查询是否有结果返回。它不返回具体的数据,只返回逻辑真值“true”或逻辑假值“false”。
  
  - 例3.60: 查询所有选修了1号课程的学生姓名。
   

SELECT Sname
    FROM Student
    WHERE EXISTS
    (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno='1');

  - EXISTS引出的子查询通常用*作为目标列,因为只关心是否有返回值。

---

**NOT EXISTS谓词**

与EXISTS相反,当子查询没有返回结果时,NOT EXISTS返回真值。

  - 例3.61: 查询没有选修1号课程的学生姓名。
 

    SELECT Sname
    FROM Student
    WHERE NOT EXISTS
    (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno='1');

 

---

**使用EXISTS和NOT EXISTS的一些注意事项**

- 很多带IN、ANY、ALL的子查询都可以使用带EXISTS的子查询进行等价替换。

  - 例3.62: 查询选修了全部课程的学生姓名。

SELECT Sname
    FROM Student
    WHERE NOT EXISTS
    (SELECT * FROM Course
     WHERE NOT EXISTS
     (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno));

  - 例3.63: 查询至少选修了学生201215122选修的全部课程的学生号码。
   

 SELECT DISTINCT Sno
    FROM SC SCX
    WHERE NOT EXISTS
    (SELECT * FROM SC SCY
     WHERE SCY.Sno='201215122'
     AND NOT EXISTS
     (SELECT * FROM SC SCZ
      WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno));

---

3.4.5 基于派生表的查询

---

当子查询位于FROM子句中,它会生成一个临时的派生表(derived table),而该派生表会作为主查询的查询对象。以下是对基于派生表查询的简明笔记:

1. **派生表的定义**:
    - 当子查询出现在FROM子句中,它创建一个临时的派生表。
    - 这个派生表可以作为主查询的查询对象。

2. **使用场景示例**:
    
    - **例1**:找出每个学生超过他自己选修课程平均成绩的课程号:
   

    SELECT Sno, Cno
        FROM SC, (SELECT Sno, Avg(Grade) FROM SC GROUP BY Sno) AS Avg_sc(avg_sno, avg_grade)
        WHERE SC.Sno = Avg_sc.avg_sno AND SC.Grade >= Avg_sc.avg_grade;


        解释:此查询首先创建一个名为Avg_sc的派生表,该表包含每个学生的学号及其平均成绩。接着,主查询将SC表与Avg_sc表连接起来,筛选出成绩超过平均成绩的课程号。

    - **例2**:查询所有选修了1号课程的学生姓名:
       

SELECT Sname
        FROM Student, (SELECT Sno FROM SC WHERE Cno='1') AS SC1
        WHERE Student.Sno = SC1.Sno;


        解释:这里,子查询为选修了1号课程的学生创建了一个派生表SC1。然后,主查询通过学号将Student表和SC1表连接,从而获取了学生姓名。

3. **命名和别名**:

    - 当通过FROM子句创建派生表时,尽管`AS`关键字可以省略,但派生表必须有一个别名。
    - 对于基本表,使用别名是可选的。

---

3.4.6 SELECT语句的一般格式

---

SELECT语句是SQL中最基础的查询语句,用于从一个或多个表中选择数据。以下是对SELECT语句的一般格式和其组成部分的笔记概述:

### **SELECT语句的基础格式**:

SELECT [ALL|DISTINCT] <目标列表达式> [AS 别名], ...
FROM <表名或视图名> [AS 别名], ... | (<SELECT语句>) [AS 别名]
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];

---

### **1. 目标列表达式的格式**:

- `*` : 选择所有列。
- `<表名>.*` : 选择指定表中的所有列。
- `COUNT([DISTINCT|ALL] *)` : 计数。
- `[<表名>.]<属性列名表达式>, ...` : 选择指定的列或列的计算结果。
  - 其中,<属性列名表达式>可以是属性列、聚集函数或常量之间的任意算术运算。

### **2. 聚集函数的格式**:

- `函数名([DISTINCT|ALL] <列名>)` : 应用聚集函数到指定列上。

### **3. WHERE子句的条件表达式的格式**:

- `<属性列名> <比较符> <值>` : 基本比较。
- `<属性列名> [ANY|ALL] (SELECT语句)` : 子查询与ANY或ALL结合的比较。
- `<属性列名> [NOT] BETWEEN <值1> AND <值2>` : 范围比较。
- `<属性列名> [NOT] IN (<值列表> 或 SELECT语句)` : 列表比较。
- `<属性列名> [NOT] LIKE <匹配模式>` : 模式匹配。
- `<属性列名> IS [NOT] NULL` : NULL值检查。
- `[NOT] EXISTS (SELECT语句)` : 存在性检查。
- `{<条件表达式>}` : 其他复合条件表达式。

---

这些笔记提供了SELECT语句的一般格式和各个组成部分的详细解释。它们应该帮助你更好地理解和构造SQL SELECT查询。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值