MySQL:常用语句

来源:互联网 发布:星界边境 传输网络 编辑:程序博客网 时间:2024/06/01 07:54

一、 基础知识

1.1 数据库基础

  1. 数据库(database):保存有组织的数据的容器(通常是一个文件)
    或一组文件。
  2. 表(table):某种特定类型数据的结构化清单。
  3. 模式(schema):关于数据库和表的布局及特性的信息。
  4. 列(column):表中的一个字段。所有表都是由一个或多个列组成的。
  5. 数据类型(datatype):所容许的数据的类型。每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据。
  6. 行(row):表中的一个记录。
  7. 主键(primary key):一列(或一组列),其值能够唯一区分表中每个行。

    • 作为主键的条件
      1. 任意两行都不具有相同的主键值
      2. 每个行都必须具有一个主键值(主键值不允许NULL值)
  8. SQL(Structured Query Language):结构化查询语言,一种专门用来与数据库通信的语言。

  9. 关键字(key word):作为MySQL语言组成部分的一个保留字,决不用关键字命名一个表或列。
  10. 自动增量:某些表列需要唯一值。
  11. 未排序数据:如果没有明确排序查询结果,则返回的数据的顺序没有特殊意义。
  12. 结束SQL语句:多条SQL语句必须以分号(;)分隔。
  13. SQL语句和大小写:SQL语句不区分大小写。代码习惯:对SQL关键字使用大写,对列和表名使用小写。
  14. 使用空格:在处理SQL语句时,其中所有空格都被忽略。
  15. 当心逗号:在选择多个列时,一定要在列名之间加上逗号,但是最后一个列名后不加。如果在最后一个列名后加了逗号,将出现错误。
  16. 使用通配符:除非确实需要表中的每个列,否则最好不使用*通配符。虽然使用通配符可能会省事,不用明确列出所需列,但检索不需要的列通常会降低检索和应用程序性能。
  17. 检索未知列:使用通配符有一个大优点,由于不明确指定列名,所以能检索出名字未知列。
  18. 行0:检索出来的第一行为行0而不是行1
  19. 子句::一个子句通常由一个关键字和所提供的数据组成。
  20. 引号:单引号用来限定字符串。
  21. 操作符:用来联结或改变WHERE子句中的子句的关键字。
  22. 通配符(wildcard):用来匹配值的一部分的特殊字符
  23. 搜索模式(search pattem):由字面值、通配符或两者组合构成搜索条件
  24. 谓词:从技术上讲,LIKE是谓词而不是操作符
  25. 正则表达式的一个子集:MySQL仅支持多数正则表达式实现的一个很小的子集。
  26. 字段(field):基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算机字段的连接上。
  27. 拼接(concatenate):将值联结到一起构成单个值
  28. MySQL拼接不同之处:多数DBMS使用+ 或 || 来实现拼接。MySQL使用Concat()函数来实现。
  29. 聚集函数(arrgregate function):运行在行组上,计算和返回单个值的函数
  30. 查询(query):任何SQL语句都是查询。但次术语一般指SELECT语句
  31. 外键(foreign key):外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
  32. 可伸缩性(scale):能够适应不断增加的工作量而不失败
  33. 笛卡尔积(cartesian product):由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

二、 实际应用

2.1 检索数据

1.检索单个列

SELECT 列名 FROM 表名

2.检索多个列

SELECT 列名,列名,列名 FROM 表名

3.检索所有列

SELECT * FROM 表名

4.检索不同的行

SELECT DISTINCT 列名 FROM 表名

DISTINCT:指示MySQL只返回不同的值
- 不能部分使用DISTINCT:DISTINCT关键字应用于所有列而不仅是前置它的列。如果给出 SELECT DISTINCT 列名1,列名2 ,除非指定的两个列都不同,否则所有的行都将被检索出来。

5.限制结果

SELECT 列名 FROM 表名 LIMIT 5

LIMIT 5 指示MySQL返回不多于5行

SELECT 列名 FROM 表名 LIMIT 5,5

