SQL的基本語法
1、SQL語句可以單行或者多行書寫,以分號結尾。
2、MySQL資料庫的SQL語句不區分大小寫,關鍵字建議使用大寫。
3、註釋:
1) 單行註釋:-- 註釋內容 或 #註釋內容(MySQL獨有)
2) 多杭註釋:/* 註釋內容*/
SQL分類:
DDL(Data Definition Language)資料定義語言,用來定義資料庫物件:資料庫、表、列等;
DML(Data Manipulation Language)資料操作語言,用來對資料庫中表的資料進行增刪改;
DQL(Data Query Language)資料查詢語言,用來查詢資料庫中表的記錄(資料);
DCL(Data Control Language)
DDL -- 操作資料庫
1、查詢
檢視資料庫:SHOW DATABASES;
2、建立
建立資料庫:CREATE DATABASE 資料庫名;
建立資料庫(判斷,如果不存在則建立):CARETE DATABASE IF NOT EXISTS 資料庫名;
3、刪除
刪除資料庫:DROP DATABASE 資料庫名;
刪除資料庫(判斷,如果存在則刪除):DROP DATABASE IF EXISTS 資料庫名;
4、使用資料庫
使用資料庫:USE 資料庫名;
檢視當前使用的資料庫:SELECT DATABASE();
DDL --
建立(Create)/ 查詢(Retrieve) / 修改(Update) / 刪除(Delete)
查詢表:
查詢當前資料庫中的所有表:SHOW TABLES;
查詢表結構:DESC 表名稱;
建立表:
CREATE TABLE 表名稱(
欄位1 資料型別1,...
欄位n 資料型別n
);
數值型別
MySQL 支援所有標準 SQL 數值資料型別。
這些型別包括嚴格數值資料型別(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似數值資料型別(FLOAT、REAL 和 DOUBLE PRECISION)。
關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。
BIT資料型別儲存位欄位值,並且支援 MyISAM、MEMORY、InnoDB 和 BDB表。
作為 SQL 標準的擴充套件,MySQL 也支援整數型別 TINYINT、MEDIUMINT 和 BIGINT。下面的表顯示了需要的每個整數型別的儲存和範圍。
日期和時間型別
表示時間值的日期和時間型別為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每個時間型別有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。
TIMESTAMP型別有專有的自動更新特性,將在後面描述。
字串型別
字串型別指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些型別如何工作以及如何在查詢中使用這些型別。
注意:char(n) 和 varchar(n) 中括號中 n 代表字元的個數,並不代表位元組個數,比如 CHAR(30) 就可以儲存 30 個字元。
CHAR 和 VARCHAR 型別類似,但它們儲存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在儲存或檢索過程中不進行大小寫轉換。
BINARY 和 VARBINARY 類似於 CHAR 和 VARCHAR,不同的是它們包含二進位制字串而不要非二進位制字串。也就是說,它們包含位元組字串而不是字元字串。這說明它們沒有字符集,並且排序和比較基於列值位元組的數值值。
BLOB 是一個二進位制大物件,可以容納可變數量的資料。有 4 種 BLOB 型別:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納儲存範圍不同。
有 4 種 TEXT 型別:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 型別,可儲存的最大長度不同,可根據實際情況選擇。
刪除表
DROP TABLE 表名;
DROP TABLE IF EXISTS 表名;(刪除表時先判斷表是否存在)
修改表
1、修改表名:ALTER TABLE 表名 RENAME TO 新表名;
2、新增一列:ALTER TABLE 表名 ADD列名 資料型別;
3、修改資料型別:ALTER TABLE 表名 MODIFY 列名 新資料型別;
4、修改列名和資料型別:ALTER 表名 CHANGE 列名 新列名 資料型別;
5、刪除列:ALTER TABLE 表名 DROP 列名;
DML -- 新增資料 (INSERT INTO)
1、給指定的列新增資料:
(1) INSERT INTO 表名稱(列名1,列名2, ...) values(值1, 值2, ...);
2、給全部列新增資料:
(1) INSERT INTO 表名稱 VALUES(值1, 值2, ...);
3、批量新增資料:
(1) INSERT INTO 表名稱(列名1,列名2, ...) VALUES(值1, 值2, ...), (值1, 值2, ...)...;
(2) INSERT INTO 表名稱 VALUES(值1, 值2, ...), (值1, 值2, ...);
DML -- 修改資料(UPDATE...SET)
1、修改表資料:
(1) UPDATE 表名 SET 列名1=值1, 列名2=值2, ...[WHERE 條件];
注意:修改語句中如果不加條件,則將所有資料都修改!
DML -- 刪除資料(DELETE)
1、刪除表中的資料:
(1) DELETE FROM 表名 [WHERE 條件];
注意:刪除語句中不加條件,則將表中所有的資料刪除!
DQL -- 查詢資料(SELECT)
語法:
SELECT 欄位列表 FROM 表名列表 WHERE 條件列表 GROUP BY 分組列表 HAVING 分組後條件 ORDER BY 排序欄位 LIMIT 分頁限定;
1、查詢單表中所有資料:
(1) SELECT 欄位名 FROM 表名稱;
(2) SELECT DISTINCT 欄位名 FROM 表名稱;(去重)
(3) SELECT 欄位名 FROM 表名稱;
2、單表條件查詢:
1、查詢單表中的總記錄數:
(1) SELECT COUNT(*) FROM 表名稱;
(2) SELECT COUNT(*) FROM 表名稱 WHERE 條件[AND/OR ...];(多條件)
2、單表排序查詢:
(1) SELECT 欄位列表 FROM user ORDER BY 排序欄位;
(2) 按照數學成績降序排列,如果數學成績形同時,則按英語成績升序排列
SELECT * FROM stu ORDER BY math DESC, english ASC;
注意:多欄位排序時中間用“,”隔開,當前面的條件一樣時才會啟用後面的條件。
3、分組查詢:將一列資料作為一個整體,進行縱向計算
語法:SELECT 欄位列表 FROM 表名 [WHERE 分組前條件限定] GROUP BY分組欄位名 [HAVING 分組後條件過濾];
Where和having的區別:
① 執行時機不一樣:where是分組之前進行限定,不滿足where條件的則不參與分組,而having是分組之後對結果進行過濾;
② 可判定的條件不一樣:where不能對聚合函式進行判定,having可以;
注意:
① null不參與任何聚合函式的運算;
② 分組之後查詢的欄位為聚合函式和分組欄位,查詢其他欄位無意義;
③ 執行順序為:where > 聚合函式 > having;
1、單表分頁查詢:
分頁的關鍵字為:LIMIT
語法:SELECT 欄位列表 FROM 表名稱LIMIT 索引開始, 查詢的記錄數;
起始索引:從0開始
計算公式:起始索引 = (當前頁碼 - 1) * 每頁顯示的條數
提示:
① 分頁查詢limit 是MySQL資料庫獨有的(方言)
② Oracle分頁查詢使用 rownumber
③ SQL Server分頁查詢使用top
1、起別名:
AS: AS 也可以省略
① SELECT u.id, u.`name`, u.gender, u.address, u.`status` FROM user AS u;
② SELECT u.id, u.`name`, u.gender, u.address, u.`status` FROM user u;
③ select name, math as 數學成績, english as 英語成績 FROM stu;