SQL知识总结:
检索不同的行:
SELECT DISTINCT VEND_ID FROM PRODUCTS;
DISTINCT 应用于所有的列
===================
限制结果:
SELECT PROD_NAME FROM PRODUCT LIMIT 5,5;
从0开始
====================
ORDER BY
SELECT * FROM a ORDER BY b,c;
降序 DESC
====================
过滤
SELECT a FROM b WHERE c <> d;
空值检查
SELECT a FROM b WHERE c IS NULL;
组合过滤先后顺序
处理 and 优先于 or
SELECT a FROM b WHERE c OR d AND e;
SELECT a FROM b WHERE (c OR d) AND e;
IN 的使用:
SELECT a FROM b WHERE c IN(x, y, Z) ORDER BY d;
IN 的优点:
清楚直观 次序管理 执行更快 动态创建
=====================
通配符
%:出现任意次,可为0
SELECT a FROM b WHERE a LIKE 'jet%'
_: 单次
通识符置于首部搜寻最慢!
======================
sql正则表达式
对比 LIKE 和 REGEXP
LIKE匹配整个列,REGEXP匹配出现在列值的
| : OR
[] : 匹配特定字符
^ : NOT
. : 任意字符
\ : 特殊字符前导
* : {0,}
- : {1,}
? : {0,1}
{n, m} 匹配数目的范围
SELECT a FROM b WHERE a REGEXP '[[:digit:]]{4}'
ORDER BY a;
定位符
^ : 文本的开始
$ : 文本的结尾
[[:<:]] : 词的开始
[[:>:]] : 词的结尾
================
字段
拼接:Concat()
SELECT Concat (vend_name, '(', vend_country, ')')
AS vend_title
FROM vendors
ORDER BY vend_name;
注*:RTime()函数去掉右边所有的空格。
AS: 别名
Soundex() : 将任何文本串转换为描述其语音表示的字母数字模式的算法。
========================
汇总
聚集函数
GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
WITH ROLLUP 可以得到每个分组以及每个分组汇总级别的值。
HAVING : 过滤分组 数据分组后过滤
WHERE : 过滤行 数据分组前过滤
SELECT a, COUNT(*) AS b
FROM c
GROUP BY a
HAVING COUNT(*) >= 2;
SELECT a, COUNT(*) AS b
FROM c
WHERE d >= 10
GROUP BY a
HAVING COUNT(*) >= 2;
==========================
分组
ORDER BY 与 GROUP BY
ORDER BY : 排序输出 任意列都可输出 不一定需要
GROUP BY : 分组(不保证有序) 必须使用选择列表达式 与聚集函数一起使用,必须使用
===========================
子查询 由里及外 耗时
相关子查询
主要用于测试 注意性能
============================
联结
笛卡儿积 由没有连接条件的表关系返回,检查出的行的数目为第一个表中的行数乘以第二个表中的行数
内部连接(等值连接)
SELECT a, b, c FROM Table1
INNER JOIN Table2
ON Table1.a = Table2.a;
==============================
高级联结
自联结
SELECT P1.PROD_ID, P1.PROD.NAME
FROM products AS P1, products AS P2
WHERE P1.VEND_ID = P2.VEND_ID
AND P2_PROD_ID = 'DTNTR';
自然联结(自己完成)
标准的联结返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。
外部联结
SELECT Table1.a, Table2.b
FROM Table1 OUTER JOIN Table2
ON Table1.c = Table2.c;
外部联结还包括没有关联行的行。RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表.
UNION 多个表SELECt相同的列或项
UNION 自动去除重复的行
UNION ALL 全部,不去重
====================================
全文本搜索 对结果排序
MyISAM 全文本搜索
InnoDB 无
创建全文本搜索
FULLTEXT(note_text);
导入数据 => 修改表 => 定义FULLTEXT
Match() 指定被搜索列
Against() 指定被搜索表达式
查询拓展
1.基本全文本搜索,找出所有匹配行
2.检查匹配行,找出所有有用的词
3.再次进行全文搜索,使用原先的条件外加有用的词
SELECT a FROM Table
WHERE MATCH(a) AGAINST ('c' WITH QUERY EXPANSION);
布尔模式 (50%)
IN BOOLEAN MODE
=====================================
低效插入
INSERT LOW_PRIORITY INTO
单条插入多值
INSERT SELECT
=======================================
更新UPDATE
UPDATE
SET
WHERE
INGORE 忽略错误
DELETE 删除(行, 而不是表本身)
TRUNCATE TABLE :删除表并新建
只允许一个AUTO_INCREMENT列
AUTO_INCREMENT 可被覆盖 后面的值由打断值增加
DEFUALT 指定默认值
=======================================
引擎:
InnoDB : 事务处理引擎,不支持全文搜索
MEMORY : 功能类似于MyISAM,数据存储在内存,速度很快
MyISAM : 性能极高的引擎,支持全文本搜索,但不支持事务处理
引擎可以混用
更改表结构
ALTER TABLE a
ADD x CHAR(20);
==========================================
视图
CERATE VIEW ...
视图更新
==========================================
存储过程
调用(执行存储过程):
CALL productpricing(@pricelow,
@pricehigh,
@priceaverage);
创建存储过程
CREATE PROCEDURE productpricing()
BEGIN
SELECT AVG(PROD_PRICE) AS PRICEAVERAGE
FROM PRODUCTS
END;
DELIMITER : 新结束符
删除存储过程:
DROP PROCEDURE PRODUCTPRICING;
======================================
游标 : 被语句检索出来的结果集
创建游标:
CREATE PROCEDURE a
BEGIN
DECLARE b CURSOR
FOR
SELECT c FROM Table1;
END;
打开关闭游标:
OPEN cursorA;
CLOSE cursorA;
使用FETCH语句从游标中检索
设置循环条件:
DECLARE CONTINUE HANDLE FOR SQLSTATE '02000' SET done=1;
======================================
触发器
响应某个语句:(前后)
DELETE
INSERT
UPDATE
表中唯一,每表最多六个
CREATE TRIGGER a AFTER INSERT ON b
FOR EACH ROW SELECT 'Product added';
删除触发器:
DROP TRIGGER a;
INSERT => new表
DELETE => old表
UPDATE : old表(只读) new表(可写)
触发器不支持存储过程
=======================================
事务处理
用来维护数据库完整性,成批操作要么全部执行,要么完全不执行
事务 回退 提交 保留点
不回退SELECT 隐含事务关闭
事务开始
START TRANSACTION;
回退:
ROLLBACK;
是否自动提交
SET autocommit=0;