23-08-28 第一课
数据是由程序携带>数据由数据库携带存放
数据库传输数据运行过程:主机向服务器发送请求>服务器查找相关请求数据库>数据库接受服务器请求>数据库返回所需数据给服务器>服务器返回所需数据给主机
SQL(Structured Query Language)是**==结构化查询语言==,是数据库能够看懂的语言,是非过程语言**
学习SQL?学习数据的存放?
网站和网页的关系
通过超链接相互关联的网页就是网站
动态网站和静态网站根本区别
动态网站具有交互性
交互性:页面反馈
HTML(超文本标记语言)
浏览器唯一能识别的语言
数据库 DB(Database) 概念
存放数据的仓库,它是建立在计算机的存储设备上的
存放在里面的数据是由规则有逻辑的
长期存放 可共享
数据库管理系统 DBMS 概念
在==操作系统==支持下为==数据库建立使用和维护而配置==的庞大软件
SQL Sever Mysql Oracle VF Access
数据库系统 DBS 概念
包含DB和DBMS
数据库系统是引入了数据库技术的计算机系统
由计算机硬件、操作系统、DBMS以及其他对象支持下建立起来的DB、数据库应用程序、用户和维护人员等组成的一个整体
数据库管理员 DBA 概念
数据库管理员
23-09-04 第三次课
1.服务器名称
- 如果实例名是SQLEXPRESS,则服务器名称为==计算机名\实例名==
- 如果实例名是MSSQLSERVER,则服务器名称为==计算机名==
2.服务器开启和关闭
- 配置管理器
- 服务
3.对界面进行简单的操作
数据库起名时,不能以数字开头
右键新建数据库
4.数据库文件
- .mdf 主数据文件
- .ldf 日志文件
23-09-04 第四次课
1.设置sa登录
- 右键服务器,在属性中的安全性中设置为SQL Server和Windows身份验证模式
- 在SQL配置管理器中重启服务器
- 选择服务器中安全性>登录名>右键sa属性>关闭强制实施密码策略>设置新密码>状态中授予和启用
2.数据表
表是最基本的数据库对象
表就是指关系
行是指一条记录、一个元组
列是字段、属性
关系模式
关系名(属性名1,属性名2) |
数据表结构
表结构:列名、数据类型、长度、是否允许null、==主键==
表记录
字符型
char(6) nchar(6) /* 无var 定长 */ |
定长,变长区别
定长:当输入不足6时,会补空格
变长:输出不足6时,不会补空格
主键
- 是唯一能识别表中一行的属性
- 一个表有且仅有一个主键
- 但会出现**==候选键==,因为两个都具有唯一性**,选其一作为主键
- ==主属性==:包含在候选键中的属性
- **下划线**通常用来标识主键
- ==特点==:唯一、不允许为空
外键
如果一个属性不是它所在表的主键,却是研究范围内另一个表的主键,那么它就是它所在表的外键
- 外键可以有0、1、多个
- 一个关键字是主键所在的表就是主表,外键就是从表,主从要相互限制
- 从表的外键值要来源于对应主表的主键值
第五节课
3.SQL-结构化查询语言
非过程化语言(只管要什么,不管如何得到)
分类
按功能分类
数据定义语言DDL - 对数据库对象(表结构)进行操作
CREATE 创建 ALTER 修改 DROP 删除 |
数据操纵语言DML - 对表数据进行操作
SELECT 选择 INSERT 插入 UPDATE 修改 DELETE 删除 |
数据控制语言DCL
GRANT 授予 REVOKE 收回 DENY 拒绝 |
第六节课
SELECT 选择
1. Department (departno,departname) |
1.查询学生信息
USE Xk |
T:查询学生的学号和姓名
SELECT stuno,stuname |
2.查询课程的类别 - ==DISTINCT 去掉查询结果的重复行==
SELECT DISTINCT kind FROM Course |
3.查询前50名学生的信息 - ==TOP 查询指定数量数据==
SELECT TOP 50 * FROM Student |
T1:查询前5们课程的课号、课名以及授课教师
SELECT TOP 5 couno,couname,teacher FROM Course |
T2:查询前50%条学生的记录 - ==PERCENT 百分比==
SELECT TOP 50 PERCENT * FROM Student |
4.查询20000001班学生的学号 - ==WHERE==
SELECT * FROM Student WHERE classno='20000001' |
第七节课
条件由**==列名、运算符、列值==**组成
SELECT 选择
1. Department (departno,departname) |
T:查询报名人数超过35人的课程号和课程名
SELECT couno,couname FROM Course WHERE willnum>35 |
T:查询属于01号部门的班级信息
SELECT * FROM Class WHERE departno='01' |
5.查询01号部门所开设的学分不小于2的课程信息 - ==AND/OR==
SELECT * FROM Course WHERE departno='01' AND credit>=2 |
T:查询03、08、13号课程信息
SELECT * FROM Course WHERE couno='003' OR couno='008' OR couno='013' |
6.查询03、08、13号课程信息 - ==IN 值在列表中/NOT IN 值不在列表中==
SELECT * FROM Course WHERE couno IN('003','008','013') |
T:查询课号不是03、08、13号课程信息
SELECT * FROM Course WHERE couno NOT IN('003','008','013') |
7.查询报告人数在35到40之间(含边界)的课程号 - ==(NOT) BETWEEN AND==
SELECT couno,couname,credit,willnum FROM Course WHERE willnum BETWEEN 35 AND 40 |
- 通常用于连续的数值范围
- 包含边界值
- NOT BETWEEN AND 不包括边界
第八节课
SELECT 选择
1. Department (departno,departname) |
8.查询课程信息,并按照学分的降序排列 - ==ORDER BY ASC(升)/DESC(降)==
SELECT * FROM course ORDER BY credit DESC |
- 可以使用列序号代替属性名
- 默认升序
查询课程信息,先按照学分的降序排列,学分相同再按报名人数升序排列
SELECT * FROM course ORDER BY credit DESC,willnum ASC |
第九节课
SELECT 选择
1. Department (departno,departname) |
9.模糊查询 - ==LIKE==
通配符
用来表示模糊状态的符号
% _ [] [^ ] |
%通配符
表示0个,1个,多个字符
_通配符
表示任意单个字符
[]通配符
表示**==中括号范围内==的单个字符**
[^]通配符
表示**==不在==中括号范围内的单个字符**
TEST
以”加油”结尾的字符串,含有“工程”的字符串,第二个字不是“y”的字符串,以x或y开头不以m或n结尾的字符串,倒数第二个字符是w长度不小于4的字符串,第二个字是r或t的字符串
SELECT * FROM Class WHERE departno LIKE '%加油' |
- ===后面跟一个确定的值==
- ==IN后面跟多个确定的值==
- ==LIKE后跟一个模糊的状态==
第十节课
SELECT 选择
1. Department (departno,departname) |
==NOT LIKE== - 不姓李的学生信息
SELECT * FROM student WHERE stuname NOT LIKE '李%' |
TEST
查询姓李、张、陈的学生信息
SELECT * FROM student WHERE stuname LIKE '[李张陈]%' |
10.==聚合函数==
SUM(列名):表示求该列列值的和 |
查询所有学生数量
SELECT count(stuno) FROM student -- 181 |
修改查询结果的列标题
SELECT count(*) as '学生总数' FROM student |
TEST
查询最大报名人数、最小报名人数和平均报名人数
SELECT MAX(willnum) '最大报名人数',MIN(willnum) '最小报名人数',AVG(willnum) '平均报名人数' FROM course |
第十一节课
SELECT 选择
1. Department (departno,departname) |
11.查询**==每==**个班级的人数 - ==GROUP BY== 分组
SELECT classno,COUNT(*) FROM student GROUP BY classno |
TSET
查询每位老师所承担的课程门数
SELECT teacher,COUNT(*) FROM course GROUP BY teacher |
在 学生(学号,姓名,年龄,性别,班号,密码) 中查询每班有多少女生
SELECT 班号,COUNT(*) AS '女生人数' FROM 学生 WHERE 性别='女' GROUP BY 性别 |
查询男女生各有多少人
SELECT 性别,COUNT(*) AS '女生人数' FROM 学生 GROUP BY 性别 |
查询每个学生的总分
SELECT 学号,SUM(成绩) FROM 选修 GROUP BY 学号 |
==HAVING== 关键字
其中的条件是对分组的筛选
查询人数超过40个人的班级号
SELECT classno FROM student GROUP BY classno HAVING COUNT(*)>40 |
TEST
学生(学号,姓名,年龄,性别,班号,密码)
课程(课号,课名,学分)
选修(学号,课号,成绩)
查询平均分超过90的学生号
SELECT 学号 FROM 选修 GROUP BY 学号 HAVING AVG(成绩)>90 |
查询选修课程门数超过3门的学生号
SELECT 学号 FROM 选修 GROUP BY 学号 HAVING COUNT(*)>3 |
查询被30人以上选修的课程号
SELECT 课号 FROM 选修 GROUP BY 课号 HAVING COUNT(*)>30 |
第十二节课
SELECT 选择
1. Department (departno,departname) |
12.子查询(嵌套查询)
WHERE后的条件的列值部分是不能出现聚合函数的
查询报告人数超过平均报名人数的课程信息
SELECT * FROM course WHERE willnum>(SELECT AVG(willnum) FROM course) |
TEST
查询20000001班所在的部门号
SELECT departno FROM class WHERE classno='20000001' |
查询20000001班所在的部门名
SELECT departname FROM department WHERE departno=(SELECT departno FROM class WHERE classno='20000001') |
查询20000001班学生的学号和姓名
SELECT stuno,stuname FROM student WHERE classno='20000001' |
查询“01电子商务”班学生的学号和姓名
SELECT stuno,stuname FROM student WHERE classno=(SELECT classno FROM class WHERE classname='01电子商务') |
查询00000001号学生所选修的课程信息
SELECT * FROM course WHERE couno IN(SELECT couno FROM stucou WHERE stuno='00000001') |
查询选了”SQL Server实用技术”课程的学生信息
SELECT * FROM student WHERE stuno IN( SELECT stuno FROM stucou WHERE couno IN( SELECT couno FROM course WHERE couname='SQL Server实用技术')) |
第十三次课
SELECT 选择
1. Department (departno,departname) |
13.连接查询
内连接:等值连接、比较连接、自然连接、自连接
外连接:左连接、右连接、全连接
交叉连接:
笛卡尔积
TEST
查询班号、班名及其所在的部门号和部门名
SELECT classno,classname,class.departno,departname |
查询学生的姓名及其所选的课程名称
SELECT stuname,couname |
第十四次课
SELECT 选择
1. Department (departno,departname) |
14.查询密码为空的学生信息 - ==IS (NOT) NULL==
SELECT * FROM student WHERE pwd IS NULL |
15.将查询结果插入到表中 - ==INTO==
方法1
SELECT stuno INTO a FROM student WHERE classno='20000001' |
方法2
INSERT INTO a SELECT stuno,stuname FROM student WHERE classno='20000002' |
- INSERT INTO必须要是已存在的表
- 列数要与查询结果的列数相同
16. >ALL >ANY
SELECT * FROM course WHERE willnum>44 |
- ANY 表示选中满足其中之一
- ALL 表示选中满足所有条件
SELECT 小结
SELECT column1, column2, ... |
INSERT 插入
1. Department (departno,departname) |
格式
INSERT INTO table_name (column1,column2,column3,...) |
==插入是要避免主键值冲突==
T1
向部门表中插入一条记录
INSERT INTO department(departno,departname) |
T2
向学生表插入一条记录
INSERT INTO student VALUES('9990','20000001','宗筠书','123') |
- Xk库是已经设置好关联的,5个表间相互限制,以便数据保持一致性
- 学生表中的班号必须是班级表中有的
- 从表的外键值来自于主表的主键值
第十五次课
INSERT 插入
1. Department (departno,departname) |
UPDATE 修改
格式
UPDATE table_name |
T
将20000001班学生的密码设置为123456
UPDATE student SET pwd='123456' WHERE classno='20000001' |
将所有课程的报名人数都+1
UPDATE course SET willnum=willnum+1 |
将“旅游系”所开设的课程的报名人数都+1
DELETE 删除
格式
DELETE FROM table_name |
T
删除07号部门
DELETE FROM department WHERE departno='07' |
只能删除与其他表无被引用的记录
0000001号学生取消了对002号课的选修
DELETE FROM stucou WHERE stuno='0000001' AND couno='002' |
第十六次课
T
读者(读者号,读者名,年龄)
图书(书号,书名,类别,页数,定价,作者,出版社编号)
借阅(读者号,书号,借书时间,还书时间)
出版社(出版社编号,出版社名称)
- 向读者表中插入一条记录
- 删除“01”号读者的借阅记录
- 将“计算机”类图书的定价增加5
- 查询读者的姓名及其借阅图书的名称
- 查询每个读者的借书数
- 查询”清华大学出版社“出版图书信息
1.向读者表中插入一条记录
INSERT INTO 读者(读者号,读者名,年龄) VALUES('09','宗筠书',21) |
2.删除“01”号读者的借阅记录
DELETE FROM 借阅 WHERE 读者号='01' |
3.将“计算机”类图书的定价增加5
UPDATE 图书 SET 定价=定价+5 WHERE 类别='计算机' |
4.查询读者的姓名及其借阅图书的名称
SELECT 读者名,书名 FROM 读者,图书,借阅 WHERE 读者.读者号=借阅.读者号 AND 借阅.书号=图书.书号 |
5.查询每个读者的借书数
SELECT 读者号,COUNT(*) AS '借书数' FROM 借阅 GROUP BY 读者号 |
6.查询”清华大学出版社“出版图书信息
SELECT 图书.* FROM 图书,出版社 WHERE 出版社.出版社编号=图书.出版社编号 AND 出版社.出版社名称='清华大学出版社' |
第十七次课
创建数据库
命令
CREATE DATEBASE zjs1023 |
创建数据表
格式
CREATE TABLE table_name |
修改数据表
加列
ALTER TABLE table_name |
删列
ALTER TABLE table_name |
改列
ALTER TABLE table_name |
删除数据表
格式
DROP TABLE table_name |
删除数据库
DROP TABLE DATABASE |
T
创建商品数据库sp,并在该库下创建商品表s(sno,sname,sprice)
CREATE DATABASE sp |
第十八次课
T
为表s加一列生产日期sdate
ALTER TABLE s |
datetime输入格式
2023-10-26 or 2023/10/26
为表中插入一条记录 8808 TV 9999
INSERT INTO s(sno,sname,sprice) VALUES('8808','TV',9999) |
查询生产日期在2022年2月2日之前生产的商品信息
SELECT * FROM s WHERE sdate<'2022-2-2' |
查询售价大于8000的商品号和商品名
SELECT sno,sname FROM s WHERE sprice>8000 |
将8808号商品的价格+1000
UPDATE s SET sprice=sprice+1000 WHERE sno='8808' |
删除生产日期列sdate
ALTER TABLE s DROP COLUMN sdate |
清空表s
DELETE FROM s |
删除表s
DROP TABLE s |
T 函数在查询上的应用
查询2022年生产的商品信息
SELECT * FROM s WHERE year(sdate)=2022 |
变量
全局变量
相当于SQL Server的配置函数
以@@开头
局部变量
- 以@开头
- 定义 赋值 输出
declare @i int -- 声明了一个整型的局部变量i |
print和select区别
==print==一次只能输出一个变量
==select==一次可以输出一个或多个变量
set和select区别
==set==一次只能给一个变量赋值
==select==一次可以给一个或多个变量赋值
格式
declare @i int,@j int |
declare @x char(4),@y char(6),@z char(9) |
第十九次课
流控语句(流程控制)
if 格式
if |
while 格式
while 条件 |
运算符
select 7/2 除 select 7%2 取余 select 4&5 按位与 select 4|5 按位或 select 4^5 异或 |
- 只要有一个数为浮点,输出结果则为浮点;如果都为整数则取整
- 取余中,正负号跟被除数符号有关
函数
- 函数分为两大类:自定义函数和内置函数
数学函数
select abs(-6) -- 绝对值 |
日期时间函数
select getdate() -- 获取当前服务器时间,精确到毫秒 |
datediff()
select datediff(datepart,stardate,enddate) -- 日期2 - 日期1 的差 |
datepart格式
datepart | 缩写 | 意义 |
---|---|---|
year | yy | yyyy | 年 |
quarter | qq | q | 季度 |
month | mm | m | 月 |
week | ww | w | 周 |
day | dd | d | 日 |
hour | hh | 小时 |
minute | mi | n | 分钟 |
second | ss | s | 秒 |
millisecond | ms | 毫秒 |
year()
返回int类型,所以不需要加单引号
select year(‘2022-2-18’)
第二十次课
字符串函数
select len('网络34班A') -- 查询长度 6 |
学生(学号,姓名,年龄) 其中学号为6位,第3、4位表示班号,请查询出’08’班学生信息
SELECT * FROM 学生 WHERE SUBSTRING(学号,3,2)=08 |
编程输出1-50之间的偶数
declare @num int |
第二十一次课
视图 VIEW
- 是数据库对象之一
- 相等于一个窗口,透过它可以看到基本表中的数据
- 是一张虚表,在数据库中存放的是视图的定义
视图的定义
CREATE VIEW view_name |
T
创建视图v1,透过它可以查看所有男生的信息
CREATE VIEW v1 |
创建视图v2,可以查看年龄大于18岁的男生信息 ==(可以在视图上再创建视图)==
CREATE VIEW v2 AS SELECT * FROM v1 WHERE 年龄>'18' |
创建视图v3,可查看学生的姓名及其所选课程的名称 ==(简化了用户操作)==
CREATE VIEW v3 |
视图的列标题
CREATE VIEW v4(stuno,stuname) |
T
创建视图v5,可查看每班有多少人
CREATE VIEW v5(classno,count) |
加密视图 ==with encryption==
CREATE VIEW v6 |
加密过后,不会显示路径,增加了安全性
第二十二次课
存储过程
- 系统存储过程
- 自定义存储过程
sp_helptext
sp_helptext v1 |
T
创建视图v7可查看姓李的学生信息
CREATE VIEW v7 |
修改视图 - 通过视图修改基本表
UPDATE v7 |
修改过后,视图所在的表也会被修改
WITH CHECK OPTION
设置后,只能在视图条件范围内增删改
- 对于update,有with check option,要保证update后,数据要被视图查询出来;
- 对于delete,有无with check option都一样;
- 对于insert,有with check option,要保证insert后,数据要被视图查询出来;
- 对于没有where 子句的视图,使用with check option是多余的。
CREATE VIEW v8 |
标识列 IDENTITY
- 数值型的列才有资格成为标识列
- 标识列的数值是自动生成的
CREATE TABLE book( |
IDENTITY(1,1) -- 前面的1为开始字段,后面的1为每次自动生成增加数 |
第二十三次课
数据库设计
- 软件开发
- 问题定义
- 调研
- 需求分析
- 数据库设计
- 需求分析
- 概念设计
- 需求—>E-R图(抽象化)
- 逻辑设计
- E-R图—>表,规范化
- 物理设计
- 寻找适合存储的物理环境
- 数据库的实施
- 数据库的运行和维护
- 详细设计
- 编码
- 测试
E-R图
E-R图的三要素
- 实体:客观存在的可以相互区分的事物(矩形)
- 属性:实体所具有的特性(椭圆形)
- 联系:实体和实体之间的关联(菱形)
联系的类型
一对一、一对多、多对多
第二十四次课
逻辑设计
E-R图—>表
关系模式
关系名(属性1,属性2,…)
表名(表1,表2,…)
将实体转换为关系模式
关系名=实体名
属性=实体属性
主键=唯一标识实体的属性
学生(学号,姓名) -- 主键下面应标有横线,学号为主键 |
将(多对多)联系转换为关系模式
关系名=联系名
属性=与该联系相连的两实体的主码和联系的属性
主键=与该联系相连的两实体的主码的组合(根据实际具体分析)
选修(学号,课程号,成绩) -- 学号和课程号的组合是主键 |
将(一对多)联系转换为关系模式
关系名=联系名
属性=与该联系相连的两实体的主码和联系的属性
主键=多端实体的主码
讲授(课程号,教师号) -- 课程号是主键 |
==相同主键的关系要合并==
将(一对一)联系转换为关系模式
推向另一端
将(多元)联系转换为关系模式
关系名=联系名
属性=与该联系相连的各实体的主码和联系的属性
主键=与该联系相连的各实体的主码的组合(根据实际具体分析)
完整关系模式
学生(学号,姓名) -- 主键下面应标有横线,学号为主键 |
借书人(借书证号,姓名,单位) -- 借书证号为主键 |
商店(商店编号,商店名,地址) -- 商店编号 |
第二十五次课
规范化(如何判断其规范,不规范如何使其规范)
范式(NF):用来衡量表现规范化程度的标准
1NF:每一个元组分量都是不可再分的
2NF:首先满足1NF,且每一个非主属性都完全函数依赖于任意候选键
- 学生(学号,身份证号,姓名,年龄)
- 主属性:包含在候选键中的属性
- 姓名→学号(姓名 依赖于 学号) 完全函数依赖
- 学号,课号→姓名 部分函数依赖
- 关系R(学号,姓名,课号,学分,成绩,课名,年龄)
- R的候选键为:课号,学号(1个)
- R的非属性:姓名,学分,成绩,课名,年龄
- 学号,课号→姓名 部分
- 学号,课号→学分 部分
- 学号,课号→成绩 完全
- 学号,课号→课名 部分
- 学号,课号→年龄 部分
- R1(学号,课号,成绩)
- R2(学号,姓名,年龄)
- R3(课号,课名,学分)
- 破坏部分函数依赖
- 将去掉的项,加上其各自的决定项形成新的关系
3NF:首先满足2NF,且不存在非主属性对于任意候选键的传递函数依赖
- X→Y→Z(Z传递函数Y依赖于X)
第二十六次课
数据完整性
正确性 一致性
“学生表中的班号一定是班级表中有的”
约束 - ==CONSTRAINT==
类型
- 主键约束 PRIMARY KEY
- 外键约束 FOREIGN KEY
- 检查约束 CHECK
- 唯一约束 UNIQUE
- 默认约束 DEFAULT
约束的描述
CREATE TABLE table_name( |
设置主键两种方法
-- 方法一和方法二不能同时用 |
T
创建学生表,学生(学号,姓名,年龄,性别),年龄限定在10-70之间
-- 方法一 |
创建成绩表,成绩(学号,课号,得分),将得分限定在0-100之间
CREATE TABLE 成绩( |
创建商品表sp,sp(商品号,商品名,单价),实现商品号只能输入三位数字
CREATE TABLE sp1( |
第二十七次课
删除约束 - ==ALTER TABLE DROP CONSTRAINT==
ALTER TABLE DROP CONSTRAINT |
T
取消学生2上对年龄的取值限制
ALTER TABLE 学生2 |
添加约束 - ==ADD CONSTRAINT==
T
在学生2表上加上对年龄的限制,要求学生年龄为8-30之间
ALTER TABLE ADD CONSTRAINT xs2_age CHECK(年龄 BETWEEN 8 AND 30) |
表已存在,请为sp表添加一列类型
ALTER TABLE sp1 ADD 类型 CHAR(5) NULL |
请在类别列上添加限制,只能输入‘A’和’B’
ALTER TABLE sp1 ADD CONSTRAINT lb CHECK(类别 LIKE '[AB]') |
删除学生2表的性别列
ALTER TABLE 学生2 DROP COLUMN 性别 |
为学生2添加性别列的同属,加上限制,只能输入男或女
ALTER TABLE 学生2 ADD 性别 CHAR(4) NULL CHECK(性别 IN('男','女')) |
唯一约束 - ==UNIQUE==
格式
方法一: |
第二十八次课
默认约束 - ==DEFAULT==
- 两种加法
- 未给定值时自动显示默认值
方法一: |
T
表已存在,在年龄列上添加默认值20
ALTER TABLE 学生4 ADD CONSTRAINT xs1 DEFAULT(20) FOR 年龄 |
外键约束 - ==FOREIGN KEY==
- 三种加法
- 实现表间数据的一致性
- 数据类型和长度必须要和主表主键一致
- 所有会造成数据不一致的增删改操作都会被禁止
CONSTRAINT constraint_name FOREIGN KEY(column_name1) REFERENCES table_name(column_name1) |
第二十九次课
级联
从表随主表自动变化,达到新的一致性状态
CREATE TABLE 系部2( |
ON UPDATE CASCADE -- 级联更新 |
验证
INSERT INTO 系部2 VALUES('1','数学系') |
T
创建零件表,零件(零件号,零件名,颜色,供应商,数量)
CREATE TABLE 零件( |
创建零件表的同时,限定一个供应商只能供应一种零件,数量在1000-9000之间
CREATE TABLE 零件( |
表创建成功后,为表添加“城市”列,默认为大连
ALTER TABLE 零件 ADD 城市 CHAR(6) NULL DEFAULT(大连) |
限定颜色只能取值为”红色” “白色” “黑色”
ALTER TABLE 零件 ADD CONSTRAINT color CHECK(颜色 IN('红色','白色','黑色')) |
学生(学号,姓名,年龄)
课程(课号,课名,学分)
选课(学号,课号,成绩)
创建以上三个表,并实现级联效果
CREATE TABLE 学生( |
第三十次课
DECLARE @avenue FLOAT |
存储过程 - PROCEDURE
数据库对象之一
可简写为PROC
分类:
- 系统存储过程 sp_
- 扩展存储过程 xp_
- 自定义存储过程
格式
CREATE PROCEDURE procedure_name(@x 数据类型) |
调用 - execute
EXECUTE p1 数值 |
T
编写存储过程p2,使用学生表,实现输入一个学号,输出该学生姓名的功能
CREATE PROCEDURE p2 @sno CHAR(8) |
p94-(2)
ALTER TABLE loan ALTER COLUMN loandate SMALLDATETIME NOT NULL |
第三十一次课 & 第三十二次课
复习点
- 建库建表,并且能够设置表间级联(外键约束),会添加约束
- 会对数据表进行INSERT DELETE UPDATE增删改操作
- 会使用SELECT语句进行查询
- 创建视图
- 创建自定义存储过程
练习题
创建数据库zjs1211,并在该库下创建以下三个数据库,并设置他们的级联关系
图书(书号,书名,出版社,价格,数量)
会员(会员号,会员名,性别,年龄)
借阅(会员号,书号,借书日期,还书日期)
CREATE DATABASE zjs1211 |
1.向图书表中插入一条记录
INSERT INTO 图书 VALUES('0001','DB','上海交大',49.8,100) |
2.查询图书的总数量
SELECT SUM(数量) FROM 图书 |
3.查询有哪些出版社
SELECT DISTINCT 出版社 FROM 图书 |
4.删除价格最低的图书记录
DELETE FROM 图书 WHERE 价格=(SELECT MIN(价格) FROM 图书) |
5.查询每个出版社的图书数量
SELECT 出版社,SUM(数量) FROM 图书 GROUP BY 出版社 |
6.查询”小小”所借阅图书的书号和借阅日期
-- 连接查询 |
7.查询年龄小于40的会员信息,并按年龄降序排列
SELECT * FROM 会员 WHERE 年龄<40 ORDER BY 年龄 DESC |
8.为会员表添加一列”级别”
ALTER TABLE 会员 ADD 级别 CHAR(6) NULL |
9.查询会员的姓名及其所借阅图书的名称
SELECT DISTINCT 会员名,书名 FROM 图书,会员,借阅 WHERE 会员.会员号=借阅.会员号 AND 图书.书号=借阅.书号 |
10.1号会员的性别录入错误,将其修改为”女”
UPDATE 会员 SET 性别='女' WHERE 会员号='1' |
11.查询借书日期为2023年的会员号
SELECT DISTINCT 会员号 FROM 借阅 WHERE YEAR(借书日期)=2023 |
12.创建视图VM,查看书名中含有”技术”字样的图书信息
CREATE VIEW VM |
13.创建存储过程PM,查看单价超过平均单价的图书信息,并调用
CREATE PROCEDURE PM |
14.查询1号和2号图书信息
SELECT * FROM 图书 WHERE 书号 IN('1','2') |
15.查询”上海交大”出版社出版的价格大于100的图书号和图书名
SELECT 书号,书名 FROM 图书 WHERE 出版社='上海交大' AND 价格>100 |
练习题2
1.创建数据库db311
CREATE DATABASE db311 |
2.在该库下创建数据表(3个,并设置表间关联)
学生(学号,姓名,年龄,性别,班号)
课程(课号,课名,学分,任课老师)
成绩(学号,课号,得分)
CREATE TABLE 学生( |
3.向课程表中插入一门新课,2003 数据库技术 4.5 于一
2004 C语言
INSERT INTO 课程 VALUES('2003','数据库技术',4.5,'于一') |
4.查看课程表的全部信息
SELECT * FROM 课程 |
5.统计学生总数,并用中文显示列名
统计所有课程的学分总和
SELECT count(*) AS '学生总数' FROM 学生 |
6.查询“李明”所选修的课程号和得分
SELECT 课号,得分 FROM 成绩,学生 WHERE 姓名='李明' AND 学生.学号=成绩.学号 |
7.删除学生表中的性别列
为学生表添加性别列
ALTER TABLE 学生 DROP COLUMN 性别 |
8.查询学分小于5的课程信息,并按学分降序排列
SELECT * FROM 课程 WHERE 学分<5 ORDER BY 学分 DESC |
9.查询每个学生的平均分
SELECT AVG(得分) FROM 成绩 GROUP BY 学号 |
10.删除最高学分的课程
DELETE FROM 课程 WHERE 学分=(SELECT MAX(学分) FROM 课程) |
11.将2004号课程的学分修改为5
UPDATE 课程 SET 学分=5 WHERE 课号='2004' |
12.查询学生的姓名及其所选课程的名称
SELECT 姓名,课名 FROM 学生,成绩,课程 WHERE 学生.学号=成绩.学号 AND 成绩.课号=课程.课号 |
13.查询01班女生的学号和姓名
SELECT 学号,姓名 FROM 学生 WHERE 性别='女' |
14.创建视图VM,可查看学分不超过5的课程信息
CREATE VIEW VM |
15.创建存储过程PM,可查看姓名第二个字是“明”字的学生信息,并调用
CREATE PROCEDURE PM |