【MySQL】数据库入门与提高
什么是数据?
生活中我们的成绩,自己的工资,这些都是狭义上的数值数据
广义:文字、声音、图形等,一切能够被计算机接收并且能被处理的符号
大量、海量的数据组成的就是数据库
数据库的特点:存储大量数据,方便检索和访问
保持数据信息的一致、完整
共享和安全(你的行程会共享给多个部门与组织,例如去一趟哈尔滨,那么你的数据就会被保存在公交局)
通过组合分析,产生新的有用信息
数据管理技术的发展阶段: 人工管理阶段——文件系统管理阶段——数据库管理阶段
数据库就是存放数据的仓库 管理数据库的系统就叫做数据库管理系统
关系型数据库:通过关系模型建立的数据库,存储结构是多个二维表,例如一个学校的数据库就分为学生表教师表...
数据库管理系统(DBMS):对收集到的大量数据进行整理、加工、归纳、分类、汇总等
数据库应用系统
应用程序客户端(电脑,PC)
数据库服务器(服务器,数据库)
应用程序客户端对数据库服务器进行操作与查询,而数据库服务器对应用程序客户端进行相应
结构化查询语言(SQL)
SQL语言是用于关系型数据库的查询的结构化语言,对于网状型数据库等不起作用。
关系型数据库常用的SQL语言有:MySQL(体积小,速度快,成本低,开源) and SQLsever and Oracle(世界上最好的关系型数据库语言) Access
关系:一个关系通常对应一张表(一个表里有多个关系)
关系模式:关系的描述
数据库的表的创建与管理
图形界面工具:使用 Navicat 右击创建数据库与表
命令行方式
创建数据库:create databases(数据库名);
mysql> create database if not exists scout;
Query OK, 1 row affected (0.00 sec)
mysql> create schema if not exists iboy;
Query OK, 1 row affected (0.00 sec)
【if not exists(系统会自动检测,没有这个数据库就会建一个,有的话就不管了,没有这句话的话系统会报错)】 create database/schema IF NOT EXISTS MINI;
数据库名表示被创建数据库名,数据库名必须符合以下规则:
数据库名必须唯一
名称内不能含有“/”及“.”等非法字符
数据库名最大不能超过64字节
数据库文件:数据库是由相关数据表组成,一个数据库包括多个数据表。
显示数据库:显示服务器中已经建立的数据库,使用SHOW DATABASES;
因为MySQL服务器中有多个数据库,可以使用USE命令可指定当前数据库
语法格式:USE 数据库名;
eg:USE mini;
字符集是一套符号的编码。
eg:ASCII字符集中有四个字母:‘A’,‘a’,‘B’,‘b’。每个字母都有一个赋予的数字,AabB是字符,赋予的数字是编码,字符和编码合在一起是字符集。
GB2312是中国国家标准的简体中文字符集。
校对规则是在字符集内用于比较字符的一套规则。
数据操纵(增删改查)
数据插入:INSTER INTO 表名(列名)
VALUES(表达式,...);
第一行inster表示插入到哪个列表那个列,values表示插入的值,这个不一定必须是值(常量变量),也可以是一个表达式,
eg: USE Bookstore:
INSERT INTO book
VALUES( '6625','计算机',‘Dreamwearer 8’,
‘2010-08-16’,33.25,NULL,NULL);
book后面没有默认值就代表从第一列开始插入
如果不想默认插入的话:eg:
INSTER INTO Book
(图书编号,书名,出版日期,单价)
VALUES('6626','网站制作‘,‘2021-11-22’,33.25);
当执行一遍操作了之后,插入第二条相同编号的记录时,系统提示错误,意为表中已经有图书编号为6625的记录,第二条记录不能插入。为了不想让他提示错误,更换表中的值不能用插入的话我们可以用替换,也就是增删改查中的改。也就是REPLACE语句。
数据修改(一):REPLACE INTO 表名
VALUES(表达式,...);
eg: 【图书编号,图书类型,书名,出版日期,单价,容量,封面(计算机中的地址)】
USE Bookstore:
REPLACE INTO book
VALUES( '6625','计算机',‘Dreamwearer 8’, ‘2010-08-16’,33.25,40,NULL);
数据修改(二):UPDATE 表名
SET 列名1 = 表达式1[,列名2 = 表达式2,...]
[WHERE条件](WHERE时指定的条件对符合条件的数据进行修改,如果没有WHERE语句则对全部数据进行修改)
eg:UPDATE Book
SET 数量 = 数量+10;(让Book中的所有数据的数量都加10.因为是所有的书籍都加所以就不用WHERE了)
UPDATE Members
SET 联系电话 = ‘13802551234’,密码 = ‘111111’
WHERE 姓名 = ‘张三’;(如果不加张三的话就会修改全部人的联系电话和密码,既然不想修改全部人的联系电话和密码,只想修改张三的联系电话和密码,则用WHERE语句来指定只修改张三的信息,因为张三是字符型所以要加上‘’)
数据修改(三):UPDATE(多表修改方式) 表名1,表名2
SET 列名1 = 表达式1[,列名2 = 表达式2,...]
[WHERE 条件]
表明列表:包含了多个表的联合,各表之间用逗号隔开,多表修改语法和其他部分与单表修改法相同。
eg:【订单号为16的客户因某种原因退回4本图书,请在sell表中修改订购册数,同时书退回后,book表中该图书的数量要增加4本】
UPDATE sell,book
SET sell.订购册数=订购册数-4,book.数量 = 数量+4
WHERE sell.图书编号=book.图书编号 and sell.订单号=‘16’;(当UPDATE修改多个表时,要修改的表明之间用逗号隔开,字段名因为涉及到多个表,用‘表名.字段名’表示,总之就是用图书编号将两个数据库联系起来,通过where来联系起来,此时这个图书编号就是两个数据库之间的外码,且多表连接条件必须在WHERE子句中指定)
多表与单表之间的区别就是在where里用同名属性进行了两个数据的连接,而且在单表的时候就不需要在每个属性前加上表名了,我们看现在的表里的属性都是sell.属性或者book.属性,虽然说在单表修改的时候加上也没有关系,但是也没有必要。
【修改数据库的字符集和校对规则:ALTER DATABASE命令
alter database iboy
default character set utf8
default collate utf8_bin;】
【删除数据库;DROP DATABASE;
daop database mom;】
删除数据(一;单表删除): DELETE FROM 表名
[WHERE条件]
删除数据(二;多表删除): DELETE FROM 表名1,表名2
FROM 表名列表
[WHERE条件]
数据删除(三)使用TRUNCATE TABLE语句删除数据:因为使用DELETE语句删除会产生日志,不仅占内存而且太慢了,使用这个语句进行删除的数据不可恢复,且无日志,谨慎使用。如果在数据库中参与了索引(加快查询,增加效率)和视图(保障数据安全的措施,在表上面生成的表),就不能用TRUNCATE来删除,而应该用DELETE。 TRUNCATE TABLE 表名
以上我们介绍了数据库的表的属性的增删改查,那么我们接下来来学习一下数据库表的查询。表的查询分为单表查询、多表查询、子查询。
单表查询(一):SELECT语句
使用数据库的目的是为了存储数据以便在需要的时候进行检索、统计或组织输出,通过SQL语句的查询可以从表或视图中迅速方便地检索数据。
SELECT——要查询的属性(列表中要有的列)
FROM——指定表(只查询表内的语句)
WHERE——条件:只显示列中满足条件的数据
GROUP BY——对查询出的数据进行分组 {列名|表达式|列编号}
HAVING——用于GROUP BY的后面,条件
ORDER BY——进行排序 {列名|表达式|列编号}
选择指定的列 使用SELECT语句选择一个表中的某些列的语法如:
SELECT Z
1.选择指定的列 使用SELECT语句选择一个表中的某些列的语法如下:
SELECT 字段列表 FROM 表名
Eg:查询Bookstore数据库的Members表中各会员的会员姓名,联系电话和注册时间。
USE Bookstore;
SELECT 会员姓名、联系电话、注册时间
FROM Members;
如果说要查询Members表中的所有信息,是不是需要把表中所有的列都打出来呢?
不是,可以用*来代替。 SELECT * FROM Members;
2.定义列表别名:当需要查询结果中的某些列或所有列显示时使用自己选择的列标题时,可以在列名之后使用AS子句来更改查询结果的列别名(例如说我们查询学生姓名的时候表中的数值是Sname,但是你知道名字是Sname,别人可能不知道,这时候就要用AS命令)
语法格式为: SELECT 字段列名 AS 别名
Eg:查询Book表中图书类别为计算机的图书书名,作何和出版社,结果中各列的标题分别制定为name、auther和publisher。
SELECT 书名 AS name,作者 AS auther,出版社 AS publisher
FROM Book
WHERE 图书类别= “计算机”
注意!当自定义的列标题中含有空格时,必须用单引号将标题括起来。
好比你的一个列名为phone number,写成‘phone number’
3.替换查询结果中的数据:例如我们在统计公民信息的时候遇到大于六十岁的年龄这的数据的时候,可以让数据输出出来‘老年人’三个字。
Eg:要替换查询结果中的数据,则要使用查询中的CASE表达式,格式为:
CASE
WHEN 条件1 THEN 表达式1
WHEN 条件2 THEN 表达式2
……
ELSE 表达式
END
Eg:查询Book表中图书编号、书名和数量,对其库存数量按一下规则进行替换:若数量为空值,替换为“尚未进货”:若数量小于5,替换为“需进货”;若数量在5-50之间,替换为“库存正常”;若库存大于50,替换为“库存积压”。列标题更改为“库存”
SELECT 图书编号,书名
CASE
WHEN 数量 IS NULL THEN ‘尚未进货’
WHEN 数量 < 5 THEN ‘需进货’
WHEN 数量 >=5 and 数量 <=50 THEN ‘库存正常’
ELSE ‘库存积压’
END AS 库存
FROM Book;
4.计算列值:使用SELECT对列进行时查询时,在结果中可以输出对列值计算后的值,即SELECT子句可使用表达式作为结果,格式为:SELECT 表达式1【表达式2……】
Eg:对Sell表已发货的记录计算订购金额(订购金额=订购册数*订购单价),并显示图书编号和订购金额
SELECT 图书编号,订购册数*订购单价AS 订购金额
FROM Sell
WHERE 发货状况 = ‘已发货’
5.消除结果集中的重复行:对表只选择某些列时,可能会出现重复行。例如,若对XSCJ数据库的XS表中选择专业名和总学分,则出现多行重复的情况。可以用DISTINCT或DISTINCTOW关键字消除结果集中的重复行,
其格式是:SELECT DISTINCT 字段列表
其含义是对结果集中的重复行只选择一个,保证行的唯一性
Eg:对Book表中只选择图书类别和出版社,消除结果集中的重复行
SELECT DISTINCT 图书类别,重复行
FROM Book;
WHERE比较运算的例子
1. 查询Bookstore数据库Book表中书名为“网页程序设计”的记录
SELECT * FROM Book
WHERE 书名=‘网页程序设计’;
2. 查询Book表中单价大于30的图书情况。
SELECT * FROM Book
WHERE 单价>30;
逻辑运算:通过逻辑运算符(AND、OR、XOR和NOT)组成更为复杂的查询条件。逻辑运算的结果是“1”或“0”,分别表示“True”或“False”。
1. 查询Sell表中已收货且已结清的订单情况
SELECT 订单号,是否收货,是否结清 FROM Sell
WHERE 是否收货=“已收货” AND 是否结清=‘已结清’;
2. 查询Book表中清华大学出版社和北京大学出版社出版的价格大于25元的图书。
SELECT * FROM Book
WHERE (出版社=‘清华大学出版社’OR出版社=‘北京大学出版社’)
AND 单价 >=25;
或
SELECT * FROM Book
WHERE (出版社=‘清华大学出版社’ AND 单价>25)
OR(出版社=‘北京大学出版社’ AND 单价>25);
思考:那么如果把例一的括号去掉可不可呢?答案是不可以,因为AND的优先级高于OR。
LIKE运算符
模式匹配(LIKE运算符):LIKE运算符用于支出一个字符是否与指定的字符串相匹配,其对象可以使char、varchar、text、datETIMe等类型的数据,返回逻辑值TRUE或FALSE
使用LIKE进模式匹配时,常使用特殊符号_和%进行模糊查询。
%代表0到多个字符,而_代表单个字符。
1. 查询Members表中姓”张”的会员的身份证号,姓名以及注册时间
SELECT 用户号,会员姓名,注册时间 FROM Members
WHERE 会员姓名 LIKE ‘张%‘;
2. 查询Book表中图书编号倒数第二位为T的图书的图书编号和书名
SELECT 图书编号,书名 FROM Book
WHERE 图书编号 LIKE ‘%T_’;
子查询
在查询条件中,可以使用另一个查询的结果作为条件的一部分,例如,判定列值是否与某个查询的结果集中的值相等,作为查询条件一部分的查询成为子查询。SQL标准允许SELECT多层次嵌套使用,用来表示复杂的查询,子查询除了可以在SELECT语句中,还可以用在INSERT、UPDATE以及DELETE语句中。
子查询通常与IN、EXIST谓词以及比较运算符结合使用。
(1)IN子查询
IN子查询用于进行一个给定值是否在子查询结果集中的判定。
例子:查找在Bookstore数据库中张三的订单信息
SELECT *
FROM Sell
WHERE 用户号 IN
(SELECT 用户号 FROM Members
WHERE 会员姓名 = “张三”);
子查询嵌套举例
IN子查询只能返回一列数据。对于比偶叫复杂的查询,可以使用嵌套的子查询。
例子:查找购买除了“网页程序设计”以外图书的会员信息。要查找会员信息,先要知道会员的身份证号,而要知道购买了“网页程序设计”以外图书的会员,可以按图书编号在Sell表中查到,但是"网络程序设计"的图书编号要通过查找Book才可以获得。
SELECT * FROM Members WHERE 用户号 IN
(SLEECT 用户号 FROM Sell WHERE 图书编号 NOT IN)
(SELECT 图书编号 FROM Book WHERE 书名=‘网页程序设计’));
SELECT子句的表达式中还可以包含所谓的聚合函数。聚合函数常擦好难过用于对一组值进行计算,然后返回单个值。
COUNT 求组中项数,返回int类型整数
求元组的个数,例如求学生成绩大于70分的人数,用于统计组中满足条件的行数和总行数,返回SELECT语句检测到的行中非NULL值的数目,若找不到匹配的行,则返回0。
语法格式为: COUNT ({[ ALL | DISTINCT]表达式} | *)
例子:求会员总人数
SELECT COUNT(*) AS ‘会员数’ FROM Members;
例子:统计已结清的额订单数
SELECT COUNT(是否结清) AS ‘已结清的订单数’ FROM Sell;
例子:统计订购册数在5以上的订单数
SELECT COUNT(订购册数) AS ‘订购册数在5以上的订单数’
FROM Sell
WHERE 订单册数>5;
MAX and MIN MAX和MIN分别用于求表达式中所有值项的最大值与最小值。
SUM and AVG SUN和AVG分别用于求表达式的和和平均。
GROUP BY子句主要用于根据字段对行分组。
例如,根据学生所学的专业对XS表中的所有行分组,结果是每个专业的学生成为一组。
例子:输出Book表中图书类别名
SELECT 图书类别 FROM Book GROUP BY 图书类别;
HAVING子句的目的与WHERE子句类似,不同的是WHERE子句是用在FROM子句之后选择行,而HAVING子句用在GROUP BY子句后选择行。
例子:查找Sell表中每个会员平均订购册数在10本以上的会员的用户号和平均订购册数。
SELECT 用户号,AVG(订购册数) AS ‘平均订购册数’
FROM Sell
GROUP BY 用户号
HAVING AVG(订购册数) >10;
单元练习:
选择题
(B)是存储在计算机内有结构的数据的集合
A.数据库系统
B.数据库
C.数据库管理系统
D.数据结构
数据库的特点之一是数据的共享,严格的讲这里的数据共享是指(D)
A. 同一个应用中的多个程序共享一个数据集合
B. 多个用户,同一种语言共享数据
C. 多个用户共享一个数据文件
D. 多种应用、多种语言、多个用户互相覆盖地使用数据集合
在数据库中存储的是(C)
A. 数据
B. 数据模型
C. 数据及数据之间的联系
D. 信息
数据库(DB)、数据库系统(DBS)和数据库管理系统(DBMS)之间的关系是(A)
A. DBS包括DB和DBMS
B. DBMS包括DB和DBS
C. DB包括DBS和DBMS
D. DBS就是DB,也就是DBMS
下列选项中不是关系数据库基本特征的是(A)
A. 不同的列应有不同的数据类型
B. 不同的列应有不同的列名
C. 与行的次序无关(变动行的位置,例如说张三在李四的前面我们反过来)
D. 与列的次序无关(变动列的位置,例如说张三在李四的下面我们反过来)
SQL语言是(B)的语言,容易学习
A. 过程化
B. 非过程化
C. 格式化
D. 导航式
#就好比你上学来,我无需关心你是怎么来的,不注重过程,只注重你是否来了,因此易学。
下列关于MySQL的说法中,错误的是(D)
A. MySQL是一款关系数据库系统
B. MySQL是一款网络数据库系统
C. MySQL可以在Linux或者Windows下运行
D. MySQL对SQL的支持不是太好
#MySQL本身就是一个SQL语言,怎么可以说对SQL语句不友好呢
关系数据的基本数据结构是(C)
A. 数据库
B. 关系模式
C. 关系
D. 元组或记录
下列四项中,不属于数据库系统的主要特点是(D)
A. 数据结构化
B. 数据的冗余度小
C. 较高的数据独立性
D. 程序的标准化
在(A)中一个节点可以有多个双亲,节点之间可以有多种联系
A. 网状模型
B. 关系模型
C. 层次模型
D. 以上都有
# 关系模型是一个二维表,不涉及双亲。层次模型是一个节点只有一个父节点,不涉及双亲。
学生关系模型S(SNO,SNAME,SEX,AGE),S的属性分别表示学生的学号、姓名、性别、年龄。要在表S中删除属性AGE,可选用的SQL语句是(A)
A. DELECT AGE FROM S
B. ALTER TABLE S DROP AGE
C. UPDATE S AGE
D. ALTER TABLE S AGE
数据库类型是按照(C)来进行划分的
A. 文件形式
B. 记录形式
C. 数据类型
D. 数据存取方式
关系模式的任何属性(A)
A. 不可再分
B. 可再分
C. 命名可以不唯一
D. 以上都不对
#满足关系模式或关系模型的最基本的要求就是大表里面不可以再套小表。
概念模型通过(D)来表示数据库系统的结构
A. E-R图中的实体
B. 实体的属性
C. 实体之间的关系
D. 以上都对
数据库的基本特点包括(D)
A. 数据共享性高,冗余度低
B. 数据独立性高
C. 数据结构化
D. 以上都对
判断题
1. (√)在文件系统中,不容易做到数据共享,在数据库系统中,容易做到数据共享
2. (×)关系是静态的、稳定的,关系模式是动态的,随时间变化
#说反了,关系模式是一个静态的、稳定的,比如说学校的学生表,里面有学号与性别等等的这些属性是一个关系模式,这个是不变的,而表中的数据是随时变的。
我们说一个关系是一个表,这个表是随时都可以更新的,不断地有新生加入老生离开,这个表就是一个动态的,随时变化的,而关系模式才应该是静态的,稳定的。
3. (×)关系模式要求最低要满足2NF
#NF是范式的意思,关系模式有三个范式,最低要满足第一范式,也就是1NF,大表不得套小表。
4. (√)关系模式是用二维表表示实体集属性间关系以及实体集之间联系的模型
填空题
1. 关系模型主要特征是用(二维表)结构表达实体集,用外键表示实体间的关系
2. 关系中的每一行成为(元组),每一列称为(属性)
3. 数据的加工是一个逐步转化的过程,其经历了现实世界、信息世界和计算机世界这3个不同的世界,其数据模型与之对应分成(实体模型)(概念模型)和(数据模型)。
#顺序不能前后颠倒,实体对应现实,信息对应概念,计算机对应数据。
4. 创建、修改和删除数据库的命令分别是(create)DATABASE、(alter)DATABASE和(drop)DATABASE
5. DBMS是指(数据库操作系统),它是位于用户和(操作系统)之间的一层管理软件
6. 数据库系统一般由(数据库)、(数据库管理系统)、应用系统、数据库管理员和用户组成
7. 按照数据结构的类型来命名,逻辑模型分为层次模型、(关系模型)和(网状模型)。
简答题
为某百货公司设计一个E-R模型
百货公司管辖若干连锁店,每家商店经营若干商品,每家商店有若干员工,但每个职工只能服务于一家商店。
实体类型“商店”的属性包括:店号、店名、店址和店经理
试题类型“商品”的属性包括:商品号、品名、单价和产地
实体类型“职工”的属性包括:工号、姓名、性别和工资
在联系中反映出职工参加某商店工作的开始时间、商店销售商品的月销售量。
画出反映商店、商品、职工实体类型及联系的E-R图并将其转换成关系模式集。

