創(chuàng)建計(jì)算字段
-
使用
Concat()函數(shù)拼接字段
mysql> SHOW COLUMNS FROM address;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| province | varchar(255) | YES | | NULL | |
| city | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
mysql> SELECT Concat(province, '-', city) AS address FROM address;
+---------------------+
| address |
+---------------------+
| 廣東省-深圳市 |
| 廣東省-惠州市 |
| 廣東省-東莞市 |
+---------------------+
-
使用
trim()刪除左右側(cè)多余的空格
mysql> SELECT Concat('(', province, ')', '->(', Trim(province), ')') AS trim_test
-> FROM address WHERE id = 4;
+------------------------+
| trim_test |
+------------------------+
| ( ABC )->(ABC) |
+------------------------+
RTrim()刪除右邊空格,LTrim()刪除左邊空格。
-
執(zhí)行算術(shù)計(jì)算
mysql> SELECT * FROM good;
+----+---------+------+-------+
| id | name | num | price |
+----+---------+------+-------+
| 1 | 蘋果 | 4 | 3.60 |
| 2 | 香蕉 | 5 | 5.40 |
| 3 | 西瓜 | 2 | 12.50 |
+----+---------+------+-------+
mysql> SELECT name, num, price, num * price AS total FROM good;
+---------+------+-------+-------+
| name | num | price | total |
+---------+------+-------+-------+
| 蘋果 | 4 | 3.60 | 14.40 |
| 香蕉 | 5 | 5.40 | 27.00 |
| 西瓜 | 2 | 12.50 | 25.00 |
+---------+------+-------+-------+
使用數(shù)據(jù)處理函數(shù)
-
函數(shù)
SQL支持利用函數(shù)來(lái)處理數(shù)據(jù)。函數(shù)一般是在數(shù)據(jù)上執(zhí)行的,它給數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便。
大多數(shù)SQL實(shí)現(xiàn)支持以下類型的函數(shù):
1、用于處理文本串的文本函數(shù)。
2、用于在數(shù)值數(shù)據(jù)上進(jìn)行算術(shù)操作的數(shù)值函數(shù)。
3、處理日期和時(shí)間值的時(shí)間或日期函數(shù)。
4、獲取特殊信息的系統(tǒng)函數(shù)。
-
使用函數(shù)
1、文本函數(shù)
mysql> SELECT Upper(name) FROM user WHERE name REGEXP '^[a-z]+';
+-------------+
| Upper(name) |
+-------------+
| TOM |
| DUCK |
| TONY |
| PUCK |
| APPLE |
| PEOPLE |
+-------------+
| 常用的文本處理函數(shù) | 說(shuō)明 |
|---|---|
| Left() | 返回串左邊的字符 |
| Length() | 返回串的長(zhǎng)度 |
| Locate() | 找出串的一個(gè)子串 |
| Lower() | 將串轉(zhuǎn)換為小寫 |
| LTrim() | 去掉串左邊的空格 |
| Right() | 返回串右邊的字符 |
| RTrim() | 去掉串右邊的空格 |
| Soundex() | 返回串的SOUNDEX值 |
| SubString() | 返回子串的字符 |
| Upper() | 將串轉(zhuǎn)換為大寫 |
2、日期和時(shí)間處理函數(shù)
| 常用日期和時(shí)間處理函數(shù) | 說(shuō)明 |
|---|---|
| AddDate() | 增加一個(gè)日期(天、周等) |
| AddTime() | 增加一個(gè)時(shí)間(時(shí)、分等) |
| CurDate() | 返回當(dāng)前日期 |
| CurTime() | 返回當(dāng)前時(shí)間 |
| Date() | 返回日期時(shí)間的日期部分 |
| DateDiff() | 計(jì)算兩個(gè)日期之差 |
| Date_Add() | 高度靈活的日期運(yùn)算函數(shù) |
| Date_Format() | 返回一個(gè)格式化的日期或時(shí)間串 |
| Day() | 返回一個(gè)日期的天數(shù)部分 |
| DayOfWeek() | 對(duì)于一個(gè)日期,返回對(duì)應(yīng)的星期幾 |
| Hour() | 返回一個(gè)時(shí)間的小時(shí)部分 |
| Minute() | 返回一個(gè)時(shí)間的分鐘部分 |
| Month() | 返回一個(gè)日期的月份部分 |
| Now() | 返回當(dāng)前日期和時(shí)間 |
| Second() | 返回一個(gè)時(shí)間的秒部分 |
| Time() | 返回一個(gè)日期時(shí)間的時(shí)間部分 |
| Year() | 返回一個(gè)日期的年份部分 |
mysql> SELECT Now();
+---------------------+
| Now() |
+---------------------+
| 2020-03-09 15:26:50 |
+---------------------+
mysql> SELECT Date(Now());
+-------------+
| Date(Now()) |
+-------------+
| 2020-03-09 |
+-------------+
mysql> SELECT Time(Now()) AS time;
+----------+
| time |
+----------+
| 15:29:05 |
+----------+
數(shù)值處理函數(shù)
| 常用數(shù)值處理函數(shù) | 說(shuō)明 |
|---|---|
| Abs() | 返回一個(gè)數(shù)的絕對(duì)值 |
| Cos() | 返回一個(gè)角度的余弦 |
| Exp() | 返回一個(gè)數(shù)的指數(shù)值 |
| Mod() | 返回除操作的余數(shù) |
| Pi() | 返回圓周率 |
| Rand() | 返回一個(gè)隨機(jī)數(shù) |
| Sin() | 返回一個(gè)角度的正弦 |
| Sqrt() | 返回一個(gè)數(shù)的平方根 |
| Tan() | 返回一個(gè)角度的正切 |
mysql> SELECT Abs(-23);
+----------+
| Abs(-23) |
+----------+
| 23 |
+----------+
mysql> SELECT Sqrt(64);
+----------+
| Sqrt(64) |
+----------+
| 8 |
+----------+
匯 總 數(shù) 據(jù)
-
聚集函數(shù)
| SQL聚集函數(shù) | 說(shuō)明 |
|---|---|
| AVG() | 返回某列的平均值 |
| COUNT() | 返回某列的行數(shù) |
| MAX() | 返回某列的最大值 |
| MIN() | 返回某列的最小值 |
| SUM() | 返回某列值之和 |
聚集函數(shù)(aggregate function)運(yùn)行在行組上,計(jì)算和返回單個(gè)值的函數(shù)。
mysql> SELECT price FROM good;
+-------+
| price |
+-------+
| 3.60 |
| 5.40 |
| 12.50 |
+-------+
mysql> SELECT Count(*), Avg(price), Max(price), Min(price), Sum(price) FROM good;
+----------+------------+------------+------------+------------+
| Count(*) | Avg(price) | Max(price) | Min(price) | Sum(price) |
+----------+------------+------------+------------+------------+
| 3 | 7.166667 | 12.50 | 3.60 | 21.50 |
+----------+------------+------------+------------+------------+
分 組 數(shù) 據(jù)
-
GROUP BY分組
根據(jù)年齡分組,并統(tǒng)計(jì)每個(gè)年齡的用戶數(shù)量。
mysql> SELECT age, COUNT(*) FROM user GROUP BY age;
+------+----------+
| age | COUNT(*) |
+------+----------+
| 12 | 4 |
| 16 | 3 |
| 18 | 2 |
| NULL | 1 |
| 23 | 1 |
| 15 | 1 |
| 22 | 1 |
| 13 | 1 |
| 31 | 3 |
| 11 | 1 |
| 42 | 3 |
| 32 | 1 |
+------+----------+
-
HAVING 過(guò)濾分組
mysql> SELECT age, Count(*) AS num FROM user
-> WHERE age IS NOT NULL
-> GROUP BY age
-> HAVING num > 1;
+------+-----+
| age | num |
+------+-----+
| 12 | 4 |
| 16 | 3 |
| 18 | 2 |
| 31 | 3 |
| 42 | 3 |
+------+-----+
1、HAVING 支持所有 WHERE 操作符。
2、HAVING 和 WHERE 的差別 這里有另一種理解方法, WHERE 在數(shù)據(jù)
分組前進(jìn)行過(guò)濾, HAVING 在數(shù)據(jù)分組后進(jìn)行過(guò)濾。
-
分組和排序
mysql> SELECT * FROM good;
+----+--------+------+-------+
| id | name | num | price |
+----+--------+------+-------+
| 1 | 蘋果 | 4 | 3.60 |
| 2 | 香蕉 | 5 | 5.40 |
| 3 | 西瓜 | 20 | 12.50 |
| 4 | 蘋果 | 10 | 3.60 |
| 5 | 桃子 | 6 | 1.50 |
| 6 | 香蕉 | 3 | 5.40 |
+----+--------+------+-------+
mysql> SELECT name, Sum(num) AS total_num, Sum(num * price) AS total_price FROM good
-> GROUP BY name
-> ORDER BY total_price;
+--------+-----------+-------------+
| name | total_num | total_price |
+--------+-----------+-------------+
| 桃子 | 6 | 9.00 |
| 香蕉 | 8 | 43.20 |
| 蘋果 | 14 | 50.40 |
| 西瓜 | 20 | 250.00 |
+--------+-----------+-------------+
-
使用子查詢
SQL允許創(chuàng)建子查詢(subquery),即嵌套在其他查詢中的查詢。
創(chuàng)建兩個(gè)表sys_user和sys_role。
mysql> SELECT * FROM sys_user;
+----+---------+--------+----------+
| id | role_id | name | password |
+----+---------+--------+----------+
| 1 | 1 | 小明 | 123 |
| 2 | 2 | 小李 | 1234 |
| 3 | 2 | 小麗 | 1223 |
| 4 | 3 | 小龍 | 123 |
| 5 | 3 | 小芬 | 123 |
+----+---------+--------+----------+
mysql> SELECT * FROM sys_role;
+----+-----------------+
| id | name |
+----+-----------------+
| 1 | 超級(jí)管理員 |
| 2 | 管理員 |
| 3 | 普通用戶 |
+----+-----------------+
若我們需要查找角色是超級(jí)管理員或管理員的用戶,需要執(zhí)行以下操作。
mysql> SELECT id AS role_id FROM sys_role WHERE name = '超級(jí)管理員' OR name = '管理員';
+---------+
| role_id |
+---------+
| 1 |
| 2 |
+---------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM sys_user WHERE role_id in (1, 2);
+----+---------+--------+----------+
| id | role_id | name | password |
+----+---------+--------+----------+
| 1 | 1 | 小明 | 123 |
| 2 | 2 | 小李 | 1234 |
| 3 | 2 | 小麗 | 1223 |
+----+---------+--------+----------+
但其實(shí),我們可以利用子查詢一步完成。
mysql> SELECT * FROM sys_user WHERE role_id IN
->(SELECT id FROM sys_role WHERE name = '超級(jí)管理員' OR name = '管理員');
+----+---------+--------+----------+
| id | role_id | name | password |
+----+---------+--------+----------+
| 1 | 1 | 小明 | 123 |
| 2 | 2 | 小李 | 1234 |
| 3 | 2 | 小麗 | 1223 |
+----+---------+--------+----------+
-
作為計(jì)算字段使用子查詢
mysql> SELECT name, password,
-> (SELECT r.name FROM sys_role r WHERE sys_user.role_id = r.id) AS role_name
->FROM sys_user;
+--------+----------+-----------------+
| name | password | role_name |
+--------+----------+-----------------+
| 小明 | 123 | 超級(jí)管理員 |
| 小李 | 1234 | 管理員 |
| 小麗 | 1223 | 管理員 |
| 小龍 | 123 | 普通用戶 |
| 小芬 | 123 | 普通用戶 |
+--------+----------+-----------------+
聯(lián)結(jié)
-
關(guān)系表
要理解關(guān)系表需要看下面這個(gè)例子。
假如有一個(gè)包含產(chǎn)品目錄的數(shù)據(jù)庫(kù)表,其中每種類別的物品占一行。對(duì)于每種物品要存儲(chǔ)的信息包括產(chǎn)品描述和價(jià)格,以及生產(chǎn)該產(chǎn)品的供應(yīng)商信息。假如有多種物品由同一供應(yīng)商生產(chǎn)。那么在設(shè)計(jì)上通常將產(chǎn)品信息與供應(yīng)商信息分開(kāi)。理由如下:
1、 因?yàn)橥还?yīng)商生產(chǎn)的每個(gè)產(chǎn)品的供應(yīng)商信息都是相同的,對(duì)每個(gè)產(chǎn)品重復(fù)此信息既浪費(fèi)時(shí)間又浪費(fèi)存儲(chǔ)空間。
2、如果供應(yīng)商信息改變(例如,供應(yīng)商搬家或電話號(hào)碼變動(dòng)),只需改動(dòng)一次即可。
3、如果有重復(fù)數(shù)據(jù)(即每種產(chǎn)品都存儲(chǔ)供應(yīng)商信息),很難保證每次輸入該數(shù)據(jù)的方式都相同。不一致的數(shù)據(jù)在報(bào)表中很難利用。
在這個(gè)例子中,可建立兩個(gè)表,一個(gè)存儲(chǔ)供應(yīng)商信息(vendor),另一個(gè)存儲(chǔ)產(chǎn)品信息(product)。vendor表存儲(chǔ)供應(yīng)商基本信息,而product只需存儲(chǔ)對(duì)應(yīng)vendor表的主鍵即可,這個(gè)主鍵又叫product的外鍵。
外鍵(foreign key) 外鍵為某個(gè)表中的一列,它包含另一個(gè)表的主鍵值,定義了兩個(gè)表之間的關(guān)系。
聯(lián)結(jié) 。簡(jiǎn)單地說(shuō),聯(lián)結(jié)是一種機(jī)制,用來(lái)在一條 SELECT語(yǔ)句中關(guān)聯(lián)表,檢索出多個(gè)表的數(shù)據(jù)。
mysql> SELECT * FROM product;
+----+---------+-----------------+------------+-------+
| id | vend_id | name | valid_date | price |
+----+---------+-----------------+------------+-------+
| 1 | 1 | 旺旺碎冰冰 | 2020-03-20 | 1.50 |
| 2 | 1 | 旺仔牛奶 | 2020-03-26 | 2.50 |
| 3 | 1 | 旺仔QQ糖 | 2020-03-11 | 4.00 |
| 4 | 2 | 可口可樂(lè) | 2020-03-18 | 3.00 |
| 5 | NULL | 糖果 | NULL | 12.00 |
| 6 | NULL | 餅干 | NULL | 23.00 |
+----+---------+-----------------+------------+-------+
mysql> SELECT * FROM vendor;
+----+--------------+-----------------------+--------+
| id | name | address | phone |
+----+--------------+-----------------------+--------+
| 1 | 旺旺 | 旺旺制造廠 | 123456 |
| 2 | 可口可樂(lè) | 可口可樂(lè)制造廠 | 123456 |
| 3 | 百事可樂(lè) | 百事可樂(lè)制造廠 | 123456 |
| 4 | 蒙牛 | 蒙牛牛奶制造廠 | 123456 |
+----+--------------+-----------------------+--------+
mysql> SELECT v.name AS vend_name, p.name AS prod_name, p.price AS prod_price
->FROM vendor v, product p
-> WHERE v.id = p.vend_id
-> ORDER BY vend_name, prod_name;
+--------------+-----------------+------------+
| vend_name | prod_name | prod_price |
+--------------+-----------------+------------+
| 可口可樂(lè) | 可口可樂(lè) | 3.00 |
| 旺旺 | 旺仔QQ糖 | 4.00 |
| 旺旺 | 旺仔牛奶 | 2.50 |
| 旺旺 | 旺旺碎冰冰 | 1.50 |
+--------------+-----------------+------------+
WHERE子句的重要性 在聯(lián)結(jié)兩個(gè)表時(shí),你實(shí)際上做的是將第一個(gè)表中的每一行與第二個(gè)表中的每一行配對(duì)。 WHERE 子句作為過(guò)濾條件,它只包含那些匹配給定條件(這里是聯(lián)結(jié)條件)的行。沒(méi)有WHERE 子句,第一個(gè)表中的每個(gè)行將與第二個(gè)表中的每個(gè)行配對(duì),而不管它們邏輯上是否可以配在一起。
-
內(nèi)部聯(lián)結(jié)
前面的例子為等值聯(lián)結(jié)(equijoin),它基于兩個(gè)表之間的相等測(cè)試。這種聯(lián)結(jié)也稱為內(nèi)部聯(lián)結(jié)。對(duì)于這種聯(lián)結(jié)可以使用稍微不同的語(yǔ)法來(lái)明確指定聯(lián)結(jié)的類型。
mysql> SELECT v.name AS vend_name, p.name AS prod_name, p.price AS prod_price
-> FROM product
-> p INNER JOIN vendor v ON p.vend_id = v.id
-> ORDER BY vend_name, prod_name;
+--------------+-----------------+------------+
| vend_name | prod_name | prod_price |
+--------------+-----------------+------------+
| 可口可樂(lè) | 可口可樂(lè) | 3.00 |
| 旺旺 | 旺仔QQ糖 | 4.00 |
| 旺旺 | 旺仔牛奶 | 2.50 |
| 旺旺 | 旺旺碎冰冰 | 1.50 |
+--------------+-----------------+------------+
使用哪種語(yǔ)法 ANSI SQL規(guī)范首選 INNER JOIN 語(yǔ)法。
-
內(nèi)連接與外連接

