数据库概论期末复习(MySQL)

 #SQL 建表

# 定义基本表
# 固定格式
CREATE TABLE SC
(
	# PRIMARY KEY 表示Sno 为主码
	Sno CHAR(9) PRIMARY KEY,# 属性名 类型 约束
	Sname CHAR(20) UNIQUE, # UNIQUE 表示取值唯一
	Ssex CHAR(3) Not Null, # Not Null 非空
	Sage SMALLINT,# SMALLINT 短整型
	Grade SMALLINT CHECK(Grade >=0 AND Grade<=100)
	# 检查Grade
	Sdept CHAR(20)
);

CREATE TABLE Course
(
	Cno CHAR(4) PRIMARY KEY,
	Cname CHAR(40),
	Cpno CHAR(4),
	Ccredit SMALLINT,
	FOREIGN KEY (Cpno) REFERENCES Course(Cno)
	# 其中 Cpno是外码 被参照表是Course 被参照列是Cno
);

# 定义基本表
# 固定格式
CREATE TABLE SC
(
	# PRIMARY KEY 表示Sno 为主码
	Sno CHAR(9) PRIMARY KEY,# 属性名 类型 约束
	Sname CHAR(20) UNIQUE, # UNIQUE 表示取值唯一,既该名字只能有一条
	Ssex CHAR(3) Not Null, # Not Null 非空
	Sage SMALLINT,# SMALLINT 短整型
	Grade SMALLINT CHECK(Grade >=0 AND Grade<=100),
	Grade SMALLINT CHECK(grade BETWEEN 0 and 100) #闭区间
	# 检查Grade
	Sdept CHAR(20)
);

# 外码作为主属性
CREATE TABLE SC
(
	PRIMARY KEY (Sno,Cno),
	FOREIGN KEY (Sno) REFERENCES Student(Sno),
	FOREIGN KEY (Cno) REFERENCES Course(Cno)
	# 主码由两个属性组成,该属性为外码
);

# 删除基本表
DROP TABLE Student;

# 练习创建表
CREATE TABLE Student
(
	Sno PRIMARY KEY,# 主码
	Sname char(20) UNIQUE,
	#性别必须为男或女,默认为男
	Ssex char(2) CHECK(Ssex IN ("男","女")) DEFAULT ("男"),
	# Sdept 只能取值其中之一
	Sdept enum ("计科","软件","网络"),
);

#向表中增加新的列
ALTER TABLE Student ADD ruxuetime DATE; # DATE为日期型

#将表中的列的数据类型更改
ALTER TABLE Student ALTER COLUMN Sage INT; #假设原来的数据是字符型改为整数

#增加约束条件
ALTER TABLE Course ADD UNIQUE(Cname);

#表上建立视图
CREATE VIWE IS_Student 
AS #前面是建立视图语句,后面是查询语句
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept="IS";

#建立索引
# SC表按学号升序和课程号降序建立唯一索引
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);

#修改索引
#将SC表的SCno索引名改为SCSno
ALTER INDEX SCno RENAME TO SCSno;

#删除索引
#删除Student表的Stusname索引
DROP INDEX Stusname;

#############################################################################

#查询表练习数据库数据 

#查询练习数据
#Mysql版本
drop table SC;
drop table Student;
drop table Course;

create table Student
( Sno varchar(10) primary key,
  Sname varchar (10),
  Ssex varchar (4),
  Sage int,
  Sdept varchar (10));

create table Course
( Cno varchar (10) primary key,
  Cname varchar (15),
  Cpno varchar (10),
  Ccredit int,
  Foreign key (Cpno) references Course(Cno));

create table SC
( Sno varchar (10),
  Cno varchar (10),
  Grade int,
  Primary key (Sno,Cno),
  Foreign key (Sno) references Student(Sno),
  Foreign key (Cno) references Course(Cno));

insert into Student values('200215121','李勇','男',20,'CS'),('200215122','刘晨','女',19,'CS'),('200215123','王敏','女',18,'MA'),('200215125','张立','男',19,'IS');

insert into Course values('2','数学',null,2);
insert into Course values('6','数据处理',null,2);
insert into Course values('4','操作系统','6',3);
insert into Course values('7','PASCAL语言','6',4);
insert into Course values('5','数据结构','7',4);
insert into Course values('1','数据库','5',4);
insert into Course values('3','信息系统','1',4);


insert into SC values('200215121','1',92);
insert into SC values('200215121','2',85);
insert into SC values('200215121','3',88);
insert into SC values('200215122','2',90);
insert into SC values('200215122','3',80);

#############################################################################

#单表数据查询

# 数据查询
SELECT - FROM - WHERE句型:

# WHERE  常用的查询条件:
确定范围 BETWEEN AND,NOT BETWEEN AND
确定集合 IN, NOT IN
字符匹配 LIKE,NOT LIKE
空值 IS NULL,IS NOT NULL
逻辑运算 AND,OR,NOT
比较符号

例:
#查询全体学生的学号与姓名
SELECT Sno,Sname
FROM student;

#查询全体学生的所有信息
SELECT *
FROM student;

#查询全体学生的姓名以及出生年份
SELECT Sname,2014-Sage #这里是用2014减去年龄得到 出生年份
FROM student;

#查询中单加一个无中生有的列,和全体学生所在的院系,要求用小写字母表示系名
SELECT Sname,'Year of Birth:',LOWER(Sdept) #不改变数据,大写用UPPER()
FROM student;