2.假设数据库Bookstore中已经存在table1表,将table1表重命名为student。
USE Bookstore;
rename table table1 to student;
下一章——数据视图
我们在建立大型的数据库时,针对不同的用户,例如说教务处比较关注的是表中的成绩,学生办关注的是课程,不同的受众人群关注的数据库中的点就不一样。又或者一个数据库有些部分是不能被人查看的,这种情况下就会出现我们这一章所要讲解的数据视图,它类似于一个窗口,哪扇窗口对哪些用户敞开,能够对数据库进行一些操作,但是数据视图本身是不存在数据的,它是用来对数据库进行的一个操作。
我们要学会创建视图,然后我就就需要了解对视图的操作(增删改查)。
视图
视图是数据库的用户使用数据库的观点。例如对于一个学校,其学生的情况存于数据库的一个表或多个表中,而作为学校的不同职能部门,所关心的学生数据的内容是不同的。即使是同样的数据,也可能有不同的操作要求,于是就可以根据他们的不同需求,在物理的数据库上定义他们对数据库所要求的数据结构,这根据用户观点所定义的数据结构就是视图。
视图与表是不同的,视图是一个虚表(虚表的意思是没有实际的数据的表,无法进行存储于删改,就像是一个窗口,用来观察数据表中的数据)。
视图是从一个或多个表(或视图)导出的表。视图一经定义以后,就可以像表一样被修改、删除、查询或更新等。
视图的优点
屏蔽数据库的复杂性。用户不必了解复杂的数据库中的表结构,并且数据库表的更改也不影响用户对数据库的使用,
简化用户权限的管理。秩序授予用户使用视图的权限么不必指定用户只能使用表的特定列,也增加了安全性。
标语数据共享,各个用户不必定义和存储自己所需的数据,可以共享数据库的数据,这样同样的数据只需存储一次。
如何创建视图呢?
使用CREATE VIEW语句创建视图
CREATE VIEW 视图名【列名表名】 AS select语句 WITH CHECK OPTION;
列名列表:要想为谁的列定义明确的名称,可以使用可选的列名列表字句,列出有逗号隔开的列名。列名列表中的名称数目必须等于SELECT语句检索到的列数。
例子:创建Bookstore数据库上的jsj_sell视图,包括计算机类图书的销售的订单号,图书编号,书名,订购册数等情况。要保证对该视图的订单修改都要符合计算机类这个条件。
CREATE VIEW jsj_sell AS
SELECT 订单号,Sell.图书编号,书名,订购册数
FROM Book,Sell
WHERE Book.图书编号=Sell.图书编号
AND Book.图书类别=“计算机”
WITH CHECK OPTION;
例二:
查找平均订购册数大于5本的订购客户的用户号和平均订购册数。
我们可以先创建客户平均订购视图kh_avg,包括用户号(在试图中列名为userID)和平均订购册数(在视图中列名为oreder_avg)。
创建客户品平均订购视图kh_avg:
CREATE VIEW kh_avg(userID,order_avg)
AS
SELECT 用户号,AVG(订购册数)
FROM Sell
GROUP BY 用户号
再对kh.avg视图进行查询。
SELECT *
FROM kh_avg
WHERE order_avg>5;
可更新视图(操作视图)
要通过视图更新基本表数据,必须保证视图是可更新视图,即可以再INSET、UPDATE或DELETE等语句当中使用它们。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。
插入数据:使用INSERT语句通过视图向基本表插入数据。
当试图所依赖的基本表有多个时,不能向该视图插入数据,因为这将会影响多个基本表。说白了是因为每个表的列数可能不一样。
修改数据:使用UPDATE语句可以通过视图修改基本表的数据。
例子:将jsj_book视图中所有单价降低5%。
UPDATE jsj_book SET 单价=单价*(1-0.05);
该语句实际上是将jsj_book视图所依赖的基本表book中所有计算机单价降低百分之五。
若一个表依赖于多个基本表,则依次修改该视图只能变动一个基本表的数据,说白了就是要一个表一个表的改。
删除数据:使用DELETE语句可以通过视图删除基本表的数据
删除jsj_book中“中国青年出版社”的记录
DELETE FROM jsj_book
WHERE 出版社=‘中国青年出版社’
对依赖于多个基本表的视图,不能使用DELETE语句。例如,不能通过对jsj_sell视图执行DELETE语句二删除与之相关的基本表Book以及Sell表的数据。(drop是删除表,在这里也就是删除视图,于delete不一样)
修改表结构:ALERT语句可以对已有视图的定义进行修改
语法格式:ALTER VIEW 视图名[列名列表] AS select语句
例子:将jsj_book视图修改为包含计算机类图书的图书编号、书名和单价(也就是说这个视图原来的类别可能有生物有化学有计算机,经过这一操作就只剩下计算机了)。
ALTER VIEW jsj_book AS SELECT 图书编号,书名,单价
FROM Book WHERE 图书类别=‘计算机’;
使用SQL中的DROP语句删除视图(使用DRIO VIEW 一次可以删除多个视图)
语法格式:DROP VIEW [IF EXISTS] 视图名1 [视图名2]
IF EXISTS是用来如果表中没有的话不会报错的功能
下面我们再来做一些题来复习一下前面的知识(比较难的题我会标红!)
用于范围比较的关键字有两个,分别是(BEWTEEN 和 IN)
补充一下,我们说BETWEEN和AND应该是算是一个
判断题
使用UPDATE语句更新表中的数据时,一次只能更新一个字段中的数据(×)
省略了WHERE字句的DELETE语句将删除表中的所有数据(√)
一个HAVING子句必须位于GROUP BY子句之后,ORDER BY子句之前(√)
当在SELETE语句指定列的位置上使用*号时,表示选择表的所有列(√)
对表只选择某列,可能会出现重复行,可用UPDATE关键字清除结果集中的重复行(×)
索引与数据完整性约束的创建
索引与我们之前创建的表与视图差不多,并没有太大的区别。
顾名思义,我们这一章节的知识点分为索引与数据完整性约束。
什么是索引?索引相当于我们读书时所用到的目录,一看目录就知道要看翻到第几页,例如说我们如果有人未来要从事于大数据方面的工作,我们在查看某项内容的时候我们只需要查看索引就知道查看哪个内容了。
什么是数据完整性?数据完整性要与数据正确性区分。数据正确性的意思是我输入的数据是正确的,例如我们在输入性别这一栏的时候只有男女两个选项,你输入一个姓名肯定是不正确的。数据的完整性是说要保证数据列没有空值。
索引——是一种提高查找速度的机制。
索引用来快速地寻找某些具有特定值的几率,如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直接找到符合要求的几率,表里面的记录数量越多,这个操作的代价就越高。
索引提供指针以指向存储在表中指定列的数据值,然后根据指定的排序次序排列这些指针,数据库使用索引的方式与使用书的目录很相似:通过搜索索引找到特定的值,然后跟随指针到达包含该值得行。
如果作为搜索条件得裂伤已经创建了索引,MySQL无需扫描任何记录即可迅速找到目标记录所在的位置。
例如说有一张学生表,学生表以学号作为主键,表里还有姓名性别年龄列。
通过建立索引文件,产生了学号和记录号两个列。记录号是1234......,索引并不一定是顺序的,但是学号一定是按顺序从小到大的,记录号是学号在学生表中出现的行号。当我们想找到第一万行同学的数据,直接通过查找第一万行就可以了。
索引为什么可以加快查找速度?
索引后,中和镇在索引文件中顺序移动
索引文件中记录是有序的
有序后,可以用各种方法加快查询速度,如折半(二分)查找法,而排序前,只能顺序查找记录(还有B树索引示意图)
索引的分类
普通索引(INDEX)
这是最基本的索引类型,它没有唯一性之类的限制。创建普通索引的关键字是INDEX。
唯一性索引(UNIQUE)
这种索引和前面的普通索引基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须是唯一的。创建唯一索引的关键字是UNIQUE。
主键(PRIMARY KEY)
主键是一种唯一性的索引,它必须指定为“PRIMARY KEY”。主键一般在创建标表的时候指定,也可以通过修改表的方式加入主键。每个表只能有一个主键。
全文索引(FULLTEXT)
MySQL支持全文检索和全文索引。全文索引的索引类型为FULLTEXT。全文索引只能在VARCHAR或TEXT类型的列上创建,且只能在MyISAM表中创建。MyISAM是一个存储引擎,这个我们再往后点会讲,大家先以了解为主哈。
创建索引
使用CREATE INDEX语句
使用CREATE INDEX 语句可以在一个已有表上创建索引,一个表可以创建多个索引。
CREATE 【UNIQUE/FULLTEXT】INDEX 索引名 ON 表名 【列名【长度】】【排序】
说明:
【】中的内容是判断你要创建一个全文索引还是一个唯一性索引,若无即是一个普通索引。
索引名:索引的名称,索引名在一个表中名称必须是唯一的。
列名:表示创建索引的这个列名。
长度:表示使用列的前多少个字符创建索引。使用列的一部分创建索引可以索引文件大大减小,从而节省磁盘空间。
例子1:根据Book表的署名列上的前六个字符创建一个升序索引name_book。
CREATE INDEX name_book ON Book(书名(6) ASC); #ASC是升序的意思
可以在一个索引的定义中包含多个列,中间用逗号隔开,但是它们要属于同一个表,这样的索引叫做符合索引。
例子2:在Sell表的用户号列和图书编号列上建立一个符合索引sfz_bh_sell。
CREATE INDEX sfz_bh_sell ON Sell(用户号,图书编号);
我们学习完创建索引后我们来看一下如何修改这个索引,准确的说是在修改表的时候如何来添加索引。
使用ALTER TABLE语句修改表,其中也包括向表中添加索引。
ALTER TABLE 表名
ADD INDEX 索引名【列名】
例子:在Book表的书名列上创建一个普通索引
ALTER TABLE Book
ADD INDEX sm_book(书名);
例子2:假设Book表中主键未设定,为Book表创建以图书编号为主键的索引,出版社和出版时间为复合索引,以加速表的检索速度。
ALTER TABLE Book
ADD PRIMARY KEY(图书编号),
ADD INDEX mark(出版社,出版时间);
这个例子中既包含PRIMARY KEY,也包含复合索引,说明MySQL可以同时创建多个索引。记住,使用PRIMARY KEY的列,必须是一个具有NOT NULL属性的列。
如果想要查看表中创建的索引的情况,可以使用SHOW INDEX FROM tbl_name语句,例如:SHOW INDEX FROM book;
前面两种情况都是在创建完表后创建的索引,索引也可以与表一同创建,在创建表的CREATE TABLE语句中可以包含索引的定义。
CREATE TABLE 表名【列名,...|[索引项]】
例子:创建sell_copy表的语句如何,sell_copy表带有身份证号和图书编号的联合主键,并在订购册数上创建索引。
CREATE TABLE sell_copy(
身份证号 CHAR(18) NOT NULL,
图书编号 CHAR(20) NOT NULL,
订购册数 INT(5),
订购时间 DATETIME,
PRIMARY KEY(身份证号,图书编号)
INDEX dgcs(订购册数));
#如果你创建的不是联合索引,也就是说只有一个主键,可以直接在你要创建的唯一的主键的NOT NULL 后面直接加PRIMARY KEY,当然你也可以写在下面,但若是多列必须放下面。
删除索引
1. 使用DROP INDEX语句删除索引
DROP INDEX 索引名 ON 表明
例子:DROP INDEX sm_book ON Book;
我们先来区分一下ALTER和UPDATE,ALTER是用来修改表的,UPDATE是用来区分数据的。
DROP 是用来删除数据的,在我们这里也可以删除索引,delete是用来删除表的,但是可以恢复,不可恢复的话还得用truncate。
2. 使用ALTER TABLE语句删除索引 ALTER TABLE 表名
索引对查询的影响
索引在微量数据库的内容的情况下有无是体会不到的,可当一个表里有成千上万行数据的时候,差异就非常明显了。当执行涉及多个表的连接查询时,索引将更有价值。
索引的弊端
索引以文件的形式存储,索引文件要占用磁盘空间,若有大量的索引,索引文件可能比数据文件更快地达到最大的文件尺寸。其次我们在更新表中索引列上的数据时,对索引也需要更新,这可能需要重新组织一个索引,若表中的索引很多,这是很浪费时间的。也就是说,这样就降低了添加、删除、修改和其它写入操作的效率。表中的索引越多,则更新表的事件就越长。但是这样的弊端并不会妨碍索引的应用,因为索引带来的好处完全大于其弊端,利大于弊。在表中有很多行数据的时候,索引通常是不可缺少的。
数据完整性的约束(让数据更合法、更合规)
建表的时候或者说建立表里的一些属性的时候都会有一些约束条件,这些约束条件我们就成为数据完整性约束,数据完整性要与数据正确性相区分,数据正确性的意思是例如我们要输入张三而你输入了王五这就是错误的,而数据完整性是区别于数据正确性的约束。
实体完整性(Entity Integrity):针对于行来说的,行对行的约束成为实体完整性
例如说一张表由学号、姓名、地址组成,此时你插入了一个学生的信息结果该插入的学生的学号在表里已经存在了,那你就无法插入到该表当中。
约束方法:唯一约束与主键约束 约束类型:Primary Key或Unique
域完整性(Domain Integrity):列与列之间的约束是域完整性
假如说有一个学生信息表里的学生id规定是七位数,而此时你要插入一个十位数的学号你将无法插入到其中。
约束方法:限制数据类型(int或varchar......)、检查约束、外键约束、默认值、非空值
约束类型:Default或Check
参照完整性(Referential Integrity):表与表之间的关系称之为参照完整性
之前所降到的域完整性或者是实体完整性都是针对于单表而言的,而参照完整性是以表与表之间进行约束,例如说有一个表1(学号,姓名,地址)和表2(科目,学号,分数),表2的学号是参照表1,而此时你要在表2里插入一个数据(数学,001200,98),若该学号在表2里没有出现那么按理来说是可以插入的,但是此时表2的学号是与表1的学号进行了一个约束,如果表1里没有该值那么将无法插入。 约束方法:外键约束 约束类型:Foreign Key
用户定义的完整性(User-defined Integrity)
针对不同的环境或项目有一些特殊的要求,满足该特殊要求即是用户自定义的完整性
例如说有一张学生表,我们想建立一张所有学生大于成绩大于70的表,那么那些考七十分以下的学生都不会出现在该表当中
主键约束
主键就是表中的一列或多个列的一组,其值能唯一地标志表中的每一行。通过定义PRIMARY KEY约束来创建主键,而且PRIMARY KEY约束中的列不能取空值。由于PRIMARY KEY约束能够确保数据的唯一,所以经常用来定义标志列。当为表定义PRIMARY KEY约束时,MySQL为主键列所创建唯一性索引,实现数据的唯一性,在查询中使用主键时,该索引可用来对数据进行快速访问。我们还可以选取两列数据设置为主键,我们在定义主键的时候有两种方式,一种是作为列的完整性约束,另一种是作为表的完整性约束。列的完整性约束就是说在创建表的时候我们设置列名和约束(int...),我们可以直接在后面加上PRIMARY KEY这个就是列级完整性约束条件,而如果说你想创建两个列作为主键,你会发现无法在创建的列的后面加上PRIMARY KEY,你必须创建完表后再下面进行设置才可以设置多列的主键,使用方法就是在设置完列后单起一行(PRIMARY KEY(主键1,主键2...),表级完整性无法放在列的后面,只能单起一行,这个就是表级的完整性约束条件。
主键约束原则:原则上,任何列或者列的组合都可以充当一个主键。但是主键列必须遵守一些规则,这些规则源自于关系模型理论和MySQL所制定的规则。
ALTER TABLE语句添加约束举例
加上Book表中主键未设定,为Book表建立以图书编号为主键的约束,以书名唯一性约束。
ALTER TABLE Book ADD PRIMARY KEY(图书编号) ADD UNIQUE u_idx(书名);
这个例子中既包括主键约束,也包括唯一性约束,说明MySQL可以同时创建多个约束。记住你在设置唯一约束的时候这个列必须是NOT NULL非空的。(删除约束用DROP)
如果你想要查看表中创阿金的额约束的情况,可以使用SHOW INDEX FROM tbl_name语句。例如:SHOW INDEX FROM book;
替代键和主键的区别
一个表只能创建一个主键,但是一个表可以有若干个UNIQUE键,并且他们可以重合,例如说在C1和C2列上定义一个替代键,并且在C2和C3上定义了另一个替代键,这两个替代键在C2列上重合了,而MySQL允许这样。
主键的字段的值不允许为NULL,而UNIQUE字段的值可以取NULL,但是必须使用NULL或NOT NULL声明。
一般创建PRIMARY KEY约束时,系统会自动产生PRIMARY KEY索引。
参照完整性约束举例
创建表的同时创建外键:CREATE TABLE 表名 | [外键定义]
对已有表创建外键:ALTER TABLE 表名 [外键定义]
外键定义语法格式:FOREIGN KEY(列名)
REFERENCES 表名 [列名【长度】]
[ON DELETE] {RESTICT|CASCADE|SET NULL| NO ACTION}
[ON UPDATE] {RESTICT|CASCADE|SET NULL| NO ACTION}
参照完整性约束说明
RESTRICT:当要删除或更新附表中被参照列上在外键中出现的值时,拒绝对父表的删除或更新操作。
CASCADE:从父表删除或更新行时自动删除或更新字表中匹配的行。
SET NULL:当从父表删除或更新时,设置字表中与之对应的外键列为NULL。(当从xs表删除081103行时,设置cj表中081103项为NULL)外键在子表里的时候是可以被定义为NULL的呦!
NO ACTIONS:意味着不采取行动,就是说如果一个相关的外键值在被参考的表里,删除或更新中主要键值得企图不被允许,和RESTRICT一样
SET DEFAULT:它和SET NULL差不多,只不过从父表删除或更新的时候子表不会变成NULL,而是变成一个你定义的值
例子:创建book_ref表,所有的book_ref表中的图书编号都必须出现在Book表中,假设已经使用图书编号列作为Book表主键。
CREATE TABLE book_ref
(图书编号 varchar(20) NULL,
书名 varchar(20) NOT NULL,
出版日期 date NULL,
PRIMARY KEY(书名),
FOREIGN KEY(图书编号),
REFERENCES Book(图书编号)
ON DELETE RESTRICT
ON UPDATE RESTRICT)
ENGINE=INNODB;
CHECK约束
主键、替代键、外键都是常见的完整性约束的例子。但是,每个数据库都还有一些专用的完整性约束。例如说KC表中星期数要子啊1~7之间,XS表中的出生日期必须大于1986-1-1。这样的规则可以使用CHECK完整性约束来指定。
CHECK完整性约束在创建表的时候定义。可以定位为列完整性约束,也可以定义为表完整性约束。 语法格式:CHECK(约束)
例子:创建表student,只考虑学号和性别两列,性别只能包含男或女。
CREATE TABLE student
( 学号 char(6) NOT NULL,
性别 char(2) NOT NULL CHECK(性别 IN('男','女')));
讲了这么多,我们再来回顾一下如何画E-R图

我们先看第一题哈!
第一问就是设计教学管理的E-R模型
学校有若干个系,那么学校可以算作是一个实体集,系也是实体集,学校和系之间是学校拥有系的关系。系有三个属性:系号,系名和系主任。每个系里有教师和学生,教师和学生也算作实体集,系和学生之间是拥有的关系,系和教师的关系是管理的关系。教师可以讲授课程,课程同时也算作是一个实体集,教师可以参加科研项目,科研项目同时也算是一个实体集,项目的属性有:项目号,名称,负责人。学生作为一个实体集,拥有的属性有:学号,姓名,年龄和性别。
每一个实体集就是属性,而在E-R图中用斜杠来代表属性,所以我们要画斜杠的有系号,教师号,学生号,项目号,课程号。
之后我们再来看一下之间的关系是一对一还是一对多还是多对多。学校只有一个,但是一个学校有很多系,所以学校与系的关系是一对多。一个系对应多个学生,但是多个学生也只能对应一个系,所以也是一对多。一个课程可以被多个学生鞋选,一个学生也可以选择多门课,所以学生和课程之间是多对多,同理教师与课程之间的关系也是多对多。一个系有多个教师,一个教师只属于一个系,所以教师与系之间是一对多,而教师与科研项目之间是多对多,因为一个教师可以选择多门项目,而一个项目也可以被多个教师所选。注意问题中有一句话叫做“一个项目有多人合作,且责任轻重有排名”,所以在教师与项目的参与的关系山还叫加一个排名。还有一句话是“学生选修课程后有考试成绩”,所以在学生与课程的多对多的关系下还要加上一个成绩。
之后第二问我们要把E-R图转换成关系模式。(主键我们用下划线标识,由于该文章不支持下划线输入,所以就用删除符来代表下划线啦!)
学校后面没有属性我们就不写了,联系的关系模型就举个例子应该就够了。最后有标答哦0.0

系 (系号,系名,系主任)
教师 (教师号,教师名,职称,系号)
学生(学号,姓名,年龄,性别,系号)
项目(项目号,名称,负责人)
课程(课号,课程名,学分,教师号)
选修(课号,学号,分数)
负责(教师号,项目号,排名)
注意:实体集与属性之间的名字是必须按照题目要求填写,而实体与属性之间的联系可以按照自己的意志去写。
第二问设计员工公司管理系统数据库设计
通过问题可以很简单地得知实体集有员工、部门,员工薪水。
员工领取薪水,多对一。员工属于部门,一对多。
员工和员工薪水的主码设为员工编号即可,部门的主码社会部门编号。
员工(员工编号,姓名,学历,出生日期,性别,工作年限,电话)
部门(部门编号,名称,备注)
员工薪水(员工编号,收入,支出)
之后我们把所有的联系单列出来建立成一个关系模型:例如SY(员工编号,部门编号)......
下面我们再来做二十四道小练习:
实体联系图(E-R图)是(A)
A.现实世界到信息世界的抽象
B.描述信息世界的数据模型
C.对现实世界的描述
D.描述机器世界的数据模型
E-R图不是数据模型,我们的数据库才是数据模型
以下关于索引的正确叙述的是(B)
A.使用索引可以提高数据查询速度和数据更新速度
B.使用索引可以提高数据查询速度,但会降低数据更新数据
C.使用索引可以提高数据查询速度,对数据更新速度没有影响
D.使用索引数据查询速度和数据更新速度均没有影响
我们在更新表中索引列上的数据时,对索引也需要更新,这可能需要重新组织一个索引,若表中的索引很多,将很浪费时间。即索引将降低添加、删除、修改和其他写入操作的效率。表中的索引越多,则更新表的时间就越长。
设属性A是关系R的主属性,则属性A不能取空值,这是(A)
A.实体完整性规则
B.参照完整性规则
C.用户自定义完整性规则
D.域完整性规则
实体完整性是针对行来说的,行必须是唯一的不能有空值的。参照完整性主要说的就是外码,说的是两个表之间的关系,那么A表的主码可能就是B表的外码。而用户自定义的完整性规则,好比说我们在搞工程的时候仅查看男生,我们一般都会用CHECK语句去执行。域完整性是对于列来说的,例如说我们想要插入一个学生的学号,这个学校的学号都是数字,突然你插入了一个英文字符,那么就会出现插不进去的情况。
关系R和S进行自然连接时,要求R和S含有一个或多个公共(D)
A.元组 B.行 C.记录 D.属性
自然连接与等值连接时一样的,属性说的就是我们的列,记录和与元组是行。
SQL的视图是从(C)中导出的
A.基本表 B.视图 C.基本表或视图 D.数据库
在SQL中,建立视图用的命令是(C)
A.CREATE SCHEMA
B.CREATE TABLE
C.CREATE VIEW
D.CREATE INDEX
A我们用的不多,它是建立数据库的意思,有的在不同版本里面SCHEMA就是建立数据库的意思,也是建立模式的意思。TABLE顾名思义就是建立表的意思。CREATE是建立索引的意思,CREATE VIEW是建立视图。
在SQL语言中,删除一个视图的命令是()
A.DELETE
B.DROP
C.CLEAR
D.REMOVE
A是删除数据,而B是删除视图或数据库,D是抹除。
以下关于外键和相应的主键之间的关系,正确的是(A)
A.外键并不一定要参与相应的主键同名
B.外键一定要与相应的主键同名
C.外键一定要与相应的主键同名且唯一
D.外键一定要与相应的主键同名,但并不一定唯一
例如说两个表AB,B中的一个列不是B的主键而是A中的主键,则这个列在B中叫外键。外键首先作为A的主键一定要与B的外键自身同名,但是外键并不是唯一的。D相比于B而言更加的完整。
在视图上不能完成的操作是(C)
A.更新视图数据
B.查询
C.在视图上定义新的基本表
D.在视图上定义新视图
(√)练习两个表的关键字成为外键
(×)使用命令DROP INDEX能删除所有的索引
(√)在默认RESTRICT情况下,如果要删除表T1是其他表T2的参照表,应先删除T2中表,在删除T1表
(√)在每次访问视图时,视图都是从数据表中提取所包含的行和列
(×)修改引用标的数据时,一定能从视图中反映出来
例如说我们的引用表里有学号这一列,而视图当中没有选用引用表中的学号这一列,所以当对学号进行修改的时候视图中是反应不出来的
(×)子查询内不可以嵌套子查询
(×)索引既可以提高检索数据的速度,也可以提高修改数据的速度。
【我们选择题里有一道这样的题:索引将降低添加、删除、修改和其他写入操作的效率。表中的索引越多,则更新表的时间就越长】
ORDER BY字句实现的是(排序)
在每次访问视图时,视图都是从(基本表)中提取所包含的行和列【因为这题后面限定了所包含的行和列,所以只能是基本表或者数据表】
表的外键约束是数据的(参照)完整性【两个表相互进行参照】
要进行模糊匹配查询,需要使用(LIKE)关键字来设置查询条件
在进行多表查询时必须设置(连接)条件【用where连接起来】
完整性约束包括(实体完整性)、(域完整性)、(参照完整性)和(用户自定义完整性)
用于将事务处理写到数据库的命令是(C)
A.insert
B.rollback
C.commit
D.savepoint
UNIQUE唯一索引的作用是(A)
A.保证各行在该索引上的值都不得重复
B.保证各行在该索引上的值不得为NULL
C.保证参加唯一索引的各列,不得再参加其他的索引
D.保证唯一索引不能被删除
查找表结构用以下哪一项(D)
A.FIND B.SELETE C.ALTER D.DESC
以下聚合函数求数据总和的是(B)
A.MAX B.SUM C.COUNT D.AVG