LIMIT 5,5 指示MySQL返回从行5开始的5行。第一个数为开始位置,第二个数为要检索的行数。
- 在行数不够时:LIMIT中指定要检索的行数为检索的最大行数,如果没有足够的行MySQL将只返回它能返回的那么多行。
- MySQL替代语法:LIMIT 4 OFFSET 3 等同于 LIMIT 3,4

6.使用完全限定的表名

SELECT 表名.列名 FROM 表名
SELECT 表名.列名 FROM 数据库名.表名

2.2 排序检索数据

1.排序数据【默认升序】

SELECT 列名 FROM 表名 ORDER BY 列名

2.按多个列排序【默认升序】

SELECT 列名,列名,列名 FROM 表名 ORDER BY 列名,列名

3.指定排序方向【降序】

SELECT 列名,列名,列名 FROM 表名 ORDER BY 列名 DESC
SELECT 列名,列名,列名 FROM 表名 ORDER BY 列名 DESC, 列名

DESC关键字只应用到直接位于其前面的列名。

与DESC相反的关键字ASC(ASCENDING),但默认升序
- 区分大小写和排序顺序,取决于数据库如何设置。在字典排序顺序中,A和a相同,这是MySQL的默认行为。

SELECT 列名 FROM 表名 ORDER BY 列名 DESC LIMIT 1;

使用 ORDER BY 和 LIMIT 组合,能找出一个列中最高或最低的值
- ORDER BY 子句位于 FROM 之后, LIMIT 之前

2.3 过滤数据

1.使用WHERE子句

SELECT 列名,列名 FROM 表名 WHERE 列名 = 值;

WHERE子句的位置,同时使用ORDER BY 和 WHERE,应该让ORDER BY 位于 WHERE 之后

2.WHERE子句操作符

操作符 说明 = 等于 <> 不等于 != 不等于 < 小于 <= 小于等于 > 大于 >= 大于等于 BETWEEN 在指定两个值之间

2.1 范围值检查

SELECT 列名,列名 FROM 表名 WHERE 列名 BETWEEN 5 AND 10;

在使用BETWEEN时需要指定两个值(所需范围的低端值和高端值)

2.2 空值检查

SELECT 列名 FROM 表名 WHERE 列名 IS NULL;

NULL与不匹配:在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL的行。

2.4 数据过滤

1.组合WHERE子句

SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;

AND 用在WHERE 子句中的关键字,用来指示检索满足所有给定条件的行
- 添加多个过滤条件,每添加一条就要使用一个AND

SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id = 1003 OR prod_price <= 10;

OR WHERE 子句中使用的关键字,用来表示检索匹配任一给定条件的行

2.IN操作符

SELECT prod_name,prod_price FROM products WHERE vend_id IN (1002,1003) ORDER BY prod_name;

IN WHERE 子句中用来指定要匹配值的清单的关键字,功能与OR相当

IN操作符用来指定范围条件,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。

  • 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观
  • 在使用IN时,计算次序更容易管理
  • IN操作符一般比OR操作符清单执行更快
  • IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。

3.NOT操作符

SELECT prod_name,prod_price FROM products WHERE vend_id NOT IN (1002,1003) ORDER BY prod_name;

NOT WHERE子句中用来否定后跟条件的关键字
- MySQL支持使用NOT对IN、BETWEEN和EXSIS子句取反

2.5 使用通配符进行过滤

1.LIKE操作符

SELECT prod_id,prod_name FROM products WHERE prod_name LIKE 'jet%'

在执行这条子句时,将检索任意以jet起头的词。%告诉MySQL接受jet之后的任意字符,不管它有多少字符。
- %可以在任意位置
- 注意尾空格:尾空格可能会干扰通配符的匹配
- 注意NULL:%通配符不能匹配值为NULL的行。

SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '_jet'

_下划线通配符只能匹配一个字符

LIKE与REGEXP:

  • LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不会返回(除非使用通配符)
  • REGEXP在列值内进行匹配。如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。
  • REGEXP匹配整个列值,用^和$进行匹配即可。

2.6 用正则表达式进行搜索

1.正则表达式

SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;

.是正则表达式的一个特殊字符,表示匹配任一字符。