#给查询结果的列标题指定别名
SELECT Sname NAME #后面这个是别名
FROM student;

#消除取值重复的行
SELECT DISTINCT Sno #执行后Sno列相同的取值将被去掉  默认为ALL,就是保留重复
FROM SC;

#查询CS的同学姓名
SELECT Sname
FROM student
WHERE Sdept='CS';

#查询字符匹配 
SELECT Sname
FROM student
WHERE Sname LIKE '刘%'; # %代表任意长度 _代表任意单个字符

#如果查询的字符中含有% 或 _,需要用加上\来进行转义
#WHERE Sname NOT LIKE '王\%' ESCAPE '\';  #这里的ESCAPE是定义转义符

# 查询是否为空
SELECT Sname
FROM student
WHERE Sname IS NOT NULL; #空是 IS NULL

#ORDER BY语句
#ORDER BY语句写在查询最后,默认为升序ASC,降序为DESC
SELECT Sname,Grade
FROM student
WHERE Sdept='CS';
ORDER BY Grade DESC;

##################   聚集函数    ##################
#在WHERE子句中不能使用聚集函数
# ORDER BY语句 SELECT语句中可以加聚集函数
聚集函数
SELECT COUNT(*)/COUNT(DISTINCT Sno)/AVG(Grade)/MAX(Grade)/MIN(Grade)

#GROUP BY语句  按谁分组,谁写在GROUP BY中
SELECT Cno,COUNT(Sno) #对组计数得到一个值
FROM SC
GROUP BY Cno;

#HAVING 短语  如果分组之后还要对组筛选,输出符合条件的组使用
SELECT Cno,COUNT(Sno) #对组计数得到一个值
FROM SC
GROUP BY Cno;
HAVING COUNT(*)>3;

#连接查询

#连接查询

#等值连接
#查询每个学生及其选课情况
SELECT S.*,SC.*
FROM S,SC
WHERE S.Sno=SC.Sno;

#多表连接(3表)
#查询每个学生的学号姓名选修课程名及成绩
SELECT student.Sno,Sname,Cname,Grade
FROM student,SC,course
WHERE student.Sno=SC.Sno AND SC.Cno=course.Cno;

#自身连接
#查询每一门课的间接先修课号(先修课的先修课)
SELECT 本课.Cno,先修.Cpno
FROM course 本课,course 先修
WHERE 本课.Cpno =先修.Cno;

#外连接
#查询学生的选课情况(未选课学生的课号和成绩为空)
#将student选择的数据左插入SC表中,并且对没有的值设置为空
SELECT student.Sno,Sname,Cno,Grade
FROM Student left join SC
on student.Sno=SC.Sno;

#嵌入查询  不相关
#查询与'刘晨'在同一个系的学生
SELECT *
FROM student
WHERE Sdept IN(  #先找出刘晨所在的所有系,然后在找这个系的学生信息
	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
);

#带有ANY(SOME)或ALL谓词的子查询
WHERE Sage<ANY(嵌套查询) AND Sdept != 'CS';

#EXISTS 谓词的子查询
#查询所有选修了1号课程的学生姓名
SELECT Sname FROM student WHERE EXISTS(嵌套查询);
#查询没有选修了1号课程的学生姓名
SELECT Sname FROM student WHERE NOT EXISTS(嵌套查询);

#集合查询 并
查询 UNION 查询

#集合查询 交
查询 INTERSECT 查询

#集合查询 差
查询 EXCEPT 查询

#数据修改和授权角色

#插入数据
INSERT INTO SC VALUES('201215128','1',NULL);
或 INSERT INTO SC(Sno,Cno) VALUES('201215128','1');

#修改数据
#所有学生的年龄增加1岁
UPDATE student SET Sage=Sage+1;

UPDATE student SET sage=22 WHERE Sno='201215128';


#删除数据
#删除所有学生的选课记录
DELETE FROM SC;

DELETE FROM student WHERE Sno='201215128';


#建立和删除视图
CREATE VIEW IS_student AS 查询语句;

DROP VIEW IS_student;


#授权和回收
#把SC表的修改成绩的权限授予用户U1
GRANT UPDATE(grade) ON SC TO U1;
#授权所有
GRANT ALL ON SC TO ;

#授权并允许传播权限
GRANT UPDATE(grade) ON SC TO U1 WITH GRANT OPTION;

#收回权限
REVOKE SELECT ON SC FROM U1;


#数据库角色
CREATE ROLE R; #创建角色R
#给角色加权限
#给角色减少权限  上述相同

#将角色授予其他用户
GRANT R TO U1 WITH ADMIN OPTION;

#收回角色从其他角色
REVOKE R FROM U1;

#触发器

#触发器
#格式
CREATE TRIGGER 名 事件 ON 表
类型
BEGIN
动作
END;

例如:
CREATE TRIGGER T BEFORE DELETE ON SC
FOR EACH ROW
BEGIN
	declare V float;#定义一个变量V并将平均成绩存入该变量
	SELECT AVG(grade) INTO V FROM SC;
	UPDATE TEST SET id=V;
END;

#删除触发器
DROP TRIGGER CAT;

#new值和old值  意思old表示原有的值,new表示即将输入改变的新值
CREATE TRIGGER T BEFORE DELETE ON SC  #AFTER UPDATE ON SC
FOR EACH ROW
BEGIN
	IF(new.grade>1.1*old.grade) THEN
	插入语句;
	END IF; #IF语句结束
END;

#数据库设计

以后部分非代码演示,故不作上传。。。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值