1、INNER JOIN
內(nèi)連接INNER JOIN是最常用的連接操作。從數(shù)學(xué)的角度講就是求兩個(gè)表的交集,從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄。

mysql> SELECT p.*, v.name AS vend_name, v.address AS vend_address, v.phone asvend_phone
-> FROM product p INNER JOIN vendor v
-> ON p.vend_id = v.id;
+----+---------+-----------------+------------+-------+--------------+-----------------------+--------------+
| id | vend_id | name | valid_date | price | vend_name | vend_address | asvend_phone |
+----+---------+-----------------+------------+-------+--------------+-----------------------+--------------+
| 1 | 1 | 旺旺碎冰冰 | 2020-03-20 | 1.50 | 旺旺 | 旺旺制造廠 | 123456 |
| 2 | 1 | 旺仔牛奶 | 2020-03-26 | 2.50 | 旺旺 | 旺旺制造廠 | 123456 |
| 3 | 1 | 旺仔QQ糖 | 2020-03-11 | 4.00 | 旺旺 | 旺旺制造廠 | 123456 |
| 4 | 2 | 可口可樂(lè) | 2020-03-18 | 3.00 | 可口可樂(lè) | 可口可樂(lè)制造廠 | 123456 |
+----+---------+-----------------+------------+-------+--------------+-----------------------+--------------+
2、LEFT JOIN
左連接LEFT JOIN的含義就是求兩個(gè)表A表和B表的交集外加左表剩下的數(shù)據(jù)。依舊從笛卡爾積的角度講,就是先從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表A表中剩余的記錄。