匹配不区分大小写

  • MySQL中的正则表达式匹配不区分大小写。为区分大小写,可以使用BINARY关键字。如WHERE prod_name REGEXP BINARY '.000'

|是正则表达式的OR操作符。表示匹配其中之一

[ ]是另一种形式的OR语句

^为否定一个字符集,在集合的开始出防止一个即可。eg:[^123]
- 在集合中,用它来否定集合
- 否则指串的开始处

[1 - 5]定义了一个范围,匹配1到5

为匹配特殊字符,必须使用\\为前导。\\-表示查找-,\\.表示查找.\\\表示查找\

元字符 说明 \\f 换页 \\n 换行 \\r 回车 \\t 制表 \\v 纵向制表 类 说明 [a-zA-Z0-9] 任意字母和数字 [a-zA-Z] 任意字母 [\t] 空格和制表 [0-9] 任意数字 [a-z] 任意小写字符 [A-Z] 任意大写字母 [a-fA-F0-9] 任意十六进制数字

重复元字符

元字符 说明 * 0个或多个匹配 + 1个或多个匹配(等于{1, }) ? 0个或1个匹配(等于{0, 1}) {n} 指定数目的匹配 {n, } 不少于指定数目的匹配 {n, m} 匹配数目的范围(m不超过255)

定位元字符

元字符 说明 ^ 文本的开始 $ 文本的结尾 [[:<:]] 词的开始 [[:>:]] 词的结尾

2.7 拼接字段

SELECT Concat (vend_name, '(', vend_country, ')') FROM vendors ORDER BY vend_name;

Concat()拼接字符串,即把多个串连接起来形成一个较长的串。Concat()需要一个或多个指定的串,各个串之间用逗号分隔。

SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') FROM vendors ORDER BY vend_name;
  • RTrim()函数去掉右边的所有空格
  • LTrim()函数去掉左边的所有空格
  • Trim()函数去掉左右两边的所有空格
SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title FROM vendors ORDER BY vend_name;

AS关键字赋予别名

SELECT prod_id, quantity, item_price, quantity * item_price AS expanded_price FROM vendors WHERE order_name = 20000;

执行算数计算

2.8 使用数据处理函数(函数没有SQL可移植性强)

