MySQL编程语言
SQL语言是我们学习数据库最重要的部分,文章比较长。有错误还望大佬指出哦。
top:SQL命令结果太长显示不了时,可加 \G 换行。
页面内可以使用~~(CTRL+F)~~ 快捷查询。
一、SQL介绍
结构化查询语言(Structured Query Language,SQL) 是一种专门用来与数据库通信的语言,SQL由很少的词构成,这些词被称为关键字,每个SQL语句都是一个或多个关键字构成的。
SQL的优点:
- 所有关系数据库都支持SQL。
- 简单易学,语句均由强描述性的英语单词组成,且单词数目不多。
- 可进行复杂和高级的数据库操作。
SQL的组成:
- 数据定义语言(DDL)
主要用于对数据库及数据库中的各种对象进行创建、删除、修改等操作。其中数据库对象主要有表、默认约束、规则、视图、触发器、存储过程等。DDL包括的主要SQL语句有:CREATE、ALTER、DROP。 - 数据操作语言(DML)
主要用于操纵数据库中各种对象特别是检索和修改数据。DML包括的主要SQL语句有:SECLECT、INSERT、UODATE、DELETE。 - 数据控制语言(DCL)
主要用于安全管理。DCL包括的主要SQL语句有:GRANT、REVOKE。 - MySQL扩展增加的语言要素
非标准SQL所包含的内容,为了方便用户编程而增加,主要包括常量、变量、运算符、表达式、函数、流程控制语句和注解等。
二、MySQL常用函数
1、数学函数
- ABC()–求表中某个字段的绝对值。
- FLOOR(x)–返回小于或等于参数X的最大整数,即向下取整。
- RAND()–取0-1之间的随机数。
- TRUNCATE(x,y)–返回x保留小数点后y位的值。
- SQRT(x)–求x的平方根。
2、字符串函数
- UPPER(s)–将字符串s中的所有字母变成大写。
- UCASE(s)–将字符串s中的所有字母变成大写。
- LOWRE(s)–将字符串s中的所有字母变成小写。
- LEFT(s,n)–返回字符串s的前n个字符。
- SUBSTRING(s,n,len)–从字符串s的第n个位置开始获取长度为len的字符串。
3、日期、时间函数
- CURDATE()–获取当前日期。
- CURRENT_DATE()–获取当前日期。
- CURTIME()–获取当前时间。
- CURRENT_TIME()–获取当前时间。
- NOW()–获取当前日期+时间。
4、聚合函数
- COUNT()–对于除" * “以外的任何参数,返回所选择集合中非NULL值得行的数目;对于参数” * ",则返回所选择集合中所有行的数目,包含NULL值的行。
- SUM()–求出某个字段取值的总和。
- AVG()–求出表中某个字段取值的平均值。
- MAX()–求出表中某个字段取值的最大值。
- MIN()–求出表中某个字段取值的最小值。
5、逻辑函数
- IF(expr,v1,v2)–若表达式expr成立,则执行v1,否则执行v2。
- IFNULL(v1,v2)–若表达式v1非空,则显示v1的值,否则显示v2的值。
6、其他函数
- VERSION()–返回当前数据库的版本号。
三、数据定义
1、定义数据库
1.1 创建数据库
使用CREATE语句创建数据库。
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[ [DEFAULT] CHARACTER SET [=] charset_name ]
[[DEFAULT] COLLATE [=] collation_name];
上述,“[ ]”内为可选项;“ | ”分隔可选项;
“[IF NOT EXISTS”创建前判断所要创建的数据库是否已经存在,只有当不存在时才能正常创建;
“CHARACTER SET”指定数据库字符集(简体中文为gb2312);
“COLLATE”指定字符集的校对规则(简体中文字符集的校对规则为gb2312_chinese_ci)。
1.2 查看数据库
使用SHOW语句查看数据库。使用USE语言可以选择需要使用的数据库。
SHOW { DATABASES | SCHEMAS}; //查看当前可用的所有数据库以列表形式展现
USE db_name; //选择数据库
附默认库的作用(以5.7mysql为例):
数据库名称 | 数据库作用 |
---|---|
mysql | 描述用户访问权限 |
information_schema | 保存关于MySQL服务器所维护的所有其他数据库信息 |
performance_schema | 主要用于收据数据库服务器性能参数 |
sys | 简单版的performance_schema |
1.3 修改数据库
使用ALTER语句修改数据库的定义。
ALTER { DATABASE | SCHEMA } [db_name]
[DEFAULT] CHARACTER [=] charset_name
[DEFAULT] COLLATE [=] collation_name;
1.4 删除数据库
使用DROP语句删除所创建的数据库,DROP语句会删除所选数据库及其存储的所有数据,但数据库的用户权限需手动删除。
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;
2、定义表
2.1 创建表
使用CREATE语句创建表。
CREATE TABLE tb_name
(
字段名1 数据类型 [列级完整性约束] [默认值]
[,字段名2 数据类型 [列级完整性约束] [默认值] ]
[ , ... ...]
[ ,表级完整性约束条件]
) [ ENGINE = 引擎类型 ];
注:
AUTO_INCREMENT:将字段设置为自增属性。当一个列被指定为AUTO_INCREMENT后,使用INSERT语句为该列指定一个值时,若该值未被使用,那这个值将被用来代替系统自动生成的值,并且后续的增量将基于该手工插入的值。
存储引擎类型:存储引擎指如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据中数据是以表的形式存储的,所以存储引擎简而言之就是指表的类型。使用SHOW ENGINES语句可以查看系统所支持的引擎类型和默认模型。
完整性约束:点击查看
2.2 查看表
使用SHOW语句查看表的名称、结构等。
//查看数据库中所有的表名称。
SHOW TABLE [ {FROM | IN } db_name ];
//查看表的结构,下列两种方式
SHOW COLUMNS { FROM | IN } tb_name [ {FROM | IN } db_name ]; //SHOW COLUMNS语法
{DESCRIBE | DESC } tb_name; //DESCRIBE/DESC语法,MySQL支持DESCRIBE/DESC语法作为上述语法的快捷方式
//查看数据表的详细结构
SHOW CREATE TABLE tb_name;
2.3 修改表
使用ALTER语句修改表的定义。
//添加字段
ALTER TABEL tb_name ADD [ COLUMN ] 新字段名 数据类型 [约束条件] [FIRST | AFTER 已有字段名]
//修改字段,3种子句
ALTER TABLE tb_name CHANGE [COLUMN] 原字段名 新字段名 数据类型 [约束条件]; //可同时修改表中指定列的名称和数据类型;
ALTER TABLE tb_name ALTER [COLUMN] 字段名 {SET| DROP} DEFAULT; //可以修改或删除表中指定列的默认值;
ALTER TABLE tb_name MODIFY [COLUMN] 字段名 数据类型 [约束条件] [FIRST | AFTER 已有字段名]; //只会修改指定列的数据类型,而不会干涉它的列名;
//删除字段
ALTER TABLE tb_name DROP [ COLUMN] 字段名;
//重命名表
ALTER TABLE 原表名 RENAME [TO] 新表名; //为表重新赋予一个表名
RENAME TABLE 原表名1 TO 新表名1 [,原表名2 TO 新表名2]......; //修改表名
2.4 删除表
使用DROP语句删除所创建的表,DROP语句会删除表的定义和表中的数据,但用户权限不会删除。
DROP TABLE [IF EXISTS] 表1 [,表2]......;
四、数据操纵
1、数据查询
1.1 基础语法
使用SELECT语句查询数据。
SEKECT [ALL | DISTINCT | DISTINCTROW ] <目标列表表达式1>[,<目标表达式2>]...
FROM <表名1或视图名1>[,<表名2或视图名2>]...
[WHERE <条件表达式>]
[GROUP BY <l列名1> [HAVING<条件表达式>] ]
[ORDER BY <列名2> [ASC | DESC]]
[LOMIT [m,]n];
注:
1、ALL | DISTINCT | DISTINCTROW为可选项,指定是否返回结果集中的重复行。若没有指定,默认为ALL,若指定DISTINCT或DISTINCTROW,则会消除结果集中的重复行。
2、SELECT子句:用于指定要显示的字段或表达式。FROM子句用于指定数据来源于那些表或视图;WHERE子句为可选项,用于指定对记录的过滤条件;GROUP BY子句为可选项,用于将查询激活集按指定的字段值分组;HAVING子句为可选项,用于指定分组结果集的过滤条件;ORDER BY子句为可选项,用于将查询结果集按指定字段值得升序(ASC)或降序(DESC)排列,null值被作为最小值处理;LIMIT子句为可选项,用于指定查询结果集包含的记录数。
1.2 辅助查询
定义字段的别名:
字段名 [AS] 字段别名;
注:在系统输出查询结构集中某些列或所有列的名称时,若希望这些列的名称显示为自定义的列名,可使用AS子句,AS可省略。注意当定义的别名中含有空格时,必须使用单引号将别名括起来,且字段的别名不能出现在WHERE子句中。
WHERE子句常用条件:
//BETWEEN..AND关键字的范围查询
WHERE expression [NOT] BETWEEN expression1 AND expression2;
//LIKE模糊查询
WHER [ NOT] LIKE '<匹配串>' [ESCAPE '<换码字符>'];
//使用正则表达式
[NOT] [REGEXP | RLIKE] <正则表达式>
//带IS NULL关键字的空值查询
WHERE 字段名 IS NULL;
注:
LIKE中:常用通配符有" % “和” _ “,前者代表任意长度的字符串,后者代表任意单个字符;若要匹配的字符串本身就含有通配符” % “或” _ “,则使用ESCAPE’<换码字符>'短语对通配符进行转义
正则表达式中:使用正则表达式可以匹配任意一个字符或在指定集合范围内查找某个匹配的字符;可以使用”|"分隔每个供选择匹配的字符串;可以使用定位符匹配处于特定位置的文本。在正则表达式中可以对要匹配的字符或字符串的数目进行控制。
常用字符匹配表如下:
选项 | 说明 |
---|---|
<字符串> | 匹配包含指定字符串的文本 |
[ ] | 匹配[ ]中的任何一个字符 |
[^] | 匹配不在[ ]中的任何一个字符 |
^ | 匹配文本的开始字符 |
$ | 匹配文本的结尾字符 |
. | 匹配任意单个字符 |
* | 匹配0个或多个*前面指定的字符 |
+ | 匹配+前面的字符1次或多次 |
{n} | 匹配前面的字符至少n次 |
空值查询: IS NULL不可被“=NULL”替代;同样,“IS NOT NULL”亦不可被“!=NULL”替代。
带AND或OR时:AND优先级高于OR,因此根据需要添加括号。
LIMIT子句:
LIMIT 行数 OFFSET 位置偏移量;
或
LIMIT [位置偏移量, ]行数;
注:“行数”指定需要返回的记录数;“位置偏移量”指从哪一行开始,第一条偏移量为0,若不指定,默认从第一行开始;
分组聚合查询:
通过把聚合函数添加到一个带有GROUP BY分组子句的SELECT语句中实现。注意聚合函数可能会忽略null值。
[GROUP BY 字段列表] [HAVING <条件表达式>]
注:GROUP BY对查询结果按字段列表进行分组,字段值相等的记录分为一组;指定用于分组的字段列表可以是一列,也可以是多列,使用逗号分隔;HAVING短语对分组的结果进行过滤,仅输出满足条件的组。
1.3连接查询
如果一个查询同时涉及两个或多个表时,则称为连接查询。查询方式包括交叉连接、内连接和外连接。
交叉连接
交叉连接(CROSS JOIN)又称笛卡尔积,即把一张表(m行)的每一行与另一张(n行)表的每一行进行连接,返回(m*n行)两张表的每一行连接后所有可能的搭配结果。
SELECT *FROM tb_1 CROSS JOIN tb_2;
或
SELECT *FROM tb_1,tb_2;
内连接
内连接(INNER JOIN)通过在查询中设置连接条件来连接查询结果集中某些数据行,即返回查询结果中符合过滤条件和连接条件的行。
SELECT 目标表达式1,目标表达式2,...,目标表达式n
FROM tb_name1 [INNER] JOIN tb_name2
ON 连接条件
[WHERE 过滤条件]
或
SELECT 目标表达式1,目标表达式2,...,目标表达式n
FROM tb_name1,tb_name2
WHERE 连接条件 [AND 过滤条件]
外连接
外连接将连接两张表的内容并返回结果,将两张表分为基表和参考表,以基表为依据返回满足和不满足连接条件的记录。外连接分为左(左外)连接和右(右外)连接。
左连接(LEFT OUTER JOIN 或 LEFT JOIN),返回关键字左边表(基表)的所有记录,用这些记录与该关键字右边表(参考表)中的记录进行匹配,若左表的某些记录在右表中没有匹配的记录,则返回的结果中右表对应的字段值均为null值。
SELECT 目标表达式1,目标表达式2,...,目标表达式n
FROM tb_name1 LEFT JOIN tb_name2
ON 连接条件
[WHERE 过滤条件]
右连接(RIGHT OUTER JOIN 或 RIGHT JOIN),返回关键字右边表(基表)的所有记录,用这些记录与改关键字左边表(参考表)中的记录进行匹配,若右表的某些记录在左表没有匹配的记录,则返回的结果中左表对应的字段值均为null值。
SELECT 目标表达式1,目标表达式2,...,目标表达式n
FROM tb_name1 RIGHT JOIN tb_name2
ON 连接条件
[WHERE 过滤条件]
1.4 嵌套查询
嵌套查询,又称子查询。即在查询语句中嵌套一层或多层查询。最外层的查询称为外层查询或父查询,内部查询称为内层查询或子查询。
IN关键字:带IN关键字的子查询,用于判定一个给定值是否存在于子查询的结果集中。
EXISTS关键字:带EXISTS关键字的子查询,系统对子查询进行运算以判断它是否返回结果集。如果子查询的结果集不为空,则EXISTS返回的结果为TRUE,此时外层查询语句将进行查询;如果子查询的结果集为空,则EXISTS返回的结果为FALSE,此时外层查询语句将不进行查询。
1.5 联合查询
联合查询,返回多个查询语句结果并将其组合到一个结果集中。使用关键字为UNION。
SELECT -FROM-WHERE
UNION [ALL]
SELECT -FROM-WHERE
[...UNION [ALL]
SELECT -FROM-WHERE]
注:
1、UNION语句必须由2条及2条以上的SELECT语句组成,且彼此间使用关键字UNION分隔。
2、UNION语句中的每个SELECT子句必须包含相同的列、表达式或聚合函数。
3、每个SELECT子句中对应的目标列的数据类型必须兼容。目标列的数据类型不必完全相同,但必须是MySQL可以隐含转换的类型。
4、第一个SELECT子句中的目标列名称会被作为UNION语句结果集的列名称。
5、联合查询中只能使用一条ORDER BY子句或LIMIT子句,且它们必须置于最后一条SELECT语句之中。
2、数据更新
2.1 插入数据
使用INSERT语句向数据库中的表插入数据。
插入一条或多条数据
INSERT INTO tb_name(column_list)
VALUES (value_list1),
[(value_list2),]
...;
插入查询结果
INSERT INTO tb_name1(column_list1)
SELECT column_list2 FROM tb_name2 WHERE (condition);
当一个待插入的表中存在PRIMARY KEY或UNIQUE约束,而待插入的数据行中包含有与待插入表的已有数据行中相同的PRIMARY KEY或UNIQUE列值,则不可使用INSERT语句,而使用REPLACE语句。若插入的列为另一张表的外键,则REPLACE语句也不可使用。
REPLACE INTO tb_name (column_list)
VALUES(value_list);
2.2 修改数据
使用UPDATE语句修改一张或多张表中的数据。
UPDATE tb_name
SET column 1=value 1[, column 2=value 2,... column n=value n]
[WHERE <conditions>];
2.3 删除数据
使用DELETE语句可以删除表中的一行或多行数据。
DELETE FROM tb_name
[WHERE <conditions>];
若删除表中的所有记录,也可使用TRUNCATE语句,TRUNCATE语句会直接删除原表并重新创建一个表。使用后,表中的AUTO_INCREMENT计数器将被重新设置为该列的初始值。
TRUNCATE [TABLE] tb_name;
五、数据控制-访问控制
1、创建用户账户
CREATE USER user_specification
[,user_specification ]...
//user_specification语法如下
user
[
IDENTIFIED BY[PASSWORD] 'password'
| IDENTIFIED WITH auth_plugin[AS 'auth_string']
]
注:
user:指定创建的用户账号,其格式为’uesr_name’@‘host_name’。
IDENTFIED BY子句:用于指定用户账号对应的口令,若无口令,可省略。
PASSWORD:可选项,用于指定散列口令,即若使用明文设置口令是,则忽略。
IDENTIFIED WITH子句:用于指定验证用户账号的认证插件。
2、删除用户
DROP USER user[,user]... //删除用户并取消其权限
3、修改用户账号
RENAME USER old_user TO new_user [,old_user TO new_user]...
4、修改用户口令
SET PASSWORD [FOR user] =
{
PASSWORD('new_password') |'encrypted password'
}
注:
encrypted password:表示已被函数PASSWORD()加密过的口令值。
5、账户权限赋予
GRANT
priv_type [(column_list)][,priv_type [(column_list)]]...
ON [object_type] priv_level
TO user_specification[,user_specification]...
[REQUIRE {NONE | ssl_option [ [AND ] ssl_option] ...}]
[WITH with_option...]
//odject_type的格式
TABLE | FUNCTION | PROCEDURE
//priv_level的格式为
* | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.roution_name
//user_specifiation的格式为
user
{
IDENTIFIED BY [PASSWORD] 'password'
|IDENTIFIED WITH auth_plugin[AS'auth_string']
}
//with_option的格式
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATE_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
注:
priv_type:用于指定权限的名称。
column_list:可选项,用于指定权限要授予表中那些具体的列。
ON 子句:用于指定权限授予的对象和级别。
object_type:可选项,用于指定权限授予的对象类型。
priv_level:用于指定权限的级别。
6、撤销权限
REVOKE priv_type [ (column_list)][priv_type [ (column_list)]]...
ON [object_type] priv_level
FROM user[,user]...
REVOK ALL PRIVILEGES,GRANT OPTION
FROM user[,user]...
六、索引
1、 基础概念
对数据库中数据表进行查询操作时,系统对表中的数据搜索方式共有两种:全表扫描和索引访问。全表扫描即从头到尾逐行读取表中数据并与查询条件进行比较。索引访问是通过搜索索引值,根据索引值与记录的关系直接访问数据表中的记录行。
根据用途将MySQL的索引主要分为普通索引、唯一性索引、主键索引、聚簇索引、全文索引等。
普通索引(INDEX):最基本的索引类型,其索引列值可以去空值或重复值。
唯一性索引(UNIQUE):与普通索引基本相同,但其索引列值不能重复,可为空值。
主键索引(PRIMARY KEY):一种唯一性索引。其索引列值不能重复,不可为空值。在建立主键时,系统自动创建主键索引。一般在创建表的时候指定主键,也可以通过修改表的方式添加主键。
聚簇索引:其索引顺序是数据存储的物理顺序,保证了索引值相近的元祖所存储的物理位置也相近。一张表只能有一个聚簇索引,且目前只有solidDB和InnoDB存储引擎的表支持。
全文索引(FULLTEXT):只能创建在数据类型为VARCHAR或TEXT的列上。建立全文索引后,能够在建立了全文索引的列上进行全文查找。全文索引只能在MyISAM存储引擎的表中建立。
注:实际使用时,索引可以建立在单列上,也可以建立在多个列上。
2、 创建索引
创建索引的方法共三种,一种是创建表的同时创建索引,另外两种分别是在已经存在的表上使用CREATE INDEX语句创建索引,或使用ALTER TABLE 语句添加索引。
//使用CREATE TABLE语句在创建表的同时创建索引
CREATE TABLE tb_name[col_name data_type]
[CONSTRAINT index_name] [UNIQUE] [INDEX | KEY]
[index_name] (index_col_name[length]) [ASC | DESC]
注:
1、index_name:索引名,一个表上可以建立多个索引,但每个索引名必须是唯一的。
2、UNIQUE:可选项,指定创建的索引类型为唯一性索引。
3、index_col_name:要创建索引的列名。
4、length:可选项,指定使用列的前length个字符创建索引。使用列值的一部分创建索引有利于减小索引文件的大小,节省磁盘空间。
5、ASC | DESC:指定索引的排序方式。
//使用CREATE INDEX语句在一个已经存在的表上创建索引
CREATE [UNIQUE] INDEX index_name
ON tb_name (col_name [(length)] [ASC | DESC],...)
//使用ALTER TABLE语句在一个已经存在的表上创建索引
ALTER TABLE tb_name ADD
[UNIQUE | FULLTEXT] [INDEX | KEY] [index_name] (cpl_name[length] [ASC | DESC],...)
3、 删除索引
使用DROP INDEX语句或ALTER TABLE语句可以删除不需要的索引。
//DROP INDEX语句
DROP INDEX index_name ON tb_name;
//AKTER TABLE语句
ALTER TABLE tb_name DROP INDEX index_name;
注:
1、若删除表的某一列,而该列是索引列,则该列也会从索引中被删除。
2、如果组成索引的所有列都被删除,则整个索引也会被删除。
4、 查看索引
使用SHOW INDEX语句可以查看数据表中是否建立了索引及所建立的索引详细信息。
SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tb_name [{FROM | IN | db_name}];
七、视图
1、 基础概念
视图是从一个或多个表(视图)中导出的表。
视图与数据库中的表的区别:
- 视图不是数据库中真实的表,而是一张虚拟的表,它的结构和数据是建立在对数据库中真实表的查询基础上的。
- 视图的内容是由存储在数据库中进行查询操作的SQL语句来定义的,它的列数据与行数据均来自于定义视图的查询所引用的真实表(也称基础表、基表或源表)或者是基于真实表的计算值,并且这些数据是在引用视图时动态生成的。
- 视图不是以数据集的形式存储在数据库中,它所对应的数据实际上是存储在视图所引用的真实表(基础表)中。
- 视图是用来查看存储在别处的数据的一种设施,其自身并不存储数据。
视图具有以下优点:集中分散数据、简化查询语句、重用SQL语句、保护数据安全、共享所需数据、更改数据格式。
2、 创建视图
使用CREATE VIEW语句创建视图。
CREATE [OR REPLACE]
VIEW view_name [(column_list)]
AS SELECT_statement
[WITH [CASCADED | LOCAL ] CHECK OPTION]
注:
1、OR REPLEACE:可选项,用于替换数据库中已有的同名视图,但需要在该视图上具有DROP权限。
2、column_list:可选项,为视图中的每个列指定明确的名称。
3、SELECT_statement:指定创建视图的SELECT语句。语句中需要注意,①定义视图的用户除了要求被授予CREATE VIEW的权限外,还必须被授予可以操作视图所涉及的基础表或其他视图的相关权限。②不能包含FROM子句中的子查询。③不能引用系统变量或用户变量。④不能引用预处理语句参数。⑤在SELECT语句中引用的表或视图必须存在。但是,创建完视图后,可以删除视图定义中所引用的基础表或源视图。若想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。⑥若SELECT语句中所引用的不是当前数据库的基础表或源视图时,需要在该表或视图前加上数据库的名称作为限定前缀。⑦在由SELECT语句构造的视图定义中,允许使用ORDER BY子句。但是,如果从特定视图进行了选择,而该视图使用了自己的ORDER BY子句将被忽略。⑧对于SELECT语句中的其他选项或子句,若所创建的视图中也包含了这些选项,则语句执行效果未定义。
4、WITH CHECK OPTION:可选项,用于指定在可更新视图上所进行的修改都需要符合select_statement中所指定的限制条件,这样可以确保数据修改后仍能通过视图看到修改后的数据。当视图是根据另一个视图定义时,WITH CHECK OPTION给出两个参数,即CASCADED 和LOCAL,它们决定检查测试的范围。其中前者为选项默认值,会对所有视图进行检查,而关键字LOCAL则是CHECK OPTION只对定义的视图进行检查。
3、删除视图
使用DROP VIEW语句可删除一个或多个视图,删除需在每个要删除的视图上拥有DROP权限。
DROP VIEW [IF EXISTS] view_name [,view_name1]....
4、修改视图
使用ALTER VIEW语句修改视图的定义。
ALTER VIEW view_name [(column_list)]
AS SELECT_statement
[WITH [CASCADED | LOCAL ] CHECK OPTION]
5、查看视图
使用SHOW CREATE VIEW语句查看视图的定义。
SHOW CREATE VIEW view_name
6、更新视图
更新视图实质上是更新视图所引用的基础表的数据。视图的更新操作是受限的,只有满足可更新条件的视图才能进行更新。对于可更新的视图,需要该视图中的行和基础表中的行之间具有一对一的关系。
若视图中包含下列SQL语句,则该视图不可更新:
1、聚合函数。
2、DISTINCT关键字。
3、GROUP BY子句。
4、ORDER BY子句。
5、HAVING子句。
6、UNION运算符。
7、位于选择列表中的子查询。
8、FROM子句中包含多个表。
9、SELECT语句中引用了不可更新视图。
10、WHERE子句中的子查询,引用FROM子句中的表。
八、触发器
1、基础概念
触发器是一个被指定关联到一个表的数据库对象,当对一个表特定事件出现是,它将被激活。
触发器的作用:
1、可在写入数据表前,强制检验或转换数据。
2、触发器发生错误时,异动的结果会被撤销。
3、部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
4、可依照特定的情况,替换异动的指令 (INSTEAD OF)。
2、创建触发器
CREATE
TRIGGER trigger_name trigger_time trigger_event
ON tb_name FOR EACH ROW trigger_body
注:
trigger_time:触发器被触发的时间,可选项为“BERORE”和“AFTER”,用于表示触发器是在激活它的语句之前触发或者之后触发。
FOR EACH ROW:声明用来指定对于受触发事件影响的每一行都要激活触发器的动作。
3、删除触发器
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
九、事件
1、开启事件调度器
在使用事件调度器之前,需保证MySQL中EVENT_SCHEDULER已被开启,若未开启,则需开启。
//查看是否开启
SHOW VARIABLES LIKE'EVENT_SCHEDULER';
或
SELECT @@EVENT_SCHEDULER;
//开启方法
SET GLOBAL EVENT_SCHEDULER = [1 | ON | TRUE];
或
在MySQL配置文件my.ini中加上“EVENT_SCHEDULER=1”或“SET GLOBAL EVENT_SCHEDULER=ON”来开启。
2、创建事件
CREATE EVENT [IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ENABLE | DISABLE | DISABLE ON SLAVE]
DO event_body
//上述中schedule的语法
AT timestamp [+ INTERVAL interval ] ...
| EVERY interval
[ STARTS timestamp [ + INTERVAL interval ]...]
[ENDS timestamp [ + INTERVAL interval ]...]
//interval的语法格式
quantity { YEAP | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND
YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE
| HOUR_SECOND | MINUTE_SECOND}
注:
schedule:时间调度,用于指定事件何时发生或者每隔多久发生一次,分别对应下面两个子句:
①AT子句:用于指定事件在某个时刻发生。其中,timestamp表示一个具体的时间点,后面可以加上一个时间间隔,表示在这个时间间隔后事件发生;interval表示这个时间间隔,有一个数值和单位构成;quantity是时间间隔的数值。
②EVERY子句:用于表示事件在指定时间区间内每隔多长时间发生一次。其中,STARTS子句用于指定开始时间,ENDS用于指定结束时间。
ENABLE | DISABLE | DISABLE ON SLAVE:可选项,表示事件的一种属性。关键字ENABLE表示该事件是活动的,即调度器检查时间动作是否必须调用;关键字DISABLE表示该事件是关闭的,即事件的声明存储到目录中,但是调度器不会检查它是否应该调用;关键字DISABLE ON SLAVE 表示事件在从机中是关闭的。若不指定,事件在创建后会变为活动的。
3、修改事件
ALTER EVENT event_name
[ ON SCHEDULE schedule ]
[ RENAME TO new_event_name ]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[DO event_body]
4、删除事件
DROP EVENT [IF EXISTS ] event_name