sql 語句備忘錄(walker)

結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係數據庫系統。
  • 添加一個自增ID字段
ALTER TABLE tblname ADD COLUMN csmid COUNTER (0, 1)
  • access 建立一個有自增字段的表
CREATE TABLE tblname(id autoincrement, sname memo, ...)
  • 刪除一個字段
ALTER TABLE tblname DROP COLUMN csmid
  • sql server判斷某個字段是否爲空字符串
SELECT * FROM tblname where fieldname!=''
# OR
SELECT * FROM tblname where fieldname<>''
  • 取某一列的最大值
SELECT MAX(fieldname) from tblname;
  • 查詢一個字段有哪幾種取值
SELECT DISTINCT fieldname From tblname;
  • 統計一個字段不一樣取值的數量,即有多少種取值。
SELECT COUNT(DISTINCT fieldname) FROM tblname;
  • 統計一個字段的幾種取值,並按統計量降序排列。
SELECT fieldname, COUNT(*)
FROM tblname
GROUP BY fieldname
ORDER BY COUNT(*) DESC;
  • 統計學號相同,班級不一樣的學生
SELECT sno, COUNT(*) FROM
(
SELECT sno, sclass FROM students
GROUP BY sno, sclass
)
GROUP BY SNO
ORDER BY COUNT(*) DESC
  • ACCESS,在students表中將name字段中含有abc的字段放在前面。其餘數據庫可能要將INSTR換爲CHARINDEX。在access中instr從1開始計數,而不是從0開始計數。
SELECT *
FROM students
ORDER BY INSTR(name, 'abc') DESC;
  • Access 的 instr 函數切記注意第一個和第四個參數。(可參考這裏)
  • 設置和去除主鍵,參考這裏
# 設置主鍵
ALTER TABLE tblname ADD CONSTRAINT PrimaryKey Primary Key(主鍵字段名)
# 去除主鍵
ALTER TABLE tblname DROP CONSTRAINT PrimaryKey
  • ACCESS從數據庫A複製表A到數據庫B(新建了表B)。先連上數據庫A,而後
SELECT * INTO tableB [IN 'D:\B.mdb'] FROM tableA
  • ACCESS從數據庫A複製表A到數據庫B(追加數據到表B)。先連上數據庫A,而後
INSERT INTO tableB(field1, field2) [IN 'D:\B.mdb'] SELECT field1, field2 FROM tableA
# 當表結構徹底相同,合併表時能夠這麼寫:
INSERT INTO tableB [IN 'D:\B.mdb'] SELECT * FROM tableA
SELECT DATE_ADD(datefiled, INTERVAL 8 HOUR ) FROM tbl;
  • MySQL清除空白可查閱 trim 和 replace 函數。
  • 根據關鍵字段去重,需用到臨時表。這裏主要是提供思路,需根據具體數據庫獲得具體sql語句。(參考這裏)
# 添加自增ID
select identity(int,1,1) as autoID, * into tmpTable from tableName
# 選出重複記錄中值最小的自增ID
select min(autoID) as autoID into tmpTable2 from tmpTable group by keyField1, keyField2
# 獲得最終結果
select * from tmpTable where autoID in(select autoID from tmpTable2)
  • ADO獲取SELECT COUNT(*)的結果。
num = rs->GetCollect(_variant_t((long)0))
  • ADO 判斷字段值是否爲 NULL。
vField.vt ?= VT_NULL
  • ADO 訪問 ACCESS 的 3092 錯誤的兩種可能緣由。
# date爲保留字,應該加中括號 
SELECT date FROM tableName
# 這個中括號按說不該該影響的 
SELECT COUNT(*) FROM tableName WHERE field<>'[D2037'

另外注意,字符串中如有nul字符,也會插入失敗,這種狀況比較難以排查。由於看起來的情況是,拷貝到access文件裏面裏能執行,而代碼裏不能執行。html

  • 設置表的autoid字段從10開始自增,每次增1。
ALTER TABLE tableName
ALTER COLUMN [autoid] COUNTER (10, 1)
  • ACCESS獲得數據庫中全部表名。
SELECT NAME FROM MSysObjects
WHERE TYPE=1 AND FLAGS=0
  • ACCESS 設置字段前導 0 示例
UPDATE tblname
SET fieldname=FORMAT(fieldname, "00000");
  • mysql無重複插入。(參考這裏

1)、無則插入,有則忽略。mysql

/*某些版本的mysql會有一個警告*/
INSERT IGNORE INTO tblname(a,b,c) VALUES (1,2,3);    
/*不會有警告*/
INSERT INTO tblname(a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c;

2)、無則插入,有則更新。sql

INSERT INTO tblname(a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
  • mssql(SQLServer)無重複插入,注意下面兩個1並非walker抽風了。(參考這裏和那裏)
INSERT INTO  tableName(keyA, keyB) SELECT valA, valB
 WHERE NOT EXISTS 
 (SELECT TOP 1 1 FROM tableName WHERE keyA=valA AND keyB=valB);

2八、兩表相減。(in、not in、exists、not exists
1)、單字段。數據庫

SELECT field FROM tableA
WHERE field NOT IN
(
SELECT field FROM tableB
)

2)、多字段。編程

SELECT * FROM tableA
WHERE NOT EXISTS
(
SELECT * FROM tableB 
WHERE tableA.field1=tableB.field1 AND tableA.field2=tableB.field2
)
SELECT * FROM [;database=d:\A.mdb].tblA,[;database=d:\B.mdb].tblB
WHERE tblA.fieldA=tblB.fieldB;

SELECT * FROM tblA,[;database=d:\B.mdb].tblB
WHERE tblA.fieldA=tblB.fieldB;
  • Access數據導入到 SQLServer 可用以下 Transact-SQL 語句。(參考這裏
INSERT INTO destTable
SELECT * FROM OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'D:\test\test.mdb';'admin';'', srcTable);
INSERT INTO destTable
SELECT * FROM OPENROWSET ('Microsoft.ACE.OLEDB.12.0', 'D:\test\test.mdb';'admin';'', srcTable);
  • 查找以數字打頭的數據。(MySQL,正則)
SELECT * FROM tableName WHERE fieldName REGEXP '^[0-9]' LIMIT 100;
  • MySQL 利用存儲過程執行循環語句。
USE dbname;

DELIMITER $$  # 定義結束符爲$$

DROP PROCEDURE IF EXISTS test_insert;  # 刪除已有存儲過程 

CREATE PROCEDURE test_insert()  # 建立新的存儲過程
    BEGIN  
    DECLARE i INT DEFAULT 1;
    WHILE i<10  DO
        INSERT INTO tableName(idx) VALUES (i); 
        SET i=i+1;
    END WHILE;
    
END $$  # 結束定義語句

DELIMITER ;  # 恢復結束符爲;

CALL test_insert();  # 調用存儲過程
本文出自 walker snapshot
相關文章
相關標籤/搜索