SELECT vend_name, Upper(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;

Upper()函数 将文本转换为大写

常用的文本处理函数

函数 说明 Left() 返回串左边的字符 Length() 返回串的长度 Locate() 找出串的一个子串 Lower() 将串转换为小写 LTrim() 去掉串左边空格 RTrim() 去掉串右边空格 Right() 返回串右边的字符 Soundex() 返回串的SOUNDEX值 SubString() 返回子串的字符 Upper() 将串转换为大写
SELECT cust_name, cust_contact FROM customers WHERE Soundex(cust_contact) = Soundex('Y Lie');

Soundex()是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。

Soundex()考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较

常用的日期和时间处理函数

函数 说明 AddDate() 增加一个日期(天,周等) AddTime() 增加一个时间(时,分等) CurDate() 返回当前日期 CurTime() 返回当前时间 Date() 返回日期时间的日期部分 DataDiff() 计算两个日期之差 Date_Add() 高度灵活的日期运算函数 Date_Format() 返回一个格式化的日期或时间串 Day() 返回一个日期的天数部分 DayOfWeek() 对于一个日期,返回对应的星期几 Hour() 返回一个时间的小时部分 Minute() 返回一个时间的分钟部分 Month() 返回一个时间的月份部分 Now() 返回当前日期和时间 Second() 返回一个时间的秒部分 Time() 返回一个日期时间的时间部分 Year() 返回一个日期的年份部分

常用的数值处理函数

函数 说明 Abs() 返回一个数的绝对值 Cos() 返回一个角度的余弦 Exp() 返回一个数的指数值 Mod() 返回除操作的余数 Pi() 返回圆周率 Rand() 返回一个随机数 Sin() 返回一个角度的正弦 Sqrt() 返回一个数的平方根 Tan() 返回一个角度的正切

2.9 汇总数据

函数 说明 AVG() 返回某列的平均值 COUNT() 返回某列的行数 MAX() 返回某列的最大值 MIN() 返回某列的最小值 SUM() 返回某列值之和

1.聚集函数

SELECT AVG(prod_price) AS avg_price FROM products

AVG() 通过对表中行数计数并计算特定列值之和,求得该列的平均值。也可以用来确定对特定列或行的平均值。
- 只用于单个列,而且列名必须作为函数参数给出,为获取多个列的平均值,必须使用多个AVG()函数
- AVG()函数忽略列值为NULL的行

SELECT COUNT (*) AS num_cast FROM customersSELECT COUNT (cust_email) AS num_cust FROM customers

COUNT()函数进行计数,可利用COUNT()确定表中行的数目或符合特定条件的行的数目。
- 使用COUNT(*)对表中行的数目进行计数,不管表中包含的是空值(NULL)还是非空值
- 使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值

2.聚集不同值

SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003;

DISTINCT参数,只包含不同的值

3.组合聚集函数

SELECT COUNT(*) AS num_items,        MIN(prod_price) AS price_min,       MAX(prod_price) AS price_max,       AVG(prod_price) AS price_avgFROM products

2.10 分组数据

1.创建分组

SELECT vend_id COUNT(*) AS num_prods FROM products GROUP BY vend_id;
SELECT vend_id COUNT(*) AS num_prods FROM products GROUP BY vend_id WITH ROLLUP;

GROUP BY进行分组

WITH ROLLUP可以得到每个分组以及每个分组汇总级别(针对每个汇总)的值

2.过滤分组

SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;

HAVING子句过滤分组
- WHERE过滤行,HAVING过滤分组

3.分组和排序

ORDER BY GROUP BY 排序产生的输出 分组行,但输出可能不是分组的顺序 任意列都可以使用(甚至非选择的列也可以使用) 只可能使用选择列或表达式列,而且必须使用每个选择列表达式 不一定需要 如果与聚集函数一起使用列(或表达式),则必须使用

4.SELECT子句顺序

子句 说明 是否必须使用 SELECT 要返回的列或表达式 是 FROM 从中检索数据的表 仅在从表选择数据时使用 WHERE 行级过滤 否 GROUP BY 分组说明 仅在按组计算聚集时使用 HAVING 组级过滤 否 ORDER BY 输出排序顺序 否 LIMIT 要检索的行数 否

2.11 使用子查询

1.使用子查询进行过滤

SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num                     FROM orderitems                     WHERE prod_id = 'TNT2');

2.作为计算字段使用子查询

SELECT cust_name,        cust_state,        (SELECT COUNT(*)        FROM orders        WHERE orders.cust_id = customers.cust_id) AS ordersFROM customersORDER BY cust_name;

2.12 联结表

1.创建联结

SELECT vend_name, prod_name, prod_priceFROM vendors, productsWHERE vendors.vend_id = products.vend_idORDER BY vend_name,prod_name

2.内部联结

SELECT vend_name, prod_name, prod_priceFROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;

INNER JOIN 内部联结(该句结果同上面创建联结语句)

3.联结多个表

SELECT vend_name, prod_name, prod_priceFROM vendors, products, orderitemsWHERE vendors.vend_id = products.vend_idAND orderitems.prod_id = products.prod_idAND  order_num = 20000;

性能考虑:联结的表越多,性能下降的越厉害

2.13 创建高级联结

1.使用表别名

SELECT cust_name, cust_contactFROM customers AS c, orders AS o, orderitems AS oiWHERE c.cust_id = o.cust_idAND oi.order_num = o.order_numAND prod_id = 'TNT2';

2.自联结
普通联结

SELECT prod_id, prod_nameFROM productsWHERE vend_id = (SELECT vend_id                FROM products                WHERE prod_id = 'DTNTR');

使用联结的相同查询

SELECT prod_id, prod_nameFROM products AS p1, products AS p2WHERE p1.vend_id = p2.vend_idAND ps.vend_id = 'DTNTR';

3.自然联结

SELECT c. *, o.order_num, o.order_date,        oi.proid, oi.quantity, oi.item_priceFROM customers AS c, orders AS o, orderitems AS oiWHERE c.cust.id = o.cust_idAND oi.order_num = o.order_numAND prod_id = 'FB';

