--- title: "10-单表与条件查询" created: 2026-01-07 tags: - 项目筑基 --- # 单表与条件查询 ### **7.5 SELECT 查询数据** #### **7.5.1 查看表的结构** ```sql -- MySQL 方式 DESCRIBE 教师; -- 或简写 DESC 教师; -- 查看建表语句 SHOW CREATE TABLE 教师; ``` #### **7.5.2 关系代数基础** ![[image-aa32dd26.png]] **辅助运算符:** | **类型** | **运算符** | | --- | --- | | 算术运算符 | `+`、`-`、`*`、`/` | | 比较运算符 | `>`、`>=`、`<`、`<=`、\=、`<>`(或`!=`) | | 逻辑运算符 | `NOT`、`AND`、`OR` | | 包含运算符 | `IN`、`NOT IN` | ### **7.6 单表查询** #### **7.6.1 基本查询** ##### **查询表内全部信息** ```sql SELECT * FROM 学院; ``` ##### **查询某些特定的列** ```sql SELECT 学院名称, 学院电话 FROM 学院; ``` ##### **查询并去掉重复行** ```sql -- DISTINCT 去重 SELECT DISTINCT 职称 FROM 教师; -- 多列去重(组合唯一) SELECT DISTINCT 学院编号, 职称 FROM 教师; ``` #### **7.6.2 字符串处理函数** ```sql -- MySQL 字符串函数 SELECT LEFT('Hello', 2), -- 'He' 左边2个字符 RIGHT('Hello', 3), -- 'llo' 右边3个字符 TRIM(' Hello '), -- 'Hello' 去除两端空格 LTRIM(' Hello'), -- 'Hello' 去除左边空格 RTRIM('Hello '), -- 'Hello' 去除右边空格 LENGTH('Hello'), -- 5 字节长度 CHAR_LENGTH('你好'); -- 2 字符长度 ``` | **数据库** | **长度函数** | `'你好'`**的结果** | | --- | --- | --- | | **SQL Server** | `LEN('你好')` | 2 | | **MySQL** | `LENGTH('你好')` | 6(字节长度,UTF-8每汉字3字节) | | **MySQL** | `CHAR_LENGTH('你好')` | 2(字符长度) | > 💡 处理中文时推荐使用 `CHAR_LENGTH()` #### **7.6.3 列重命名(AS)** ```sql -- 从学院表中提取学院名称和电话后8位 SELECT 学院名称, RIGHT(TRIM(学院电话), 8) AS 教务办电话 FROM 学院; ``` **AS 的妙用:** - 建表时:用于计算列(生成列) - 查询时:用于列重命名 ### **7.7 条件查询 WHERE** #### **7.7.1 常用条件关键字** | **关键字** | **说明** | **示例** | | --- | --- | --- | | \= | 等于 | `WHERE 性别 = '男'` | | `<>`, `!=` | 不等于 | `WHERE 状态 <> '已完成'` | | `AND` | 与 | `WHERE 年龄 > 18 AND 性别 = '女'` | | `OR` | 或 | `WHERE 城市 = '北京' OR 城市 = '上海'` | | `IN` | 在...之中 | `WHERE 城市 IN ('北京', '上海')` | | `BETWEEN...AND` | 在...之间(含两端) | `WHERE 成绩 BETWEEN 60 AND 100` | | `LIKE` | 模糊匹配 | `WHERE 姓名 LIKE '张%'` | | `IS NULL` | 为空 | `WHERE 备注 IS NULL` | | `IS NOT NULL` | 不为空 | `WHERE 电话 IS NOT NULL` | #### **7.7.2 LIKE 通配符** | **通配符** | **含义** | **示例** | | --- | --- | --- | | `%` | 代表任意多个字符(包括0个) | `'张%'` - 以"张"开头 | | `_` | 代表单个字符 | `'_阳%'` - 第二个字是"阳" | ```sql -- 查询姓名第二个字为'阳'的学生 SELECT * FROM 学生 WHERE 姓名 LIKE '_阳%'; ``` **LIKE 模式示例:** | **模式** | **含义** | | --- | --- | | `'张%'` | 以"张"开头 | | `'%明'` | 以"明"结尾 | | `'%大%'` | 包含"大" | | `'_阳%'` | 第二个字是"阳" | | `'___'` | 正好三个字符 | #### **7.7.3 AND 条件** ```sql -- 找到学分小于3的必修课程 SELECT 课程名称, 学分数, 学时数 FROM 课程 WHERE 学分数 < 3 AND 课程性质 = '必修'; ``` #### **7.7.4 BETWEEN AND** ```sql -- 找到学时数在40到60之间的课程 SELECT 课程名称, 学时数 FROM 课程 WHERE 学时数 BETWEEN 40 AND 60; -- 等价于 SELECT 课程名称, 学时数 FROM 课程 WHERE 学时数 >= 40 AND 学时数 <= 60; ``` #### **7.7.5 LIKE 与 LEFT 的互换** ```sql -- 查找四川籍的教师 SELECT * FROM 教师 WHERE 籍贯 LIKE '四川%'; -- 等同于 SELECT * FROM 教师 WHERE LEFT(籍贯, 2) = '四川'; -- 查找江西籍的男教师 SELECT * FROM 教师 WHERE 籍贯 LIKE '江西%' AND 性别 = '男'; -- 等同于 SELECT * FROM 教师 WHERE LEFT(籍贯, 2) = '江西' AND 性别 = '男'; ``` #### **7.7.6 OR 与 IN 的互换** ```sql -- 查找刘星、徐丹丹老师的信息 SELECT 编号, 姓名, 籍贯, 所属学院 FROM 教师 WHERE 姓名 = '刘星' OR 姓名 = '徐丹丹'; -- 等同于 SELECT 编号, 姓名, 籍贯, 所属学院 FROM 教师 WHERE 姓名 IN ('刘星', '徐丹丹'); ``` #### **7.7.7 IS NULL 判断空值** ```sql -- ✓ 正确:使用 IS NULL SELECT * FROM 教师 WHERE 密码 IS NULL; -- ✗ 错误:使用 = NULL(查不到任何结果!) SELECT * FROM 教师 WHERE 密码 = NULL; ``` #### **7.7.8 复杂条件组合** ```sql -- 查询籍贯为山东、江苏、重庆的女生信息 -- ⚠️ 注意:AND 优先级高于 OR,需要加括号! -- ✗ 错误写法(逻辑有问题) SELECT * FROM 学生 WHERE 性别 = '女' AND 籍贯 LIKE '山东%' OR 籍贯 LIKE '江苏%' OR 籍贯 LIKE '重庆%'; -- ✓ 正确写法 SELECT * FROM 学生 WHERE 性别 = '女' AND (籍贯 LIKE '山东%' OR 籍贯 LIKE '江苏%' OR 籍贯 LIKE '重庆%'); -- ✓ 更简洁的写法 SELECT * FROM 学生 WHERE 性别 = '女' AND LEFT(籍贯, 2) IN ('山东', '江苏', '重庆'); ``` ### **7.8 生成表查询** #### **7.8.1 MySQL 语法** ```sql -- MySQL 使用 CREATE TABLE ... AS SELECT 语法 -- (SQL Server 使用 SELECT ... INTO) CREATE TABLE `22软1学生信息表` AS SELECT 学号, 姓名, 出生日期 FROM 学生 WHERE 专业班级 = '22软件本科1班'; -- 查看新表 SELECT * FROM `22软1学生信息表`; ``` | **数据库** | **语法** | | --- | --- | | **SQL Server** | `SELECT 列 INTO 新表 FROM 原表 WHERE 条件` | | **MySQL** | `CREATE TABLE 新表 AS SELECT 列 FROM 原表 WHERE 条件` | ```sql -- 生成女生信息表 CREATE TABLE 女生信息表 AS SELECT 学号, 姓名, 出生日期 FROM 学生 WHERE 性别 = '女'; SELECT * FROM 女生信息表; ``` > 💡 **注意**:当 SELECT 中包含计算列时,新表中的相应列不再是计算列,只保留计算结果的值。 --- ⬅️ [[09-数据的增删改|数据的增删改]] 🏠 [[00-数据库|00-数据库]] ➡️ [[11-聚合排序与分页|聚合排序与分页]]