mysql> SELECT p.*, v.name AS vend_name, v.address AS vend_address, v.phone asvend_phone
-> FROM product p LEFT JOIN vendor v
-> ON p.vend_id = v.id;
+----+---------+-----------------+------------+-------+--------------+-----------------------+--------------+
| id | vend_id | name | valid_date | price | vend_name | vend_address | asvend_phone |
+----+---------+-----------------+------------+-------+--------------+-----------------------+--------------+
| 1 | 1 | 旺旺碎冰冰 | 2020-03-20 | 1.50 | 旺旺 | 旺旺制造廠 | 123456 |
| 2 | 1 | 旺仔牛奶 | 2020-03-26 | 2.50 | 旺旺 | 旺旺制造廠 | 123456 |
| 3 | 1 | 旺仔QQ糖 | 2020-03-11 | 4.00 | 旺旺 | 旺旺制造廠 | 123456 |
| 4 | 2 | 可口可樂(lè) | 2020-03-18 | 3.00 | 可口可樂(lè) | 可口可樂(lè)制造廠 | 123456 |
| 5 | NULL | 糖果 | NULL | 12.00 | NULL | NULL | NULL |
| 6 | NULL | 餅干 | NULL | 23.00 | NULL | NULL | NULL |
+----+---------+-----------------+------------+-------+--------------+-----------------------+--------------+
注意后面兩條數(shù)據(jù)
RIGHT JOIN
同理右連接RIGHT JOIN就是求兩個(gè)表A和B表的交集外加右表B剩下的數(shù)據(jù)。再次從笛卡爾積的角度描述,右連接就是從笛卡爾積中挑出ON子句條件成立的記錄,然后加上右表中剩余的記錄。

