0%

MySQL要点拾遗

LIMIT

LIMIT 5 表示返回不多于5行的结果,带一个值的LIMIT总是从第一行开始,返回指定的行数
LIMIT 5, 5表示返回从第5行开始的5行,第一个数为开始位置,第二个数为要检索的行数

检索出来的第一行为行0而不是行1,因此,LIMIT 1,1将检索出第二行而不是第一行。LIMIT 3,4表示从第三行开始4行,LIMIT 4 OFFSET3表示同样意思

LIKE

LIKE用于过滤部分匹配的情况,可以使用通配符表示若干字符,其中%表示任何字符出现任何次数(包括0次),但是%不能匹配NULL。下划线_可以匹配单个字符。

SELECT子句及其顺序

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

联结

  1. 等值联结(内部联结),等值联结是在WHERE子句中指定两表中联结的字段:SELECT id FROM ta, tb WHERE ta.vid = tb.vid,内联结可以达到同样的效果:SELECT id FROM ta INNER JOIN tb ON ta.vid = tb.vid。ANSI SQL规范首选INNER JOIN语法。
  2. 自联结,如果需要多次使用同一个表,可以用表别名和自联结来实现:SELCT p1.proc_id, p1.proc_name FROM products AS p1, product AS p2 WHERE p1.vend_id = p2.vend_id AND p2.proc_id = “DTNTR”
  3. 外部联结,外部联结可以查询到没有关联在一起的行,使用OUTER JOIN时,必须使用RIGHT或LEFT关键字指定包括其所有行的表,RIGHT指出是OUTER JOIN右边的表,LEFT指出是OUTER JOIN左边的表。

UNION

  1. UNION由两条或两条以上的SELECT语句组成,语句之间用UNION隔开
  2. UNION中的每个查询必须包含相同的列、表达式或聚集函数(不需要以相同的次序列出)
  3. 列数据必须兼容,类型不必完全相同,但必须可以隐式转换

UNION从结果集中自动去除了重复的行,如果需要返回所有的匹配行,可以使用UNION ALL。ORDER BY子句必须出现在最后一条SELECT语句之后,并且只能有一个ORDER BY子句,对返回的所有结果进行排序。

视图

视图可以极大地简化复杂SQL语句、保护基础数据,视图是虚拟的表,可以通过临时表算法或者MERGE SQL算法实现。视图有以下限制:

  1. 创建视图时,视图名不能与表名以及其它视图名相同
  2. 视图不能索引,也不能有关联的触发器

视图主要用于检索,不过也可以进行更新(UPDATE、INSERT和DELETE),如果视图定义了以下操作,则不能对视图进行更新:

  • 分组(GROUP BY和HAVING)
  • 联结
  • 子查询
  • 聚集函数(MIN(), COUNT(), SUM()等)
  • DISTINCT

存储过程

存储过程可视为批处理程序,就是为以后的使用而保存的一条或多条MySQL语句的集合。通过使用存储过程有以下好处:

  1. 可以把处理封装在容易使用的单元中简化复杂的操作并保证数据的一致性和完整性
  2. 如果表名、列名或业务逻辑有变化,只需要修改存储过程的代码
  3. 提高性能,使用存储过程比使用多条单独的SQL语句要快

定义存储过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE PROCEDURE productpricing(
OUT pl DECIMAL(8, 2),
OUT ph DECIMAL(8, 2),
OUT pa DECIMAL(8, 2)
)
BEGIN
SELECT Min(prod_price)
INTO pl
FROM products;
SELECT Max(prod_price)
INTO ph
FROM products;
SELECT Avg(prod_price)
INTO pa
FROM products;
END;

调用存储过程:

1
2
3
4
CALL productpricing(@pricelow,
@pricehigh,
@priceaverage);
SELECT @priceaverage;

触发器

触发器是MySQL响应DELETE、INSERT和UPDATE而自动执行的一条MySQL语句,或者位于BEGIN和END语句之间的一组语句。每个表每个事件只允许定义一个触发器,所以每个表最多支持6个触发器(每条INSERT、UPDATE和DELETE的之前和之后)。触发器不能更新或覆盖,要修改一个触发器,必须先删除它然后再创建它。

1
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'product added'

事务管理

ROOLBACK可以撤销MySQL语句,使用ROOLBACK后,MySQL语句不会对表中的数据进行修改:

1
2
3
START TRANSACTION;
DELETE FROM order;
ROOLBACK;

COMMIT用于在事务处理中提交所做的更改,MySQL默认自动提交所有更改并立即生效,可以通过SET autocommit=0取消自动提交。在事务处理块中,必须使用COMMIT显示提交事务,当COMMIT或ROLLBACK语句执行后,事务会自动关闭。

1
2
3
START TRANSACTION;
DELETE FROM orders;
COMMIT;

可以指定保留点(SAVEPOINT)指定要回退的点:

1
2
SAVEPOINT delete;
ROOLBACK TO delete;

参考资料

《MySQL必知必会》