mysql sql知識總結
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;
mysql sql知識總結