SQL 備忘錄

都兼容 MySQL數據庫

  • 查看錶結構:DESC ${table_name}函數

  • 查看建表語句:SHOW CREATE TABLE ${table_name}性能

  • ​表增長列:ALTER TABLE ${table_name} ADD COLUMN ${copumn_name} ${COLUMN_TYPE} NOT NULL;blog

  • ​表修改列:ALTER TABLE ${table_name} CHANGE COLUMN ${column_old_name} ${column_new_name} ${COLUMN_TYPE} NOT NULL;排序

  • ​刪除列:ALTER TABLE ${table_name} DROP COLUMN ${column_name}索引

  • ​主鍵要能惟一標識一條記錄事務

  • ​建立列值惟一約束:ALTER TABLE ${table_name} ADD CONSTRAINT ${unique_constraint_name} UNIQUE (${column_name});it

  • ​外鍵會必定程度下降性能io

  • 建立外鍵:​ALTER TABLE ${table_nane} ADD CONSTRAINT ${foreign_key_name} FOREIGN KEY (${column_name}) REFERENCES ${other_table} (${other_table_column});table

  • ​刪除外鍵:ALTER TABLE ${table_name} DROP FOREIGN KEY ${foreign_key_name};

  • ​索引對列值預排序因此加快查減慢增刪改

  • ​​建立普通索引:ALTER TABLE ${table_name} ADD INDEX ${index_name} (${column_name1}, ${column_name2});

  • ​建立惟一索引(索引列值有惟一性):ALTER TABLE ${table_name} ADD UNIQUE INDEX ${unique_index_name} (${column_name});

  • ​SELECT 語句:SELECT ${TRANSACTION_FUNCTION} ${transaction_result_alias}, ${column_name1} ${column_alias}, ${column_name2} FROM ${table_name} WHERE ${</=/>/<>/<=/>=/ LIKE/()/NOT/AND/OR_column} ORDER BY ${column_name3} DESC ${column_name4} ASC LIMIT ${result_count} OFFSET ${start_number} GROUP BY ${column_name}; LIKE 語句中 % 匹配任意數量的字符

  • ​SELECT 聚合函數:COUNT(*),返回的總行數,COUNT(${column_name}),返回了指定列的行數(與前面的等價),SUM(${column_name},計算該數值列的和,AVG(${column_name}),計算該數值列的平均值,MAX (${column_name}),計算某一列的最大值,字符類返回排序最後的,MIN(${column_name}),計算某一列的最小值,字符類返回排序最前的,當未返回數據時,COUNT 返回 0,其餘的返回 NULL

  • ​分組查詢:執行過程是先把 GROUP BY 指定的列值相同的合併爲一組,生成一箇中間表,再進行其餘操做,分組有多少組返回結果就是多少行,按 GROUP BY 合併的行中不能進行其值合併的列其值將爲 NULL(部分數據庫會報錯,如 MySQL),GROUP BY 後可使用逗號分隔指定多個列進行分組查詢,執行過程是先按 GROUP BY 指定的第一列合併,生成一箇中間表,再對中間表的 GRUOP BY 指定的第二列進行合併,再生成一箇中間表,依次類推,理解困難看下圖

  • ​多表查詢(笛卡爾乘積):SELECT ${table_name1}.${column_name1} ${alias1}, ${table_name2}.${column_name2} ${alias2} FROM ${table_name1}, ${table_name2}; 多表查詢時返回的列名只會有個表的列名而不含表名,若是兩個表中有命名衝突則須要取別名

  • ​給表設置別名:SELECT ${alias1}.${column_name1} ${alias3}, ${alias2}.${column_name2} ${alias4}, ${column_name3} FROM ${table_name1} ${alias1}, ${table_name2} ${alias2};
  • 鏈接查詢:SELECT ${column_name} FROM ${table_name1} ${INNER/RIGHT OUTER/LEFT OUTER/FULL OUTER} JOIN ${table_name2} ON ${table_name1}.${column_name1} ${</=/>/<>/<=/>=} ${table_name2}.${column_name2}; JOIN 左邊的表爲左表,右邊的爲右表,鏈接查詢是先對左右表作笛卡爾乘積,再按照 ON 語句進行過濾,INNER JOIN 直接返回過濾後的結果集,RIGHT OUTER JOIN 在結果集中再添加右表中 ON 條件徹底未匹配到的行至結果集中,LEFT OUTER JOIN 則是添加左表中的徹底未匹配到的行,FULL OUTER JOIN 是兩個表中徹底未匹配到的行都添加進結果集中,其中,另外一個表中不存在的數據值爲 NULL

  • ​INSERT 語句:INSERT INTO ${table_name} (${column_name1}, ${column_name2}) VALUES (${value1}, ${value2}), (${value3}, ${value4});

  • ​UPDATE 語句:UPDATE ${table_name} SET ${column_name1} = ${value1}, ${column_name2} = ${value2} WHERE ${</=/>/<>/<=/>=/ LIKE/()/NOT/AND/OR_column}; UPDATE 語句中,更新的值可使用表達式,如 ...SET score = score + 10...

  • DELETE 語句:​DELETE FROM ${table_name} WHERE ${</=/>/<>/<=/>=/ LIKE/()/NOT/AND/OR_column};

  • 插入或替換:將 INSERT 替換爲 REPLACE 其餘語法不變,主鍵值不存在時插入數據,主鍵值存在的時候刪除舊數據再插入新數據

  • ​插入或更新:在 INSERT 語句後加入 DUPLICATE KEY UPDATE ${column_name1} = ${value1}, ${column_name2} j= ${value2}; 若是主鍵值不存在,將插入數據,不然將更新數據
    ​表的快照:CREATE TABLE ${new_table_name} SELECT * FROM ${old_table_name}; 也能夠指定 WHERE 子句只備份特定數據

  • ​INSERT 使用 SELECT 返回值:INSERT INTO ${table_name1} (${column_name1}, ${column_name2}) SELECT ${column_name3}, ${column_name4} FROM ${table_name2} WHERE {</=/>/<>/<=/>=/ LIKE/()/NOT/AND/OR_column}; 這要求 SELECT 返回的列及其類型與 INSERT 的對應

  • ​事物:SQL 腳本中開啓一個事物用 BEGIN; 結束一個事務用 COMMIT; 回滾用 ROLLBACK; 設置隔離級別用 SET TRANSACTION ISOLATION LEVEL ${ISOLATION_LEVEL};

  • ​Read Uncommitted:隔離級別最低,一個事務可能會讀到另外一個事務更新但未提交的數據,若是此時回滾將發生髒讀

  • ​Read Committed:一個事務讀取另外一個事務正在更新的數據,致使同一次事物中兩次取出的數據不一致,即不可重複讀

  • ​Repeatable Read,:一個事務讀取另外一個事務正在插入的數據,插入前沒法讀取到,插入事務提交後仍沒法讀取到,可是更新時數據又會出現,即幻讀,InnoDB 引擎的默認隔離級別

  • Serializable:最嚴格的隔離級別,以上三種問題都不會出現,以性能做爲代價,默認的隔離級別

相關文章
相關標籤/搜索