单表与条件查询

7.5 SELECT 查询数据

7.5.1 查看表的结构

-- MySQL 方式
DESCRIBE 教师;
-- 或简写
DESC 教师;

-- 查看建表语句
SHOW CREATE TABLE 教师;

7.5.2 关系代数基础

image-aa32dd26

辅助运算符:

类型 运算符
算术运算符 +-*/
比较运算符 >>=<<=、=、<>(或!=
逻辑运算符 NOTANDOR
包含运算符 INNOT IN

7.6 单表查询

7.6.1 基本查询

查询表内全部信息
SELECT * FROM 学院;
查询某些特定的列
SELECT 学院名称, 学院电话 FROM 学院;
查询并去掉重复行
-- DISTINCT 去重
SELECT DISTINCT 职称 FROM 教师;

-- 多列去重(组合唯一)
SELECT DISTINCT 学院编号, 职称 FROM 教师;

7.6.2 字符串处理函数

-- 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)

-- 从学院表中提取学院名称和电话后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个) '张%' - 以"张"开头
_ 代表单个字符 '_阳%' - 第二个字是"阳"
-- 查询姓名第二个字为'阳'的学生
SELECT * FROM 学生 WHERE 姓名 LIKE '_阳%';

LIKE 模式示例:

模式 含义
'张%' 以"张"开头
'%明' 以"明"结尾
'%大%' 包含"大"
'_阳%' 第二个字是"阳"
'___' 正好三个字符

7.7.3 AND 条件

-- 找到学分小于3的必修课程
SELECT 课程名称, 学分数, 学时数
FROM 课程
WHERE 学分数 < 3 AND 课程性质 = '必修';

7.7.4 BETWEEN AND

-- 找到学时数在40到60之间的课程
SELECT 课程名称, 学时数
FROM 课程
WHERE 学时数 BETWEEN 40 AND 60;

-- 等价于
SELECT 课程名称, 学时数
FROM 课程
WHERE 学时数 >= 40 AND 学时数 <= 60;

7.7.5 LIKE 与 LEFT 的互换

-- 查找四川籍的教师
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 的互换

-- 查找刘星、徐丹丹老师的信息
SELECT 编号, 姓名, 籍贯, 所属学院
FROM 教师
WHERE 姓名 = '刘星' OR 姓名 = '徐丹丹';

-- 等同于
SELECT 编号, 姓名, 籍贯, 所属学院
FROM 教师
WHERE 姓名 IN ('刘星', '徐丹丹');

7.7.7 IS NULL 判断空值

-- ✓ 正确:使用 IS NULL
SELECT * FROM 教师 WHERE 密码 IS NULL;

-- ✗ 错误:使用 = NULL(查不到任何结果!)
SELECT * FROM 教师 WHERE 密码 = NULL;

7.7.8 复杂条件组合

-- 查询籍贯为山东、江苏、重庆的女生信息
-- ⚠️ 注意: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 语法

-- MySQL 使用 CREATE TABLE ... AS SELECT 语法
-- (SQL Server 使用 SELECT ... INTO)

CREATE TABLE `221学生信息表` AS
SELECT 学号, 姓名, 出生日期
FROM 学生
WHERE 专业班级 = '22软件本科1班';

-- 查看新表
SELECT * FROM `221学生信息表`;
数据库 语法
SQL Server SELECT 列 INTO 新表 FROM 原表 WHERE 条件
MySQL CREATE TABLE 新表 AS SELECT 列 FROM 原表 WHERE 条件
-- 生成女生信息表
CREATE TABLE 女生信息表 AS
SELECT 学号, 姓名, 出生日期
FROM 学生
WHERE 性别 = '女';

SELECT * FROM 女生信息表;

💡 注意:当 SELECT 中包含计算列时,新表中的相应列不再是计算列,只保留计算结果的值。


⬅️ 数据的增删改 🏠 00-数据库 ➡️ 聚合排序与分页