文章目錄
MySQL基礎知識
基礎表操作
MySQL基本數據類型
類型 | 大小(字節) | 說明 |
---|---|---|
TINYINT | 1 | 小整數值 |
SMALLINT | 2 | 大整數值 |
MEDIUMINT | 3 | 大整數值 |
INT | 4 | 大整數值 |
BIGINT | 8 | 極大整數值 |
FLOAT | 4 | 單精度浮點數值 |
DOUBLE | 8 | 雙精度浮點數值 |
CHAR | 0-255 | 定長字符串 |
VARCHAR | 0-65535 | 變長字符串 |
TINYBLOB | 0-255 | 二進制形式的短文本數據 |
BLOB | 0-65535 | 二進制形式的長文本數據 |
MEDIUMBLOB | 0-16777215 | 二進制形式的中等長度文本數據 |
LONGBLOB | 0-4294967295 | 二進制形式的極大文本數據 |
TINYTEXT | 0-255 | 短文本數據 |
TEXT | 0-65535 | 長文本數據 |
MEDIUMTEXT | 0-16777215 | 中等長度文本數據 |
LONGTEXT | 0-4294967295 | 極大文本數據 |
DATE | 3 | 日期值(YYYY-MM-DD) |
TIME | 3 | 時間值或持續時間(HH:MM:SS) |
YEAR | 1 | 年份值(YYYY) |
DATETIME | 8 | 日期加時間值(YYYY-MM-DDhh:mm;ss) |
TIMESTAMP | 8 | 時間戳(YYYYMMDDhhmmss) |
創建和操縱表
每個DBMS(數據庫管理系統)的操作語句有所不同,不過差得不多。以下是標準SQL語句,某些語句若無法在你的DBMS運行,請參閱相應DBMS文檔。
- 創建表CREATE TABLE
CREATE TABLE 新表名
(
列名 列的定義
);
CREATE TABLE products
(
prod_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL
);
- 更新表ALTER TABLE
#增加列
ALTER TABLE 表名
ADD 列名 數據類型;
ALTER TABLE products
ADD vend_id CHAR(10);
#刪除列
ALTER TABLE 表名
DROP COLUMN 列名;
ALTER TABLE products
DROP COLUMN prod_name;
#刪除表
DROP TABLE 表名;
DROP TABLE products;
插入數據
- 插入完整的行
INSERT INTO 表名
VALUES(依序符合規範的各列數據,用逗號隔開);
INSERT INTO customers
VALUES('10001',
'Tom',
'New York',
'USA',
NULL);
- 插入部分行
INSERT INTO 表名(希望插入數據的列名,用逗號隔開)
VALUES(對應列的規範數據,用逗號隔開);
INSERT INTO customers(
cust_id,
cust_country
)
VALUES(
'10001',
'UAS'
);
- 插入檢索出的數據
INSERT INTO 表名1(檢索出的數據存放的列名,用逗號隔開)
SELECT 檢索的列名
FROM 表名2;
INSERT INTO customers(
cust_id,
cust_name)
SELECT new_cust_id,
new_cust_name
FROM newcust;
- 從一個表複製到另一個表SELECT INTO
SELECT 列名
INTO 表名1
FROM 表名2;
SELECT *
INTO cust_copy
FROM customers;
更新和刪除數據
- 更新數據UPDATE
UPDATE 表名
SET 列名=新值
WHERE 過濾條件;
UPDATE customers
SET cust_email = '[email protected]'
cust_contact = 'roberts'
WHERE cust_id = '10001';
#刪除某個值,可以設置它爲NULL
UPDATE customers
SET cust_email = NULL
WHERE cust_id = '10002';
- 刪除數據DELETE
#刪除某一行數據
DELETE FROM 表名
WHERE 過濾條件;
DELETE FROM customers
WHERE cust_id ='10004';
DELETE刪除整行而不是刪除列,如果想要刪除列使用UPDATE語句,如果刪除整個表使用TRUNCATE TABLE
表聯結
如果數據存儲在多個表中,怎樣用一條 SELECT語句就檢索出數據呢?答案是使用聯結。 簡單說, 聯結是一種機制,用來在一條 SELECT語句中關聯表,因此稱爲聯結。使用特殊的語法,可以聯結多個表返回一組輸出, 聯結在運行時關聯表中正確的行。
創建聯結
SELECT 需要顯示的列名,可以來自不同表
FROM 表名
WHERE 不同表的關聯方式;
SELECT vend_name,prod_name,prod_price
FROM vendors,products
WHERE vendors.vend_id = products.vend_id;
叉聯結(cross join)
返回笛卡兒積的聯結,也稱叉聯結( cross join)。
內聯結(inner join)/等值聯結(equijoin)
等值聯結( equijoin),它基於兩個表之間的相等測試。 這種聯結也稱爲內聯結( inner join)。
SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
自聯結(self-join)
自聯結通常作爲外部語句,用來替代從相同表中檢索數據的使用子查詢語句。
自然聯結(natural join)
標準的聯結(內聯結)返回所有數據,相同的列甚至多次出現。自然聯結排除多次出現,使每一列只返回一次。
自然聯結要求你只能選擇那些唯一的列,一般通過對一個表使用通配符( SELECT*),而對其他表的列使用明確的子集來完成。
外聯結(outer join)
聯結包含了那些在相關表中沒有關聯行的行。 這種聯結稱爲外聯結。
在使用 OUTERJOIN語法時,必須使用 RIGHT或 LEFT關鍵字指定包括其所有行的表( RIGHT指出的是OUTERJOIN右邊的表,而LEFT指出的是OUTERJOIN左邊的表)。
不同聯結之間的關係可參閱這篇文章:一文搞懂SQL中的各種聯結——內聯結、自然聯結、自聯結、交叉聯結
以上內容參考於《SQL必知必會》提取碼: xymn,如需更深入瞭解可以查看書籍,這本書簡短明瞭,你可以在十分鐘以內看完你希望瞭解的某一章節。
實踐項目(我使用的是navicat for mysql)
基礎表操作
練習一:創建一個courses表,查詢出所有超過或等於5名學生的課。
- 創建表
- 輸入數據
- 查詢操作及結果
練習二:創建一個 salary表,如下所示,有m=男性 和 f=女性的值 。
id | name | sex | salary |
---|---|---|---|
1 | A | m | 2500 |
2 | B | f | 1500 |
3 | C | m | 5500 |
4 | D | f | 500 |
交換所有的 f 和 m 值(例如,將所有 f 值更改爲 m,反之亦然)。要求使用一個更新查詢,並且沒有中間臨時表。**
- 創建表
- 輸入數據
- 交換操作
表聯結
練習三:組合兩張表
- 創建兩張表Person\Address
- 分別在兩張表中插入數據
- 聯結表並輸出查詢信息
練習四:刪除如下email 表中所有重複的電子郵箱,重複的郵箱裏只保留 Id 最小的那個
Id | |
---|---|
1 | [email protected] |
2 | [email protected] |
3 | [email protected] |
-
創建表
-
輸入數據
-
刪除重複郵箱(自聯結方法)