day41
约束
实体完整性
-
主键约束
-
唯一约束
-
自增约束
域完整性
限制列的单元格的数据的正确性
-
非空约束
-
not null,非空,此列必须有值
create table subject03(sid int primary key auto_increment,subname varchar(20) unique not null,subHour int );
mysql> desc subject03-> ; +---------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+----------------+ | sid | int(11) | NO | PRI | NULL | auto_increment | | subname | varchar(20) | NO | UNI | NULL | | | subHour | int(11) | YES | | NULL | | +---------+-------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> desc subject02; +---------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+----------------+ | sid | int(11) | NO | PRI | NULL | auto_increment | | subName | varchar(20) | YES | UNI | NULL | | | subHour | int(11) | YES | | NULL | | +---------+-------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> select * from subject02; +-----+---------+---------+ | sid | subName | subHour | +-----+---------+---------+ | 1 | java | 100 | | 2 | pytyon | 90 | | 3 | ui | 80 | | 4 | bigdata | 80 | | 5 | chat | 80 | +-----+---------+---------+ 5 rows in set (0.00 sec) mysql> insert into subject02 values(6, null, 10); Query OK, 1 row affected (0.00 sec) mysql> select * from subject02; +-----+---------+---------+ | sid | subName | subHour | +-----+---------+---------+ | 1 | java | 100 | | 2 | pytyon | 90 | | 3 | ui | 80 | | 4 | bigdata | 80 | | 5 | chat | 80 | | 6 | NULL | 10 | +-----+---------+---------+ 6 rows in set (0.00 sec) mysql> insert into subject03 values(1, 'java', 10); Query OK, 1 row affected (0.00 sec) mysql> select * from subject03; +-----+---------+---------+ | sid | subname | subHour | +-----+---------+---------+ | 1 | java | 10 | +-----+---------+---------+ 1 row in set (0.00 sec) mysql> insert into subject03 values(2, null, 10); ERROR 1048 (23000): Column 'subname' cannot be null
非空字段必须给给值,否则执行报错
-
-
默认值约束
-
default值,为列赋予默认值,当新增数据不指定值时,书写default,以指定的默认值进行填充
create table subject04(sid int primary key auto_increment,subName varchar(20) not null unique,subHour int default 20 ); insert into subject04 (sid, subname) values(2, 'python'); mysql> select * from subject04; +-----+---------+---------+ | sid | subName | subHour | +-----+---------+---------+ | 2 | python | 20 | +-----+---------+---------+
默认值不给填充值的时候,就采用默认值
mysql> insert into subject04 (sid, subname, subhour) values(1, 'java', 80); Query OK, 1 row affected (0.01 sec) mysql> select * from subject04; +-----+---------+---------+ | sid | subName | subHour | +-----+---------+---------+ | 1 | java | 80 | | 2 | python | 20 | +-----+---------+---------+ 2 rows in set (0.00 sec)
当用户给了确定的值之后,也会覆盖默认值
-
-
引用完整性约束
-
constraint 引用名 foreign key (列表) references 被引用的表名(引用表中的列名)
-
foreign key引用外部表的某个列的值,新增数据时,约束此列的值必须时引用表中的值。
create table clazz02(cid int primary key auto_increment,cname varchar(20) not null unique,cdesc varchar(20) ); insert into clazz02 values(1, 'java', 'java desc'); insert into clazz02 values(2, 'python', 'python desc'); insert into clazz02 values(3, 'math', 'math desc'); create table student02(sid int primary key auto_increment,name varchar(20) not null,password varchar(20) not null,age int,tel varchar(11),addr varchar(20) default 'sushe',cid int,constraint fk_stu_cid foreign key(cid) references clazz02(cid) ); insert into student02 values(1, 'wukong', '999999', 500, 119, 'huaguoshan', 1); insert into student02 values(2, 'wuneng', '888888', 2000, 114, 'gaolaozhuang', 3); insert into student02 values(3, 'wujing', '777777', 1500, 112, 'liushahe', 1); insert into student02 values(4, 'tangtang', '999999', 20, 110, null, 2); insert into student02 values(6, 'change', '000000', 20, 110, null, 9); insert into student02(name, password, age, tel, cid) values('xiaobailong', '666666',50, '1111', 9); //执行报错,不存在9班
物理外键:从表中的字段借助foreign key域主表中的字段关联,执行的时候就一定要保证数据的准确性
逻辑外键:使得程序保证数据的准确性,将主表的信息存储在下拉框中,让用户必须选择主表中存在的数据,但是强行执行不存在于主表中的记录的SQL语句还是可以成功的
-
-
检查约束
事务
一件事情,被拆分成多个任务,这多个任务要么同时成功,有部分失败,那么让成功的那些部分需要“回滚”到初始状态
模拟转账
生活中的转账是转账方账户扣钱,收账方账户加钱。我们用数据库模拟这样的一个实现
create table account(aid int primary key,name varchar(20) not null,pass varchar(20) not null,money double ); insert into account values(1, 'wukong', '999999', 1000); insert into account values(2, 'tangtang', '000000', 10000); update account set money= money + 1000 where aid = 1; // 假如这里断电,后面的语句将无法执行 update account set money= money - 1000 where aid = 2;概念:事务是一个原子操作,是一个最小执行单元。可以由一个或者多个SQL语句组成,在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功。有部分SQL语句执行失败,则整个事务都执行失败,让之前成功的部分必须回滚
边界:
开始: 连接到数据库 执行多条DML语句。 结束: 1)提交: 显式提交:commit; 隐式提交:一条创建、删除语句正常退出,客户端正常退出连接 2)回滚: 显式回滚:rollback; 隐式回滚:非正常退出(断电、宕机)start transaction; update account set money = money + 1000 where aid = 1; select * from account; update account set money = money - 1000 where aid = 2; select * from account; commit;start transaction; update account set money = money + 1000 where aid = 1; select * from accoun; update account set money = money - 1000 where aid = 2; select * from account; rollback;应用:
基于增删改的操作结果,可以通过城市手动控制事务的提交或者回滚
开启事务后,执行的语句均属于当前事务,成功再执行commit,失败要进行rollback操作
特性:
atomicity:原子性
consistency:一致性
isolation:隔离性
durability:持久性
权限管理
创建用户
语法: create user 用户名 identified by 密码create user saas identified by 'saas123';
授权
语法 grant all on 数据库.表 to 用户名grant all on saas.* to saas;
撤销授权
revoke all on 数据库.表 from 用户名注意:撤销授权后,账户要重新连接客户端才会生效
删除用户
drop user 用户名drop user saas;
视图
概念:
视图:虚拟表,从一个表或者多个表冲查询出来的结果作为一个视图,作用和真是表一样,包含一系列带有行和列的数据。
视图中,用户可以使用select语句查询数据,也可以使用insert,update,delete修改记录。视图可以是用户操作更方便,并保障数据库系统的安全
特点:
优点:
简单,数据所见即所得
安全,用户只能查询或者修改他们所能见到的数据
逻辑独立性,可以屏蔽真是表结构变化带来的影响
缺点:
性能相对较差,简单的查询也会变得稍微复杂
修改不方便,特别是复杂的聚合视图基本无法修改
语法:
create view 视图名 as 查询数据源表数据 create view stu_view as select sid, name, score from student;create view stu_clazz_view as select s.sid, s.name, s.score, c.cname from student s, clazz c where s.cid = c.cidmysql> select sid, name, score from student; +------+------------+-------+ | sid | name | score | +------+------------+-------+ | 100 | wukong | 99 | | 101 | wuneng | 59 | | 102 | wujing | 60 | | 103 | tangtang | 100 | | 104 | baoyu | 17 | | 105 | daiyu | 16 | | 106 | baichai | 16 | | 107 | xifeng | 27 | | 108 | liubei | 20 | | 109 | sunquan | 20 | | 110 | caocao | 20 | | 111 | songjiang | 20 | | 112 | likui | 22 | | 113 | sunerniang | 20 | +------+------------+-------+ 14 rows in set (0.00 sec) mysql> mysql> create view stu_view as-> select sid, name, score from student; Query OK, 0 rows affected (0.01 sec) mysql> select * from stu_view; +------+------------+-------+ | sid | name | score | +------+------------+-------+ | 100 | wukong | 99 | | 101 | wuneng | 59 | | 102 | wujing | 60 | | 103 | tangtang | 100 | | 104 | baoyu | 17 | | 105 | daiyu | 16 | | 106 | baichai | 16 | | 107 | xifeng | 27 | | 108 | liubei | 20 | | 109 | sunquan | 20 | | 110 | caocao | 20 | | 111 | songjiang | 20 | | 112 | likui | 22 | | 113 | sunerniang | 20 | +------+------------+-------+ 14 rows in set (0.01 sec) mysql> insert into stu_view values(115, 'wusong', 70); Query OK, 1 row affected (0.01 sec) mysql> select * from stu_view; +------+------------+-------+ | sid | name | score | +------+------------+-------+ | 100 | wukong | 99 | | 101 | wuneng | 59 | | 102 | wujing | 60 | | 103 | tangtang | 100 | | 104 | baoyu | 17 | | 105 | daiyu | 16 | | 106 | baichai | 16 | | 107 | xifeng | 27 | | 108 | liubei | 20 | | 109 | sunquan | 20 | | 110 | caocao | 20 | | 111 | songjiang | 20 | | 112 | likui | 22 | | 113 | sunerniang | 20 | | 115 | wusong | 70 | +------+------------+-------+ 15 rows in set (0.00 sec) mysql> select * from student; +------+------------+--------+-------+------+------+ | sid | name | sex | score | cid | age | +------+------------+--------+-------+------+------+ | 100 | wukong | male | 99 | 1 | NULL | | 101 | wuneng | male | 59 | 1 | NULL | | 102 | wujing | male | 60 | 1 | NULL | | 103 | tangtang | male | 100 | 1 | NULL | | 104 | baoyu | male | 17 | 2 | NULL | | 105 | daiyu | female | 16 | 2 | NULL | | 106 | baichai | female | 16 | 2 | NULL | | 107 | xifeng | female | 27 | 2 | NULL | | 108 | liubei | male | 20 | 3 | NULL | | 109 | sunquan | male | 20 | 3 | NULL | | 110 | caocao | male | 20 | 3 | NULL | | 111 | songjiang | male | 20 | 4 | NULL | | 112 | likui | male | 22 | 4 | NULL | | 113 | sunerniang | female | 20 | 4 | NULL | | 115 | wusong | NULL | 70 | NULL | NULL | +------+------------+--------+-------+------+------+ 15 rows in set (0.00 sec) mysql> select * from student s, clazz c where s.cid = c.cid; +------+------------+--------+-------+------+------+------+------------+-----------------+ | sid | name | sex | score | cid | age | cid | cname | cdesc | +------+------------+--------+-------+------+------+------+------------+-----------------+ | 100 | wukong | male | 99 | 1 | NULL | 1 | computer | computer desc | | 101 | wuneng | male | 59 | 1 | NULL | 1 | computer | computer desc | | 102 | wujing | male | 60 | 1 | NULL | 1 | computer | computer desc | | 103 | tangtang | male | 100 | 1 | NULL | 1 | computer | computer desc | | 104 | baoyu | male | 17 | 2 | NULL | 2 | software | software desc | | 105 | daiyu | female | 16 | 2 | NULL | 2 | software | software desc | | 106 | baichai | female | 16 | 2 | NULL | 2 | software | software desc | | 107 | xifeng | female | 27 | 2 | NULL | 2 | software | software desc | | 108 | liubei | male | 20 | 3 | NULL | 3 | math | math desc | | 109 | sunquan | male | 20 | 3 | NULL | 3 | math | math desc | | 110 | caocao | male | 20 | 3 | NULL | 3 | math | math desc | | 111 | songjiang | male | 20 | 4 | NULL | 4 | biological | biological desc | | 112 | likui | male | 22 | 4 | NULL | 4 | biological | biological desc | | 113 | sunerniang | female | 20 | 4 | NULL | 4 | biological | biological desc | +------+------------+--------+-------+------+------+------+------------+-----------------+ 14 rows in set (0.00 sec) mysql> select s.sid, s.name, s.score, c.cname from student s, clazz c where s.cid = c.cid; +------+------------+-------+------------+ | sid | name | score | cname | +------+------------+-------+------------+ | 100 | wukong | 99 | computer | | 101 | wuneng | 59 | computer | | 102 | wujing | 60 | computer | | 103 | tangtang | 100 | computer | | 104 | baoyu | 17 | software | | 105 | daiyu | 16 | software | | 106 | baichai | 16 | software | | 107 | xifeng | 27 | software | | 108 | liubei | 20 | math | | 109 | sunquan | 20 | math | | 110 | caocao | 20 | math | | 111 | songjiang | 20 | biological | | 112 | likui | 22 | biological | | 113 | sunerniang | 20 | biological | +------+------------+-------+------------+ 14 rows in set (0.00 sec) mysql> create view stu_clazz_view as-> select s.sid, s.name, s.score, c.cname from student s, clazz c where s.cid = c.cid; Query OK, 0 rows affected (0.01 sec) mysql> select * from stu_clazz_view; +------+------------+-------+------------+ | sid | name | score | cname | +------+------------+-------+------------+ | 100 | wukong | 99 | computer | | 101 | wuneng | 59 | computer | | 102 | wujing | 60 | computer | | 103 | tangtang | 100 | computer | | 104 | baoyu | 17 | software | | 105 | daiyu | 16 | software | | 106 | baichai | 16 | software | | 107 | xifeng | 27 | software | | 108 | liubei | 20 | math | | 109 | sunquan | 20 | math | | 110 | caocao | 20 | math | | 111 | songjiang | 20 | biological | | 112 | likui | 22 | biological | | 113 | sunerniang | 20 | biological | +------+------------+-------+------------+ 14 rows in set (0.00 sec)删除视图:
drop view 视图名
注意:删除视图,不会影响原表
总结
DQL: data query language: 数据查询语言,select, where, order by, group by, having
DDL: data definition language:数据定义语言,create, alter, drop
DML:data manipulattion language: 数据操作语言,insert, update, delete
TPL:transaction process language:事务梳理语言,commit,rollback
DCL:data control language: 数据控制语言,grant,revoke
作业
一、设有一数据库,包括四个表: 学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。 • 表1-1数据库的表结构---数据字典 表(一)Student (学生表) 属性名 数据类型 可否为空 含 义 Sno varchar (20) 否 学号(主键) Sname varchar (20) 否 学生姓名 Ssex varchar (20) 否 学生性别 Sbirthday datetime 可 学生出生年月 Class varchar (20) 可 学生所在班级 表(二)Course(课程表) 属性名 数据类型 可否为空 含 义 Cno varchar (20) 否 课程号(主键) Cname varchar (20) 否 课程名称 Tno varchar (20) 否 教工编号(外键) 表(三)Score(成绩表) 属性名 数据类型 可否为空 含 义 Sno varchar (20) 否 学号(外键) Cno varchar (20) 否 课程号(外键) Degree Decimal(4,1) 可 成绩 主键:Sno+ Cno 表(四)Teacher(教师表) 属性名 数据类型 可否为空 含 义 Tno varchar (20) 否 教工编号(主键) Tname varchar (20) 否 教工姓名 Tsex varchar (20) 否 教工性别 Tbirthday datetime 可 教工出生年月 Prof varchar (20) 可 职称 Depart varchar (20) 否 教工所在部门 \#建学生信息表student create table student ( sno varchar(20) primary key , sname varchar(20) not null, ssex varchar(20) not null, sbirthday date, class varchar(20) )character set utf8; \#建立教师表 create table teacher ( tno varchar(20) primary key, tname varchar(20) not null, tsex varchar(20) not null, tbirthday datetime, prof varchar(20), depart varchar(20) not null ); \#建立课程表course create table course ( cno varchar(20) primary key, cname varchar(20) not null, tno varchar(20) not null, constraint fk1 foreign key(tno) references teacher(tno) ); \#建立成绩表 create table score ( sno varchar(20) not null, constraint fk2 foreign key(sno) references student(sno), cno varchar(20) not null, constraint fk3 foreign key(cno) references course(cno), degree int ); \#添加学生信息 insert into student values('108','曾华','男','1977-09-01','95033'); insert into student values('105','匡明','男','1975-10-02','95031'); insert into student values('107','王丽','女','1976-01-23','95033'); insert into student values('101','李军','男','1976-02-20','95033'); insert into student values('109','王芳','女','1975-02-10','95031'); insert into student values('103','陆君','男','1974-06-03','95031'); \#添加教师表 insert into teacher values('804','李诚','男','1958-12-02','副教授','计算机系'); insert into teacher values('856','张旭','男','1969-03-12','讲师','电子工程系'); insert into teacher values('825','王萍','女','1972-05-05','助教','计算机系'); insert into teacher values('831','刘冰','女','1977-08-14','助教','电子工程系'); \#添加课程表 insert into course values('3-105','计算机导论','825'); insert into course values('3-245','操作系统','804'); insert into course values('6-166','数字电路','856'); insert into course values('9-888','高等数学','831'); \#添加成绩表 insert into score values('103','3-245','86'); insert into score values('105','3-245','75'); insert into score values('109','3-245','68'); insert into score values('103','3-105','92'); insert into score values('105','3-105','88'); insert into score values('109','3-105','76'); insert into score values('103','3-105','64'); insert into score values('105','3-105','91'); insert into score values('109','3-105','78'); insert into score values('103','6-166','85'); insert into score values('105','6-166','79'); insert into score values('109','6-166','81'); 1、 查询Student表中的所有记录的Sname、Ssex和Class列。 2、 查询教师所有的单位即不重复的Depart列。== 3、 查询Student表的所有记录。 4、 查询Score表中成绩在60到80之间的所有记录。 5、 查询Score表中成绩为85,86或88的记录。 6、 查询Student表中“95031”班或性别为“女”的同学记录。 7、 以Class降序查询Student表的所有记录。 8、 以Cno升序、Degree降序查询Score表的所有记录。 9、 查询“95031”班的学生人数。 10、查询Score表中的最高分的学生学号和课程号。(子查询或者排序) 11、查询每门课的平均成绩。 12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。== 13、查询分数大于70,小于90的Sno列。 14、查询所有学生的Sname、Cno和Degree列。 15、查询所有学生的Sno、Cname和Degree列。 16、查询所有学生的Sname、Cname和Degree列。 17、查询“95033”班学生的平均分。 19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。== 20、选了多门课程并且是这个课程下不是最高分的== 21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 22、查询和学号为108、101的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 23、查询“张旭“教师任课的学生成绩。 24、查询选修某课程的同学人数多于5人的教师姓名 25、查询95033班和95031班全体学生的记录。 26、查询存在有85分以上成绩的课程Cno. 27、查询出“计算机系“教师所教课程的成绩表。== 28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。== 29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。== 30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. 31、查询所有教师和同学的name、sex和birthday.== 32、查询所有“女”教师和“女”同学的name、sex和birthday. 33、查询成绩比该课程平均成绩低的同学的成绩表。== 34、查询所有任课教师的Tname和Depart. 35、查询所有未讲课的教师的Tname和Depart. 36、查询至少有2名男生的班号。 37、查询Student表中不姓“王”的同学记录。not like 38、查询Student表中每个学生的姓名和年龄。 39、查询Student表中最大和最小的Sbirthday日期值。 40、以班号和年龄从大到小的顺序查询Student表中的全部记录。 41、查询“男”教师及其所上的课程。 42、查询最高分同学的Sno、Cno和Degree列。 43、查询和“李军”同性别的所有同学的Sname. 44、查询和“李军”同性别并同班的同学Sname. 45、查询所有选修“计算机导论”课程的“男”同学的成绩表。