数据(data):是数据库中存储的基本对象,是用来描述事物的符号记录。
.eg.
数字、文字、图形、图像、音频、视频、学生信息记录、订单信息记录等。
数据的含义:又称为数据的语义,数据与其语义不可分割。在不同环境中,同一个数据会有不同的语义。
数据库(DataBase,简称DB):是长期存储在计算机内,有组织、可共享的大量数据的集合。
数据库管理系统(Database Management System,简称DBMS):是为了科学地组织和存储数据、高效地获取和维护数据而开发的专门软件,是一种位于用户应用与操作系统之间的大型而复杂的软件系统。
数据库系统层次示意图:
数据库管理系统:
数据库管理系统的主要功能:
数据库系统(DataBase System,简称DBS):是指在计算机系统中引入数据库后的系统构成。里面包括:数据库(DB)、数据库管理系统(DBMS)、及其应用开发工具和应用程序(APP)、数据库管理员(DBA)。
show datebases; :显示本MySQL服务器上所以数据库名称
数据世界:现实世界的信息在机器世界中以数据形式存储在数据库中,被我们称作数据世界。
现实世界:是指存在于人民头脑之外的客观世界,也称为现实世界。
主键约束(PRIMARY KEY):具有包含唯一标识数据表中每一行的值所在的一列或一组列成为表的主键(PK),用于强制表的实体完整性。在数据库表中往往将编号、学号、序号等列设为主键。
起到了强制表的实体完整性作用,也就是用来区别表中每一行数据记录。如果对多列组合定义了主键约束,则该多列组合中的一列中的值可能会重复,但来自主键约束定义中所有列的值的任意组合必须唯一。
注意事项:
外键约束(FOREIGN KEY):用来在两个表的数据之间建立关联,它可以是一列或者多列,一个表可以有一个或者多个外键。
外键强制的是参照完整性,及一个表的外键可以是空值,如果不是空值,则每一个外键的值必须等于另一个表中的主键的某一个值,所以外键往往是建立在有关系的两个表之间的。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表。
外表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的表就是外表。
定义一个外键时,需要遵守下列规则:
非空约束(NOT NULL):强制字段的值不能为空。
唯一约束(Unique Key):强制某列中的值具有唯一性,允许为空,但只能出现一个空值。唯一约束可以看作是主键约束的有效补充,一个表可以定义多个唯一约束。
默认约束(DEFAULT):用来指定数据表中某列的默认值如果向数据表插入一条新的记录时没有为该字段赋值,那么系统会自动为这个字段赋默认值。
默认约束常常用在某列中数据存储大量重复的情况,比如性别、国籍、民族等。
SQL语言:是结构化查询语言(Student Query Language)的简称,SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL语言集数据定义DDL、数据操纵语言DML和数据控制语言DCL于一体,可以完成数据库中的全部工作。
数据定义DDL:数据库、数据表等数据对象的创建、修改或删除等数据对象的创建、修改或删除等操作命令。
数据控制DCL:数据库、数据表等数据对象的访问允许、禁止等安全控制操作命令。
数据操纵DML:数据表中数据的增、删、改、查操作命令。
数据定义DDL:
数据操纵DML:
数据控制DCL:
查询语句的结构最简单,单表查询仅由两个子句构成,所谓单表是指仅向数据库内一个表进行查询。一个数据库往往是由若干个数据表组成,在实际的应用环境中甚至多达上百个数据表,而单表查询则仅从某一个数据表中来查找用户所需的数据。
语法结果如下:
Select 字段列表 [字段别名] /*
From 数据源;
[]:这里的内容可以有,也可以省略,即为可选项
/:二者选其一
Select语句是查询语句的命令动词,表示在这里进行的是查询操作,SQL语句所有的关键词都不区分大小写。From用来指定查询的数据所来自的数据源,也就是数据库中的数据表或者视图。
.eg.查询所有学生的信息:
select * from stuinfo;
select stname,sex from stuinfo;(假设stuinfo中只有stname和sex两列)
Select和from与其他标识符之间至少需间隔一个空格。
*表示按照create table 创建表顺序排列的所有列。
在实践应用中,不建议使用Select * ,因为这会降低数据查询效率。
在任何计算机语言的语法中,标点符号都必须是英文符号。
语法说明:
最基本的select语句语法:
Select [All / Distinct] 需要查询的表列/计算列
From 表/视图
mysql作为DBMS存储和管理着大量数据,其中数值数据不可或缺。
数值类型:
主要用来存储数字,包括整数、实数等。
MySQL数值类型常用的主要分为:整数类型、实数类型(定点数类型、浮点数类型)。
(1)整数类型:计算机中存储任何数据都是有限的存储空间。为了能存储较大范围的整数,同时提高存储空间利用率,每一种程序设计语言,都会设计多种整数类型。
注意:
(2)定点数类型:用于保存必须为确切精度的数值,主要有DECIMAL和NUMERIC类型。
DECIMAL(M,D):
M表示十进制数字总的个数,默认取值为10,取值范围为1~65,取值0时会被设为默认值,超出范围会报错。
D表示小数点后面数字的位数,默认取值为0,取值范围为0~30,而且必须<=M,超出范围会报错。
如DECIMAL(5,2):取值范围为-999.99~999.99
注意:
(3)浮点数类型:
常见类型:
FLOAT单精度浮点数和DOUBLE双精度浮点数。
定义方式:
FLOAT(M,D),DOUBLE(M,D),M和D的含义与定点数一样为0,这里的M和D与定点数一样,默认值均为0。
长度一定下:
表示数据范围大的特点,也存在误差问题。
内存中:
FLOAT占4-byte,DOUBLE占8-byte。
注意:
(1)format(n,d):数值格式化函数
功能:将数值n,保留d位小数,并且整数部分用逗号分隔千分位,小数部分进行四舍五入。
注意:数据经过千分位隔离后,会变成字符串,能够给阅读提供比较好的体验,但在计算上却会造成很大的困扰。所以如果只是保留小数,不建议使用这个函数。
(2)round(n,d):四舍五入函数
功能:返回n的四舍五入值,保留d位小数(d的默认值为0),函数不会将数值n变成字符串类型。
(3)ceil(n)进一取整函数,floor(n)舍一取值函数
功能:对数值n进行统一进一及统一舍一的取证操作
(4)truncate(n,d)数值截取函数
功能:不进行四舍五入,直接保留数字n的d位小数。
(5)rand(n)随机数函数
功能:返回范围0到1.0内的随机浮点值(可以使用数字a作为初始值)
(6)sign(n)符号函数
功能:返回参数符号(为-1代表负数,0或1代表正数)
(7)mod(n,m)取模函数
功能:取模函数,返回n被m除的余数(同%操作符)
(8)least(x,y,…):最小值函数
功能:返回参数列表中的最小值,计算规则如下:
(9)greatest(x,y,…)最大值函数
功能:返回参数列表中的最大值,计算规则同least(x,y,…)
(10)pi():圆周率函数
功能:返回圆周率
应用提醒:
调用无参函数的时候不需要提供参数,函数名pi后面是一对空的括号,不像前面的函数,在调用时括号里都提供了一个参数,MySQL还有很多这样的无参函数,调用时必须注意,空括号必须保留,不能去掉,否则报错。
(11)degrees(n)/radians:角度弧度转换函数
功能:把n从弧度变换为角度/把n从角度变换为弧度。
(12)三角函数:
(13)其他常用的数学计算函数:
abs(n):返回n的绝对值
exp(n):返回值e的n次方
log(n):返回n的自然对数
log10(n):返回n以10为底的对数
pow(x,y):返回值x的y次幂
sqrt(n):返回非负数n的平方根
应用提醒:
数学函数都是MySQL自带的内置函数,只要正确调用就可以,所有函数的名称不区分大小写,参数的个数和类型必须符合系统要求,否则报错。
SELECT 字段列表[字段别名]/*
FROM 数据源
WHERE 条件
(1)条件查询语法
应用提醒:
查询语句的WHERE子句,筛选条件很丰富。
在SQL语句中,所有字符常量必须用单引号引起来,否则,条件对比出错。
MySQL支持模糊查找。
常用通配符:
%:用来表示任意多个字符,包含0-N个字符
_:用来表示任意单个字符,如’李_'就代表‘李’姓且单名
escape:用来表示转义特定字符,比如要查找的字符串中包含%或自身
.eg.:
SELECT stuname,sex,class
FROM stuinfo
WHERE BirthPlace='西藏' AND BirthPlace='新疆'
关系比较:
=、<=>、<>、{!=}、<、<=、>、>=,其中=、<=>几乎相同
模糊匹配(模糊查找):
like、not like以及三个常用的适配符%、_、escape
确定集合:
in、not in
空值判断:
is null、is not null,NULL不区分大小写,也不需要单引号、括号等定界符
逻辑运算符:
NOT或者!,AND或者&&,OR或者||,XOR(异或)
确定范围:
between、and、not between and,用于进行数值闭区间判断。
MySQL中最常用的字符类型:
char、varchar、text
(1)char类型:
char(n)用于存储长度为n的定长字符串,n的取值范围为0~255之间。
应用提醒:
(2)varchar类型
varchar(n)用于存储最大长度为n的可变长字符串。varchar的长度类型支持65535。
应用提醒:
(3)text类型:
text类型是非二进制类型字符串,只能存储纯文本,其值是大小写不敏感的
应用提醒:
统计查询
SELECT 字段列表[字段别名]/*
FROM 数据源
[WHERE 行筛选条件]
[GROUP BY 分组依据] //用来控制对数据的分组
[HVAING 过滤条件]
[ORDER BY 排序条件]
聚合统计函数,也叫里函数,常用的有:
(1)Count([distinct]col):参数col代表列名,默认是distinct缺省,重复值复计数;如果用distinct限定,则重复值只计一次数。
(2)Max([distinct]col):返回指定列的最大值,distinct的作用还是去重复。
(3)Min([distinct]col):返回指定列的最小值。
(4)Sum([distinct]col):返回指3定列的所有值之和,当然重复值是否重复计算取决于distinct,显然指定列只有数值类型才有意义。
(5)Avg([distinct]col):返回指定列的所有值之平均值,同sum一样指定列应该是数值类型。
应用提醒:
应用提醒:
应用提醒:
GROUP BY TitleLevel,teadept中多级分组字段的顺序是有关的,这类似于EXCEL中的多级分类汇总
where和having子句有各自的应用场景,且where子句优先于having子句,也就是说,如果WHERE子句能控制的行筛选,就不要用HAVING子句
(1)日期时间类型
MySQL中表示日期时间值的类型分为:DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个日期时间类型都固定的存储字节数、有效值范围和一个“零”值。
year占1个字节,范围为1901~ 2155,time占3个字节,范围为-838:59:59 ~838:59:59
相同点:两者都可用来表示YYYY-MM-DD HH:MM:SS 类型的日期。
不同点:他们的的存储方式,大小(字节),表示的范围不同。
在建表时,TIMESTAMP可以为日期设置一个默认值,而DATATIME不行。在更新表时,TIMESTAMP可以设置为自动更新时间为当前时间,而TIMESTAMP它把客户端插入的时间从当前时区转化为UTC,也就是世界标准时间进行存储,查询时将其又转化为客户端当前时区进行返回。而DATETIME不做任何改变,也就是原样输入和输出。
应用提醒:
TIMESTAMP和DATETIME都可用来表示YYYY-MM-DD HH:MM:SS类型的日期, 除了存储方式和存储范围以及大小不一样,没有太大区别。如果记录的日期需要让不同时区的人使用,最好使用TIMESTAMP。
(2)日期时间函数
数据库中会存放大量的日期时间数据,而日期时间的计算不同于普通数值运算,DBMS(数据库管理系统)会提供大量的函数,MySQL也一样。
应用提醒:
应用提醒:
MONTH(),MONTHNAME()对日期类型进行处理,MONTH()返回数值,,MONTHNAME()返回字符串。
应用提醒:
应用提醒:
计算机程序设计语言:分四代
(1)第1代机器语言:由二进制0和1代码指令构成,不同的CPU 具有不同的指令系统。机器语言程序具有难编写、难修改、难维护的特点,需要用户直接对存储空间进行分配,编程效率极低。
(2)第2代汇编语言:是机器指令的符号化,与机器指令存在着直接的对应关系,所以汇编语言同样存在着难学难用、容易出错、维护困难等缺点。但是汇编语言也有自己的优点:可以直接访问系统接口,汇编程序翻译成的机器语言程序的效率高。主要用于嵌入式系统。
(3)第3代高级语言:面向用户的、基本上独立于计算机种类和结构的语言。最大的优点是:形式上接近于算术语言和自然语言,概念上接近于人们通常使用的概念,相比于前两代语言,高级语言易学易用,通用性强,应用广泛。
(4)第4代非过程化语言:编码时只需说明”做什么”,就可以直接给计算机下达命令,不需描述算法细节。
从应用角度来看,高级语言可以分为基础语言、结构化语言和专用语言。从描述客观系统来看,程序设计语言可以分为面向过程语言和面向对象语言。
SQL语句执行过程:
(1)客户端发送一条查询给服务器。
(2)服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。
(3)服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。
(4)MySQL根据优化器生成的执行计划,再调用存储引擎的API来执行查询。
(5)将结果返回给客户端。
连接查询也叫联接查询,是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等,通过连接可以实现多表查询。无论什么数据库,都要基本遵循SQL ANSI/ISO标准,常用的有SQL86,SQL92。
内连接是一种最常用的连接类型,内连接查询实际上是一种任意条件的查询,使用内连接时,如果两个表的相关字段,满足连接条件,就从这两个表中提取数据,并组合成新的记录。也就是在内连接查询中,只有满足条件的元组,才能出现在结果关系中,不匹配的行不显示。
表分为主表和外键表,主表为提供数据的表,外键表为调用数据的表,通过建立外键约束,也就是在外键表中,插入主表的主键作为外键,建立了表与表之间的关联。
内连接的语法形式SQL86:
Select 字段列表
From 表1,表2…… Where 连接条件 [and 筛选条件] ……
语法说明:
内连接的语法形式SQL92:
Select 字段列表
From 表1 [别名] [inner] join 表2 [别名]
ON 连接条件
内连接的语法形式SQL92
[Where筛选条件] ……
语法说明:
应用提醒:
TeaNo
=t2.TeaNo
就是teacher表和class表连接的条件应用提醒:
应用提醒:
多表成功连接后,可以当作一个新的单表,在这个表上进行分组统计,就像单表统计查询一样。
TeaNo
=t2.TeaNo
是自连接的条件连接查询是任何数据库实现多表查询的重要方法。连接查询对多个表进行JSON运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”,在主表结果集上,而这个选择放手的不同就形成了。
(1)IF(expr1,expr2,expr3)函数
功能:如果expr1是 TRUE (也就是expr1值非0且非空NULL) ,则 IF ( ) 函数的返回值为expr2;否则返回值则为expr3。
IF()函数的返回值为数字值或字符串值,具体情况视其所在的语境而定,IF()函数与其他计算机程序设计中的IF语句功能相似。
应用提醒:
(2)IFNULL(expr1,expr2)函数
功能:假如expr1不为 NULL,则 IFNULL( )的返回值为expr1;否则其返回值为expr2。IFNULL( )的返回值是数字或是字符串,具体情况取决于其所使用的语境。
应用提醒:
IFNULL(score,‘无成绩’)这个函数是专门用来对NULL值进行判断的,函数的返回值要么是第1个参数,要么是第2个参数。在这个案例中,非空时返回分数的原始值,为空时返回字符串’无成绩’
(3)NULLIF(expr1,expr2)函数
功能:用于检验提供的2个参数是否相等,如果相等,则返回NULL,如果不相等就返回第一个参数。
(1)外连接语法
外连接分为三种:
左外连接 LEFT [OUTER] JOIN
右外连接 RIGHT [OUTER] JOIN
全外连接 FULL [OUTER] JOIN
MySQL无全外连接,但可通过其他方式,达到全外连接的效果。内连接的连接关键词是JOIN,作为连接的一种,外连接的连接词,也少不了JOIN,为了和内连接进行区分,外连接加上了左、右和全对应的英文单词,组成了外连接的关键词,也就是LEFT、RIGHT和FULL。
整体语法说明(语法与内连接接近):
Select 字段列表
From 表1 [别名] left/right [outer] join 表2 [别名]
ON 连接条件
[Where筛选条件]
应用提醒:
应用提醒:
TeaNo
IS NOT NULL,这个条件代表右表(class表)中存在满足条件可连接的记录WHERE t2.TeaNo
IS NULL,代表右表(class表)中无法满足条件连接的记录ClassName
),是应用IFNULL()函数对查询结果集的NULL值进行处理应用提醒:
(2)交叉连接:
交叉连接是没有任何限制条件的连接,产生的结果集与线性代数的笛卡尔积一样,没有实际应用价值。
交叉连接的实现:
从第一张表依次取出每一条记录,与另一张表的全部记录逐个,无条件地匹配连接。交叉连接后,结果集的记录数、行数和字段数、列数如下:
记录数(行数) = 第一张表记录数 * 第二张表记录数
字段数(列数) = 第一张表字段数 + 第二张表字段数
SELECT 字段列表
FROM 表1 [别名] CROSS JOIN 表2 [别名]
(后面没有ON子句,不设连接条件)
(1)VERSION()
功能:获取MySQL版本号
(2)CONNECTION_ID()
功能:获取服务器的连接数
(3)DATABASE()和SCHEMA()
功能 :获取当前数据库名
(4)USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()和CURRENT_USER
功能 :均为获取当前用户的名称
(5)FOUND_ROWS()
功能:获取前面查询语句返回结果集的总行数
COUT(*)用来统计查询语句返回的结果集行数,与FOUND_ROWS()在很多情况下结果是一样。在实际应用场景中,应该灵活应用。
(6)ROW_COUNT()
功能:返回被前面SQL语句更新的、插入的或删除的数据记录行数。对比FOUND_ROWS()函数和ROW_COUNT()函数,前者是获取查询语句影响的行数,而后者是获取更新语句影响的行数。
(7)CHARSET(str)
功能:返回字符串str的字符集,一般情况这个字符集就是系统默认的字符集。
(8)COLLATION(str)
功能:返回字符串str的字符排序方式
(9)LAST_INSERT_ID()
功能:获取最后生成的AUTO_INCREMENT值
(10)PASSWORD(str)
功能:用于对字符串str进行加密。一般情况下,PASSWORD(str)函数主要是用来给用户的密码加密的
(11)ENCODE(str,pswd_str)
功能:加密函数,使用字符串pswd_str来加密字符串str。加密的结果是一个二进制数,必须使用BLOB类型的字段来保存它。
在score数据表中,stuno学号列不是BLOB类型的字段,所以被ENCODE加密函数处理后,显示的全是乱码。
(12)DECODE(crypt_str,pswd_str)
功能 :解密函数,使用字符串pswd_str来为crypt_str解密。crypt_str是通过ENCODE函数加密后的二进制数据,字符串pswd_str应该与加密时的字符串pswd_str是相同的
在此用DECODE(crypt_str,pswd_str)为ENCODE(str,pswd_str)加密的数据进行了解密,所以您看到的依然是正常的学号。
执行顺序:
FROM>JOIN>ON>WHERE>GROUP BY>AVG/SUM/MAX等聚合函数>HAVING>SELECT>DISTINCT>ORDER BY
表连接的效率直接影响着多表查询语句的执行效率。
表连接的执行顺序及需要注意的问题:
(1)选择一个驱动表
驱动表是指多表关联查询时,第一个被处理的表,使用此表的记录去关联其他表。驱动表的确定很关键,他会直接影响多表连接的关联顺序,也决定了后续关联时的查询性能。
(2)驱动表的选择原则
①在对最终结果集没影响的前提下,优先选择结果集最小的表作为驱动表。
②MySQL在选择前会根据where里的每个表的筛选条件,相应的对每个可作为驱动表的表做结果记录预估,预估出每个表的返回记录行数,再根据select里查询的字段的字节大小总和进行乘积,即每行查询字节数 * 预估行数 = 预估结果。结果集是作为选择驱动表的一个主要因素,但不是唯一因素。
系统预估结果行的规则:
通过WHERE来预估结果行数,如果WHERE里没有相应表的筛选条件,无论ON里是否有相关条件,默认为全表。如果WHERE里有筛选条件,但是不能使用索引来筛选,那么默认为全表。如果WHERE里有筛选条件,而且可以使用索引,那么会根据索引来预估返回的记录行数。
Extra参数的描述和说明:
应用提醒:
FROM score t2 JOIN course t3 ON t3.couno=t2.couno JOIN stuinfo t1 ON t1.stuno=t2.stuno这个部分表的顺序变化,并不会影响查询语句的执行顺序和策略
表与表之间的关联:
MySQL表与表之间的关联查询使用Nested-Loop join算法,顾名思义就是嵌套循环连接,但是根据场景不同可能有不同的变种:比如Index Nested-Loop join,Simple Nested- Loop join,Block Nested-Loop join,Betched Key Access join等。
使用索引关联:
Index Nested-Loop join
Batched Key Access join
未使用索引关联:
Simple Nested-Loop join
Block Nested-Loop join
连接查询是解决多表查询的重要方法,不同的select语句在执行效率上会有差异,特别是对于海量数据的多表查询,通过EXPLAIN语句可以深入了解在系统内部对查询的执行分析,以帮助DBA和程序员来优化自己的查询操作。
(1)嵌套查询
嵌套查询是通过子查询实现的,这样的子查询最常见的嵌入位置是在外层SELECT查询的WHERE子句。
根据子查询结果集的规模,可将子查询分为:标量子查询、列子查询、行子查询、表子查询。
应用提醒:
应用提醒:
应用提醒:
应用提醒:
小结:
(1)根据子查询结果集的规模:标量子查询、列子查询、行子查询、表子查询
(2)根据子查询是否依赖外部查询,将子查询分为:非相关子查询、相关子查询
(3)子查询的主要嵌入位置:外部Select语句的 Select、From、Where或 Having等子句内
(4)从优化查询的角度应尽量使用连接(JOIN)来代替子查询
根据子查询是否具有独立执行能力,分为非相关子查询和相关子查询。从执行顺序来说,这两种子查询也不一样。
非相关子查询独立于外部的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。
相关子查询执行顺序:
针对上面查询案例,用相关子查询实现,并分析在系统内部的执行过程。
查询语句执行顺序分析如下:
①分析器先找到teacher表并装入内存, 一个指针(如p1)先指向teacher表中的第一条记录,然后进入WHERE进而再分析内层的select语句
②内层的select语句后,再把class表装入内存, 另一个指针(如p2)指向class表中的第一条记录,分析内层WHERE后面的条件表达式,指针p2在class表中自上而下依次进行条件判断,最后基于内层查询分析出一个虚表VT2, 也就变成SELECT……FROM……WHERE EXISTS VT2
③如果虚表VT2为空,EXISTS 虚表VT2也就为false,不返回到外层SELECT,而p1指向下一条记录。如果虚表VT2非空,也就是有记录,那么EXISTS 虚表VT2为true,则返回到外层SELECT,并把p1指向的那条记录添加进外层select语句的虚表VT1当中
④ 这里嵌套的子查询语句执行完成,但外层主查询语句只执行了一次,也就是说p1仅指向了teacher的第一条记录,p1还要指向teacher表的下一条记录并分析,这样又进入了嵌套中的子查询语句,继续执行第②、③步
⑤当p1也指到了teacher表的结尾,整个查询语句结束,返回虚表VT1,并通过外层主查询select子句取出指定的各列
(1)视图为何物
视图:是一种基本的数据库对象,是将定义好的查询作为视图对象存储在数据库中。视图创建好之后,可以和表一样进行查询或更新操作,因此,视图也常称为虚表,几乎数据表可以执行的操作都可以在视图上进行。
(2)创建视图的命令:
Create or Replace view 视图名[别名1,别名2……]
As 查询语句
别名:可以给视图中的数据列取合适的别名。
应用提醒:
定义视图时,可以在视图名后面为视图中的各列指定名称,之后也通过指定的名称进行引用
步骤:
1 首先查询出score表中成绩为59的情况
2 查询view_stuscore视图中成绩为59的情况
3 通过view_stuscore视图来修改分数59为60
4 检查view_stuscore视图中以上五位同学的成绩情况
5 检查score表中以上五位同学的成绩情况
UPDATE view_stuscore SET score=60 WHERE score=59
应用提醒:
通过视图来插入、更新、删除数据时,都需要溯源到原表也就是基表来进行操作。我们说视图是虚表,基于视图可以做更新操作,但不是所有视图都能实现数据更新。视图有利于简化查询,但没有使用价值的视图应该及时删除。
小结:
视图是一种基本的数据库对象,是基于数据表或其它视图动态查询而产生的,因此,视图也常常被称为**“虚表”**。几乎数据表可以执行的操作都可以针对视图进行,但对视图进行的所有操作,归根到底都需要溯源到生成视图的基表。
视图的优势:
每次使用视图时都必须处理查询执行时所需的任一个检查,如果用多个连接和过滤创建了复杂的视图,或者是嵌套了视图,可能会发现性能下降厉害,在部署使用了大量视图的应用前,应该进行性能测试。
视图的规则和限制:
INSERT [INTO] <表名>[(列名1,列名2......)]
VALUES (列值1,列值2......)
INSERT [INTO]代表的是将VALUES关键词后面的一串值插入到指定的数据表中去。
也可以用下面这种形式:
INSERT [INTO] <表名>
SET 列名1=表达式1,列名2=表达式2......
这里用SET语句来指定各列对应的插入值
INSERT [INTO] <表名>[(列名1,列名2......)]
SELECT 子句
在插入语句中嵌入子查询,可以成批的插入数据,在这个插入语句中,用select语句代替了values的部分,而select子句如果返回的是多记录的结果集,就是向数据表中插入了多条记录。
插入作为一种SQL的操作,除了需要正确的语法外,还要求插入的数据必须与数据表中的约束不冲突,否则正确的语法也无法实现正常的插入操作。
应用提醒:
应用提醒:
应用提醒:
应用提醒:
小结:
INSERT插入作为一种SQL操作,除了需要正确的命令语法外,还要求插入的数据必须与数据表上的约束不冲突,否则正确的语法也无法实现正常的插入操作。
INSERT命令有以下几种语法形式:
在 MySQL中,可以使用DELETE语句来删除表的一行或者多行数据甚至所有的数据。并非数据表中的一个单独数据,而是一条完整的数据。
语法:
DELECT FROM <表名>
WHERE [筛选条件]
[ORDER BY 子句]
[LIMIT 子句]
语法说明:
如果要限制需要删除的行数,则配合ORDER BY使用LIMIT子句。
DELETE语句删除的是数据表中的数据行,可能是1行、多行甚至所有行,这与where条件限制有关
应用提醒:
如何在未设置级联更新的情况下达到一改全改的高效:
UPDATE 表1[INNER JOIN | LEFT/RIGHT JOIN]
表2 ON 连接条件
SET 列名1=表达式1,列名2=表达式2,......
WHERE 筛选条件
这里只能使用表名,不能使用别名
本讲小结:
UPDATE <表名>
SET 列名1=表达式1,列名2=表达式2,......
[WHERE 筛选条件]
语法说明:
应用提醒:
UPDATE数据修改命令语法简单,与delete操作是一样,都可能因为约束条件冲突导致操作失败。进行数据更新操作前,要充分的清楚数据库内数据的关系。
一改全改:就是指从COURSE课程表,这个主表,修改大学英语的课程代码,则与之关联的SCORE成绩表,这个子表中的相关的成绩记录,会自动的修改其课程代码。一改全改的效果和已删全删的效果一样明显,但也同样隐藏着较大的数据风险。
UPDATE JOIN语法:
UPDATE 表1 [INNER JOIN | LEFT/RIGHT
JOIN] 表2 ON 连接条件
SET 列名1=表达式1,列名2=表达式2,…… WHERE 筛选条件
应用提醒:
不同用户对不同数据拥有不同的操作权限,每种数据库都有很完善的安全管理体系。
权限管理:
MySQL数据库实际上是通过将用户写入mysql库中对应的权限表来控制访问权限的。权限表分别为:user,db,table_priv,columns_priv。
(1)user:记录允许连接到服务器的用户的信息,里面的权限是全局性的
(2)db:记录每个用户对各个数据库级别的操作权限
(3)table_priv:记录每个用户对数据表级别的操作权限
(4)columns_priv:记录每个用户对数据列级别的操作权限
mysql通过赋予或撤销某个用户对某个数据库的或者某个数据表的某项权力,比如:读、写、更改、删除等等来保证数据安全。
CRANT ALL PRIVILEGES ON *.*
TO 'USERNAME'@'LOCALHOST'
IDEHTIFIED BY 'PASSWORD'
CRANT命令用来给用户授权,ALL PRIVILEGES代表所有权限,ON *.*表示所有数据库。用户授予的权限是针对“school”数据库所有表的,不涉及其他数据库。
应用提醒:
应用提醒:
(1)存储过程:
存储过程是数据库的一个重要功能,是一组为了完成特定功能的SQL语句集合。使用存储过程的目的,是将常用或复杂的过程预先用SQL语句写好,并用一个指定的名称存储起来,这个过程经过编译和优化后,就在数据库中存储着,因此称为存储过程。当以后需要数据库提供与已定义好的存储过程相同功能的服务时,只需要用CALL命令来调用相应的存储过程即可。
存储过程的优点:
过程控制语句:
① DECLARE语句:局部变量声明,可一次声明多个同类型局部变量
DECLARE是命令动词,说明在此进行的是变量声明,这里说明此处可以声明多个变量,当然变量名必须符合mysql标识符命名规则。数据类型名用来说明变量的数据类型,比如常用的INT整型、CHAR字符型等等。默认值是用来为各变量设置同一个默认值,这是一个可选项。
例子中N=1
② SET语句:赋值语句,可一次为多个变量赋值
SET与增删改查等SQL命令一样,命令动词,标识符等不区分大小写。后面的部分就是给变量赋值,也可以给多个变量赋值,各赋值表达式之间需要用逗号隔开。
③ SELECT … INTO语句:把查询选定的数据表列值存储到局部变量
只有查询结果为单一行时可执行此功能,与一般的select查询语句是一样的,但与之不同的是,这里的查询结果不是通过结果集反馈,而是通过INTO子句,把结果存到指定变量中去了。
分支结构控制语句:
情况分支:
过程控制语句:
无限循环在程序中称为死循环。条件藏在语句群中了。
BEGIN END复合语句,封装之后,这个语句群内所有的语句,要么都执行,要么都不执行。
存储过程的三种模式:IN默认的模式、OUT输出模式、INOUT输入输出模式。
存储过程的三种模式:IN默认的模式、OUT输出模式、INOUT输入输出模式。
应用提醒:
应用提醒:
应用提醒:
应用提醒:
应用提醒:
一个数据库往往有很多个相互关联的数据表构成。
触发器(trigger):是用于监视某种情况,并触发某种操作的特殊的存储过程。是提供给程序员和DBA一种保证数据完整性的方法。更广泛的应用于加强数据的完整性约束和业务规则。它是一种与数据表事件相关的特殊的存储过程,触发器不是由程序调用,也不是手工启动,是由事件来触发。例如当对一个表进行增、删、改等更新操作时就会激活触发器。
触发器语法:
Create Trigger:创建触发器的命令事件
After/Before:触发时机
Insert/Update/Delete:触发事件/监视事件
On 表名:监视地点(某个数据表)
For Each Row:在创建触发器的语法中是固定的
sql语句:触发后的执行程序
应用提醒:
应用提醒:
网站:
网站不只是用户见到的前端,更重要的是“幕后英雄”——数据库
PHP:
MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了查询速度并提高了灵活性。
常用组合:
Windows:IIS+.net+SQL
Linux: Apache+PHP+MySQL
常用快速面板工具:
apache是一个服务器,构建了PHP与数据库之间可以沟通的环境。apache相当于同声翻译员。
程序中PHP和MySQL的链接:
PHP 提供了 mysql_connect() 函数来连接数据库。该函数一共有5个参数,一般我们只用前面3个。
后台数据库如何沟通:
不过mysql_close是不会关闭的,因为MySQL_PCONNECT建立了持久连接,下面是写法:
header("content-type:text/html;charset=utf-8");
$servername =
"127.0.0.1";//服务器主机地址
$username =
"root";// 访问数据库的用户名
$password =
"root";//访问数据库的密码 //phpstudy的mysql有一个默认用户
名(root)和密码(root)
// 创建连接
$conn = mysql_connect($servername, $username,$password); // 检测连接
if (!$conn) {
die("Connection failed: "
. mysql_connect_error());//die()输出一条消息,然后断开 连接。
}
echo "连接成功";
mysql_close($conn);//关闭连接。
?>
如何通过语句使用PHP操作数据库:
(1)插入数据:
$sql="INSERT INTO admin(username,password,email)VALUES('admin','123456','[email protected]')";
mysqli_query($conn,$sql);
(2)删除数据
$sql="DELETE FROM admin WHERE username='admin'";
mysqli_query($conn,$sql);
(3)更新数据
$sql="UPDATE admin SET email='[email protected]'";
mysqli_query($conn,$sql);
(4)读取数据
$sql ="SELECT id, username, email FROM admin";
mysqli_query($conn,$sql);
—— THE END