--- title: "10-关系代数与单表查询" created: 2025-11-25 tags: - 项目筑基 --- # 关系代数与单表查询 查看表的结构(基本信息) ```sql EXEC sp_help 教师 ``` ### 关系代数 #### 关系操作 关系的查询操作: 关系的更新操作: 选择(Select) 插入(Insert) 投影(Project) 删除(Delete) 连接(Join) 修改(Update) 除(Divide) 并(Union) 交(Intersection) 差(Difference) 广义笛卡尔积(Extended Cartesian product) #### 关系运算 传统的集合运算(并、交、差、笛卡尔积) 专门的关系运算(投影、选择、联接、除) 基本运算(并、差、笛卡尔积、投影、选择)五种 #### 辅助运算符 算术运算符:+、-、×、÷。 比较运算符:>、≥、<、≤、=、≠。 逻辑运算符:¬(逻辑非)、∧(逻辑与)、∨(逻辑或)。 包含运算符:∈(属于) ### 单表查询 #### 基本查询 ##### 查询表内全部信息 ```sql SELECT * FROM 表名 ``` 如:`SELECT * FROM 学院` ##### 查询表内某些特定的列 ```sql SELECT 列名,列名…… FROM 表名 ``` 如:`SELECT 学院名称, 学院电话 FROM 学院` ##### 查询并去掉重复行 DISTINCT 只能出现在第一个字段前(解释在语句顺序分析) `SELECT DISTINCT 列名(,列名……) FROM 表名` select 1,distinct 2 是不对的 如:`SELECT DISTINCT 职称 FROM 教师` distinct 1,2,3 表示对3字段的整体去重 ##### 查询 将结果截取一部分显示、重命名列显示 LEFT 截取字符串中左边的字符 RIGHT 截取字符串中右边的字符 TRIM 去除字符串中的空字符 LTRIM 去除字符串中左边的空字符 RTRIM 去除字符串中右边的空字符 AS又出现了 上次是用于建表时候的自动求和 这里是作为重命名功能 查询 从学院表中提取所有学院的名称、电话组成一个学院电话表 ```sql SELECT 学院名称,RIGHT(LTRIM(RTRIM(学院电话)),8) AS 教务办电话 FROM 学院 ``` #### 条件查询 WHERE ALL 满足所有值的记录 ANY 、 SOME 满足任意一个值的记录 BETWEEN……AND……包括俩端值 BETWEEN 0(小) AND 90(大) >=0 and <=90 EXISTS 存在 判断是否为空 IN IN('男','女') LIKE 一般与通配符一起使用 %代表多个字符 \_代表单个字符 []范围内 [^}不在范围内 比如 查询 姓名第二个字为‘阳’的学生记录 ```sql SELECT * FROM 学生 WHERE 姓名 LIKE'_阳%' ``` IS 判断空值 不能用=NULL 需要用 IS NULL IS NOT NULL ![[image-8854ed40.png]] ##### AND 找到满足学分小于3 的必修课程 并展示 课程名称 学分数 学时数 三列 ```sql SELECT 课程名称,学分数,学时数 FROM 课程 WHERE 学分数<3 AND 课程性质='必修' ``` ##### BETWEEN AND 找到学时数在40到60的课程 并展示课程名称,学时数 俩列 ```sql SELECT 课程名称,学时数 FROM 课程 WHERE 学时数 BETWEEN 40 AND 60 ``` ##### LIKE(模糊查询)与LEFT like 和 left 有时可以通用 ```sql SELECT * FROM 教师 WHERE 籍贯 LIKE '四川%' SELECT * FROM 教师 WHERE LEFT(籍贯,2)='四川' ``` ```sql --查找江西籍的男教师信息 SELECT * FROM 教师 WHERE 籍贯 like '江西%' AND 性别='男' --等同于 SELECT * FROM 教师 WHERE left(籍贯,2)= '江西' AND 性别='男' ``` ##### OR与IN 查找教师表(刘星、徐丹丹老师的信息 显示教师编号 姓名 籍贯 所属学院) ```sql SELECT 编号,姓名,籍贯,所属学院 FROM 教师 WHERE 姓名='刘星' OR 姓名='徐丹丹' ``` ```sql --等同于 SELECT 编号,姓名,籍贯,所属学院 FROM 教师 WHERE 姓名 IN ('刘星','徐丹丹') ``` ##### IS 查询空值 ```sql SELECT * FROM 教师 WHERE 密码 IS NULL ``` 空值的判断只能用IS NULL 不能=NULL ```sql SELECT * FROM 教师 WHERE 密码 = NULL --这样查不到 ``` ##### AND 与 OR 具有优先级 and优先级大于or 查询籍贯为山东 江苏 重庆 的女生信息 ```sql SELECT * FROM 学生 WHERE 性别='女' AND 籍贯 LIKE '山东%' OR 籍贯 LIKE '江苏%' OR 籍贯 LIKE '重庆%' ``` ```sql SELECT * FROM 学生 WHERE 性别='女' AND LEFT(籍贯,2)='山东' OR LEFT(籍贯,2)='江苏' OR LEFT(籍贯,2)='重庆' ``` #### 生成表查询 ```sql SELECT 列名(,列名……)INTO 新表名 ``` 如 查询生成22软1的学生信息表 显示学号 姓名 出生日期 ```sql SELECT 学号,姓名,出生日期 into [22软1学生信息表] FROM 学生 WHERE 专业班级='22软件本科1班' --因为数字开头 所以要加[] SELECT * FROM [22软1学生信息表] ``` 查询生成一张女生信息表 显示学号 姓名 出生日期 ```sql SELECT 学号,姓名,出生日期 INTO 女生信息表 FROM 学生 WHERE 性别='女' SELECT * FROM 女生信息表 ``` 注意: 当选择列表select\_list中包括计算列时 新表中的相应列不再是计算列 其类型由其值的格式来确定 (失去计算功能的意思) mysql中 把查询结果复制成一张表存储 `create table emp as select * from emp;` ![[image-ad1ac012.png]] 还可以把查询结果插入在一个表当中 ```sql insert into table_1 select * from dept ``` insert into 表名 后接查询语句 要注意的就是字段条数要匹配 --- ⬅️ [[09-数据修改(改)|09-数据修改(改)]] 🏠 [[00-数据库|00-数据库]] ➡️ [[11-聚合查询|11-聚合查询]]