4.外部联结
普通联结

SELECT customers.cust_id, orders.order_numFROM customers INNER JOIN ordersON customers.cust_id = orders.cust_id;

外部联结

SELECT customers.cust_id, orders.order_numFROM customers LEFT OUTER JOIN ordersON customers.cust_id = orders.cust_id;

LEFT OUTER JOIN 左外部链接的表。LEFT 指出的是 OUTER JOIN 左边的表

RIGHT OUTER JOIN ,右外部链接的表。RIGHT 指出的是 OUTER JOIN 右边的表

5.使用带聚集函数的联结

SELECT customers.cust_name,      customers.cust_id,      COUNT(orders.order_num) AS num_ordFROM customers INNER JOIN ordersON customers.cust_id = orders.cust_idGROUP BY customers.cust_id;SELECT customers.cust_name,        customers.cust_id,        COUNT(order.order_num) AS num_ordFROM customers LEFT OUTER JOIN ordersON customers.cust_id = orders.cust_idGROUP BY customers.cust_id;

2.14 组合查询

1.组合查询

SELECT vend_id, prod_id, prod_priceFROM productsWHERE prod_price <= 5UNION SELECT vend_id, prod_id, prod_priceFROM productsWHERE vend_id IN (1001, 1002);

UNION关键字 只是放在每条SELECT语句之间
- 必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分割
- UNION中的每个查询必须包含相同的列,表达式或聚集函数(不过各个列不需要以相同的次序列出)
- 列数据类型必须兼容:类型不必完全兼容,但必须是DBMS可以隐含地转换的类型

这条语句由前后两条SELECT语句组成,语句中用UNION关键字分割。UNION指示MySQL执行两条SELECT语句,并把输出组合成单个查询结果集。

2.对组合查询结果排序

SELECT vend_id, prod_id, prod_priceFROM productsWHERE prod_price <= 5UNION SELECT vend_id, prod_id, prod_priceFROM productsWHERE vend_id IN (1001, 1002)ORDER BY vend_id, prod_price;

这条UNION在最后一条SELECT语句使用了ORDER BY 子句。但是,MySQL用它来排序所有SELECT语句返回的所有结果。

2.15 全文本搜索

1.LIKE关键字和正则表达式搜索的限制

  • 性能。通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行(而且这些搜索极少使用表索引)。因此,由于被搜索行数不断增加,这些搜索非常耗时。
  • 明确控制。使用通配符和正则表达式匹配,很难明确控制匹配什么和不匹配什么。例如,指定一个词必须匹配,一个词必须不匹配,而一个词仅在第一个词确定匹配的情况下才可以匹配或者才可以不匹配。
  • 智能化结果。虽然基于通配符和正则表达式的搜索提供了非常灵活的搜索,但是它们都不能提供一种智能化的选择结果的方法。

2.使用查询扩展

使用查询扩展时,MySQL对数据和索引进行两遍扫描来完成搜索。
- 首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行;
- 其次,MySQL检查这些匹配行并选择所有有用的词
- 再其次,MySQL再次进行全文本搜索,这次不仅使用原来的条件,而且还使用所有有用的词。

3.布尔文本搜索

布尔操作符 说明 + 包含,词必须存在 - 排除,词必须不出现 > 包含,而且增加等级 < 包含,而且减少等级 () 把词组成子表达式(允许这些子表达式作为一个组被包含,排除、排列等) ~ 取消一个词的排序值 * 词尾的通配符 “” 定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语)

2.16 插入数据

1.插入完整的行

INSERT INTO customers VALUES(NULL, 'Li')

虽然这种语法很简单,但是并不安全,应该尽量避免使用。

上面的SQL语句高度依赖于表中列的定义次序,并且还依赖于其次序容易获得的信息,即使可得到这种次序信息,也不能保证下一次表结构变动后各个列保持完全相同的次序。因此,编写依赖于特定列次序的SQL语句是很不安全的。

INSERT INTO customers(cust_name, cust_address) VALUES ('Li', NULL);