mysql> SELECT p.*, v.name AS vend_name, v.address AS vend_address, v.phone asvend_phone
-> FROM product p RIGHT JOIN vendor v
-> ON p.vend_id = v.id;
+------+---------+-----------------+------------+-------+--------------+-----------------------+--------------+
| id | vend_id | name | valid_date | price | vend_name | vend_address | asvend_phone |
+------+---------+-----------------+------------+-------+--------------+-----------------------+--------------+
| 1 | 1 | 旺旺碎冰冰 | 2020-03-20 | 1.50 | 旺旺 | 旺旺制造廠 | 123456 |
| 2 | 1 | 旺仔牛奶 | 2020-03-26 | 2.50 | 旺旺 | 旺旺制造廠 | 123456 |
| 3 | 1 | 旺仔QQ糖 | 2020-03-11 | 4.00 | 旺旺 | 旺旺制造廠 | 123456 |
| 4 | 2 | 可口可樂(lè) | 2020-03-18 | 3.00 | 可口可樂(lè) | 可口可樂(lè)制造廠 | 123456 |
| NULL | NULL | NULL | NULL | NULL | 百事可樂(lè) | 百事可樂(lè)制造廠 | 123456 |
| NULL | NULL | NULL | NULL | NULL | 蒙牛 | 蒙牛牛奶制造廠 | 123456 |
+------+---------+-----------------+------------+-------+--------------+-----------------------+--------------+
組合查詢
MySQL允許執(zhí)行多個(gè)查詢(多條 SELECT 語(yǔ)句),并將結(jié)果作為單個(gè)查詢結(jié)果集返回。這些組合查詢通常稱為并(union)。
下面語(yǔ)句等同于SELECT * FROM product WHERE vend_id = 1 OR price > 3。
mysql> SELECT * FROM product WHERE vend_id = 1
-> UNION
-> SELECT * FROM product WHERE price > 3;
+----+---------+-----------------+------------+-------+
| id | vend_id | name | valid_date | price |
+----+---------+-----------------+------------+-------+
| 1 | 1 | 旺旺碎冰冰 | 2020-03-20 | 1.50 |
| 2 | 1 | 旺仔牛奶 | 2020-03-26 | 2.50 |
| 3 | 1 | 旺仔QQ糖 | 2020-03-11 | 4.00 |
| 5 | NULL | 糖果 | NULL | 12.00 |
| 6 | NULL | 餅干 | NULL | 23.00 |
+----+---------+-----------------+------------+-------+
插 入 數(shù) 據(jù)
-
插入完整的行
mysql> INSERT INTO product VALUES(NULL, NULL, '蘋果', CurDate(), 5.8);
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO product(name, valid_date, price) VALUES('西瓜', CurDate(), 12.8);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM product;
+----+---------+-----------------+------------+-------+
| id | vend_id | name | valid_date | price |
+----+---------+-----------------+------------+-------+
| 1 | 1 | 旺旺碎冰冰 | 2020-03-20 | 1.50 |
| 2 | 1 | 旺仔牛奶 | 2020-03-26 | 2.50 |
| 3 | 1 | 旺仔QQ糖 | 2020-03-11 | 4.00 |
| 4 | 2 | 可口可樂(lè) | 2020-03-18 | 3.00 |
| 5 | NULL | 糖果 | NULL | 12.00 |
| 6 | NULL | 餅干 | NULL | 23.00 |
| 7 | NULL | 蘋果 | 2020-03-10 | 5.80 |
| 9 | NULL | 西瓜 | 2020-03-10 | 12.80 |
+----+---------+-----------------+------------+-------+
若沒(méi)有沒(méi)有限定字段(如第一個(gè)例子),需要在VALUES對(duì)每個(gè)字段賦值,并且需要按表結(jié)構(gòu)中字段的順序賦值。若沒(méi)有值,則為NULL,其中id是自增長(zhǎng)的,所以我們也賦值NULL。
第二個(gè)例子在表名后的括號(hào)里明確地給出了列名。這種做法的優(yōu)點(diǎn)是,即使表的結(jié)構(gòu)順序改變,此 INSERT 語(yǔ)句仍然能正確工作。
-
插入多個(gè)行
mysql> INSERT INTO product(name, valid_date, price)
-> VALUES('香蕉', CurDate(), 3.5),
-> ('桃子', CurDate(), 4.5);
Query OK, 2 rows affected (0.05 sec)
更新和刪除數(shù)據(jù)
-
更新數(shù)據(jù)
mysql> SELECT * FROM product;;
+----+---------+-----------------+------------+-------+
| id | vend_id | name | valid_date | price |
+----+---------+-----------------+------------+-------+
| 1 | 1 | 旺旺碎冰冰 | 2020-03-20 | 1.50 |
| 2 | 1 | 旺仔牛奶 | 2020-03-26 | 2.50 |
| 3 | 1 | 旺仔QQ糖 | 2020-03-11 | 4.00 |
| 4 | 2 | 可口可樂(lè) | 2020-03-18 | 3.00 |
| 5 | NULL | 糖果 | NULL | 12.00 |
| 6 | NULL | 餅干 | NULL | 23.00 |
| 7 | NULL | 蘋果 | 2020-03-10 | 5.80 |
| 9 | NULL | 西瓜 | 2020-03-10 | 12.80 |
| 10 | NULL | 香蕉 | 2020-03-10 | 3.50 |
| 11 | NULL | 桃子 | 2020-03-10 | 4.50 |
+----+---------+-----------------+------------+-------+
mysql> UPDATE product SET valid_date = Date('2024-01-19'), price = 6.66 WHERE name = '桃子';
mysql> SELECT * FROM product WHERE name = '桃子';
+----+---------+--------+------------+-------+
| id | vend_id | name | valid_date | price |
+----+---------+--------+------------+-------+
| 11 | NULL | 桃子 | 2024-01-19 | 6.66 |
+----+---------+--------+------------+-------+
IGNORE 關(guān)鍵字 如果用 UPDATE 語(yǔ)句更新多行,并且在更新這些
行中的一行或多行時(shí)出一個(gè)現(xiàn)錯(cuò)誤,則整個(gè) UPDATE 操作被取消
(錯(cuò)誤發(fā)生前更新的所有行被恢復(fù)到它們?cè)瓉?lái)的值)。INSERT和DELETE也生效。
-
刪除數(shù)據(jù)
mysql> DELETE FROM product WHERE name = '蘋果';
Query OK, 1 row affected (0.00 sec)
創(chuàng)建和操作表
-
創(chuàng)建表
NOT NULL:插入時(shí)字段不能為空。
DEFULT:指定默認(rèn)值。
PRIMARY KEY:指定主鍵。
AUTO_INCREMENT:自增長(zhǎng)
ENGINE = InnoDB:指定InnoDB引擎創(chuàng)建和管理表。
mysql> CREATE TABLE customer
-> (
-> id int NOT NULL AUTO_INCREMENT,
-> username varchar(255) NOT NULL,
-> real_name varchar(255) NOT NULL,
-> email varchar(100),
-> salary decimal(10, 2),
-> state int NOT NULL DEFAULT 1,
-> PRIMARY KEY(id, username)
-> ) ENGINE = InnoDB;
以下是幾個(gè)需要知道的引擎:
1、InnoDB 是一個(gè)可靠的事務(wù)處理引擎,它不支持全文本搜索;
2、MEMORY 在功能等同于 MyISAM ,但由于數(shù)據(jù)存儲(chǔ)在內(nèi)存(不是磁盤)中,速度很快(特別適合于臨時(shí)表);
3、MyISAM 是一個(gè)性能極高的引擎,它支持全文本搜索,但不支持事務(wù)處理。
-
更新表
第一個(gè)例子為表添加字段。
第二個(gè)例子刪除新增的字段。
mysql> ALTER TABLE customer ADD COLUMN phone char(10);
mysql> ALTER TABLE customer DROP COLUMN phone;
小心使用 ALTER TABLE 使用 ALTER TABLE 要極為小心,應(yīng)該在進(jìn)行改動(dòng)前做一個(gè)完整的備份(模式和數(shù)據(jù)的備份)。數(shù)據(jù)庫(kù)表的更改不能撤銷,如果增加了不需要的列,可能不能刪除它們。類似地,如果刪除了不應(yīng)該刪除的列,可能會(huì)丟失該列中的所有數(shù)據(jù)。
-
刪除表
mysql> DROP TABLE good;
-
重命名表
mysql> RENAME TABLE customer TO customer2;