MySQL必知必會(huì)2

創(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_usersys_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;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第三課: 排序檢索數(shù)據(jù) distinct關(guān)鍵字:distinct 列名1,列名2,列名3DISTINCT 關(guān)鍵字會(huì)...
    VictorBXv閱讀 1,621評(píng)論 0 8
  • 表 存儲(chǔ)在表中的數(shù)據(jù)是同一種類型的數(shù)據(jù)或清單。 數(shù)據(jù)庫(kù)中的表有為一個(gè)名字來(lái)標(biāo)識(shí)自己。 表具有一些特性,這些特性定義...
    蛐蛐囍閱讀 1,477評(píng)論 0 7
  • 讀完MySQL必知必會(huì)系列一,我們可以進(jìn)一步了解MySQL中的數(shù)據(jù)處理函數(shù),分組查詢,聯(lián)結(jié)表,以及組合查詢的相關(guān)內(nèi)...
    Eastboat閱讀 456評(píng)論 0 0
  • 數(shù)據(jù)庫(kù)入門 數(shù)據(jù)庫(kù): 保存有組織的數(shù)據(jù)的容器(通常是一個(gè)文件或一組文件).數(shù)據(jù)庫(kù)軟件應(yīng)該稱為 DBMS(DataB...
    Mjericho閱讀 580評(píng)論 0 0
  • 種下一棵百香果,來(lái)年收獲一樹(shù)的百香果。哦,不對(duì),是一藤的百香果,畢竟它是草質(zhì)藤本植物。 百香果又稱為雞蛋果,因?yàn)殚L(zhǎng)...
    沐子啾閱讀 581評(píng)論 6 3

友情鏈接更多精彩內(nèi)容