更安全的方式

  • 提高性能

如果数据检索是重要的,可以在INSERT 和 INTO 之间添加关键字LOW_PRIORITY,指示MySQL降低INSERT语句的优先级。也适用于 UPDATE 和 DELETE。
INSERT LOW_PRIORITY INTO

2.插入多个行

INSERT INTO customers(cust_name, cust_address)VALUES('Li', NULL),('Alice', 'beijing');

用单条INSERT语句处理多个插入比使用多条INSERT语句快。

3.插入检索出的数据

INSERT INTO customers(cust_name, cust_address)SELECT cust_name, cust_addressFROM custnew;

2.17 更新和删除数据

1.更新数据

UPDATE customersSET cust_name = 'Alice', cust_address = 'hebei'WHERE cust_id = 10001;

2.IGNORE关键字

UPDATE IGNORE customers

即时发生错误,也继续更新,可使用IGNORE关键字。

如果用UPDATE语句更新多行,并且在更新这些行中的一行或多行时出现一个错误,则整个UPDATE操作被取消(错误发生前更新的所有行被恢复到他们原来的值)。

3.删除数据

DELETE FROM customersWHERE cust_id = 10001;
  • 删除表的内容而不是删除表。

DELETE语句从表中删除行,甚至是删除表中所有的行。但是,DELETE不删除表本身。

  • 更快的删除所有行

TRUNCATE TABLE,这个语句实际是删除原来的表并并重新创建一个表。

2.18 创建和操纵表

1.创建表(适用于sqlite的创建)

CREATE TABLE IF NOT EXISTS customers ('ID'  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 'memberID'  INTEGER, 'userID' TEXT, )

2.更新表

ALTER TABLE vendors ADD vend_phone CHAR(20);

给vendors表增加一个名为vend_phone的列,必须明确其数据类型。

ALTER TABLE vendors DROP vend_phone CHAR(20);

删除刚添加的列

ALTER TABLE orderitemsADD CONSTARINT fk_orderitems_ordersFOREIGN KEY (order_num) REFERENCES orders (order_num)

定义外键

3.删除表

DROP TABLE customers;

4.重命名表

RENAME TABLE customers TO customers2;
RENAME TABLE customers TO customers2, backup_vendors TO vendors;

2.19 使用视图

1.视图的规则和限制

  • 与表一样,视图必须使用唯一命名
  • 对于可以创建的视图数目没有限制
  • 为了创建视图,必须有足够的访问权限
  • 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图
  • ORDER BY可以用在视图中,但如果从该视图检索数据的SELECT语句中也含有ORDER BY,那么该视图中的ORDER BY将 被覆盖
  • 视图不能索引,也不能有关联的触发器或默认值
  • 视图可以和表一起使用。

2.使用视图

  • 视图用CREATE VIEW语句来创建
  • 使用SHOW CREATE VIEW viewname;
  • 用DROP删除视图,其语法为DROP VIEW viewname;
  • 更新视图时,可以先用DROP再用CREATE,也可以直接用CREATE OR REPLACE VIEW。如果要更新的视图不存在,则第二条语句会创建一个视图:如果要更新的视图存在,则第二条更新语句会替换原有视图。

2.20 存储过程

DELIMITER //CREATE PROCEDURE productpricing()BEGIN    SELECT Avg(prod_price) AS priceaverage    FROM productsEND //DELIMITER;

2.21 游标

1.步骤

  • 在能够使用游标前,必须声明它。这个过程实际上没有检索数据,它只是定义要使用的SELECT语句
  • 一旦声明后,必须打开游标以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来
  • 对于填有数据的游标,根据需要取出(检索)各行
  • 在结束游标使用前,必须关闭游标

2.22 事务

1.概念

  • 事务(transaction) 指一组SQL语句
  • 回退(rollback) 指撤销指定SQL语句的过程
  • 提交(commit)指将未存储的SQL语句结果写入数据库表
  • 保留点(savepoint)指事务处理中设置的临时占位符,你可以对它发布回退。

参考文章

  1. 《MySQL必知必会》[英]Ben Forta著 刘晓霞 钟鸣译
原创粉丝点击