目錄
- 前言
- 準備
- 插入資料
- 語法格式
- 插入完整行資料
- 插入多行資料
- 將檢索出來的資料插入表
- 更新資料
- 準備兩張表
- 語法
- 實踐操作
- 洗掉資料
- 語法
- 實踐操作
- 小結
前言
前面的兩篇文章中,我們已經對MySQL有了基本了解,
并且知道了怎么用工具連接資料庫?怎么創建資料庫?怎么創建表?
這一篇呢我們就來看看怎么在我們創建的表中插入資料、洗掉資料和修改資料,也就是上一篇文章中提到的DML 資料操作語言
準備
根據上一章所說的,我們創建一個db_xiezhr 資料庫,并向資料庫中添加一張用戶資訊表,
① 通過命令列建庫,建表
mysql> create database if not exists db_xiezhr;
Query OK, 1 row affected (0.00 sec)
mysql> use db_xiezhr
Database changed
mysql> drop table if exists user_profile;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE TABLE `user_profile`
(`id` int NOT NULL,
`device_id` int NOT NULL,
`user_name` varchar(100) NOT NULL ,
`gender` varchar(14) NOT NULL,
`age` int ,
`user_email` varchar(50) ,
`user_zip` varchar(10),
`university` varchar(32) NOT NULL,
`province` varchar(32) NOT NULL,);
Query OK, 0 rows affected (0.01 sec)
② 當然了,我們可以通過上一篇文章中說到的工具之一建庫、建表
這里以sqlyog工具為例,建立db_xiezhr資料庫,并創建用user_profile戶資訊表
- 建立db_xiezhr資料庫


- 創建用user_profile戶資訊表


以上,我們資料庫和資料表就都已經創建成功了
插入資料
語法格式
#方式一:
INSERT INTO 表名 VALUES(值,...);
#方式二:
INSERT INTO 表名(欄位名,...) VALUES(值,...);
#方式三:
INSERT INTO 表名(欄位名,...) SELECT (欄位名,...) FROM 表名;
插入完整行資料
①簡單寫法
- 存盤到每個里表中的資料在VALUES子句中給出,值得順序也必須要與定義時候的欄位順序一致,沒有的值需要使用NULL,
- 這種寫法簡單,但并不安全,應盡量避免使用,一旦表結構變化了,可能就會出問題
# 向user_profile用戶資訊表中添加一條資料
insert into user_profile
values(
1,
1,
'張三',
'male',
'28',
null,
null,
'北京大學',
'BeiJing'
);
② 安全寫法
- 跟上面簡單寫法效果一樣,往用戶資訊表中插入一條資料
- 在表名后括號中明確給出了列名,在插入資料時,將用VALUES串列中的相應值填入對應的列名中,第一個列名對應第一個值,第二個列名對應第二個值......
- 因為提供了列名,所以值也不需要按照表中的次序來插入,即使表結構變化了,sql陳述句也能正常執行,
- 不需要插入的列user_email和user_zip 列,值也可以不用寫出來了,也比較靈活
INSERT INTO `db_xiezhr`.`user_profile` (
`id`,
`device_id`,
`user_name`,
`gender`,
`age`,
`university`,
`province`
)
VALUES
(
1,
1,
'張三',
'male',
'28',
'北京大學',
'BeiJing'
) ;
注:
- 不管使用哪種insert語法,都必須給出values的正確數目,
- 如果不提供列名,則必須給每個列都提供一個值
- 如果提供列名,則必須對每個寫出的列提供一個值
- 在insert語法中省略某列時,需要具備兩個條件,一是該列被定義為允許NULL值二是表定義中給出了默認值
插入多行資料
這里你可能說我多寫幾條sql陳述句不就可以了么,哈哈,這也可以實作了么?
INSERT INTO `user_profile` (
`id`,
`device_id`,
`user_name`,
`gender`,
`age`,
`university`,
`province`
)
VALUES
(
2,
2,
'李四',
'male',
'36',
'天津大學',
'TianJin'
) ;
INSERT INTO `user_profile` (
`id`,
`device_id`,
`user_name`,
`gender`,
`age`,
`university`,
`province`
)
VALUES
(
3,
3,
'王五',
'female',
'25',
'天津大學',
'TianJin'
) ;
但這里提供另一種語法,一條陳述句就可以完成
INSERT INTO `user_profile` (
`id`,
`device_id`,
`user_name`,
`gender`,
`age`,
`university`,
`province`
)
VALUES
(
2,
2,
'李四',
'male',
'36',
'天津大學',
'TianJin'
),
(
3,
3,
'王五',
'female',
'25',
'天津大學',
'TianJin'
) ;
將檢索出來的資料插入表
這里有兩張表,一張是user_profile,資料如下

一張表是tmp_user_profile,資料如下

我們需要將tmp_user_profile 表中資料插入到user_profile 表中,可以通過如下腳本實作
INSERT INTO `user_profile` (
`id`,
`device_id`,
`user_name`,
`gender`,
`age`,
`university`,
`province`
)
SELECT
`id`,
`device_id`,
`user_name`,
`gender`,
`age`,
`university`,
`province`
FROM tmp_user_profile;
執行完上面腳本后,user_profile表中資料

更新資料
準備兩張表
- 下面我們建兩張表,一張表為 product 表,用來存放產品資訊,其中有產品價格欄位 saleprice;另外一張表是 product_price 表,
# 產品資訊表product
mysql> select * from product;
+----+-----------+--------------------------------------------+-----------+--------+
| id | productid | productname | saleprice | author |
+----+-----------+--------------------------------------------+-----------+--------+
| 1 | 10001 | 公眾號XiezhrSpace【Oralce從入門到放棄】 | 100 | xiezhr |
| 2 | 10002 | 公眾號XiezhrSpace【MySQL從入門到放棄】 | 99 | xiezhr |
| 3 | 10003 | 公眾號XiezhrSpace【快速上手Linux核心命令】 | 88 | xiezhr |
| 4 | 10004 | 公眾號XiezhrSpace【Java從入門到精通】 | 150 | xiezhr |
| 5 | 10005 | 公眾號XiezhrSpace【Idea從入門到上癮】 | 200 | xiezhr |
| 6 | 10006 | 公眾號XiezhrSpace【如何快速搭建個人博客】 | 120 | xiezhr |
+----+-----------+--------------------------------------------+-----------+--------+
6 rows in set (0.02 sec)
# 產品價格表product_price
mysql> select * from product_price;
+----+-----------+-------+
| id | productid | price |
+----+-----------+-------+
| 1 | 10001 | NULL |
| 2 | 10002 | NULL |
| 3 | 10003 | NULL |
| 4 | 10004 | NULL |
| 5 | 10005 | NULL |
| 6 | 1006 | NULL |
+----+-----------+-------+
6 rows in set (0.00 sec)
語法
# 1、單表更新
UPDATE 表名 SET 列 = 值,... WHERE 查詢條件;
# 2、根據一張表更新另一張表
# ① 使用update
UPDATE
表1 別名,
表2 別名
SET
列 = 值,
...
WHERE 連接條件 AND 篩選條件 ;
# ②通過INNER JOIN
UPDATE
表1 別名
INNER JOIN 表2 別名
ON 連接條件 AND 篩選條件
SET
列 = 值,
...;
# ③ 通過LEFT JOIN
UPDATE
表1 別名
LEFT JOIN 表2 別名
ON 連接條件 AND 篩選條件
SET
列 = 值,
...;
# ③ 通過子查詢
UPDATE
表2 別名
SET 列 = (SELECT 運算式 FROM 表1 WHERE 連接條件 AND 篩選條件);
# 2、同時更新兩張表
UPDATE
表1
INNER JOIN 表2
ON 連接條件 AND 篩選條件
SET 表1.列=值1,
表2.列=值2;
實踐操作
① 將產品資訊表product 中10001 號產品價格更新為999
mysql> UPDATE product t SET t.`saleprice` =999 WHERE t.`productid` = '10001';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from product;
+----+-----------+--------------------------------------------+-----------+--------+
| id | productid | productname | saleprice | author |
+----+-----------+--------------------------------------------+-----------+--------+
| 1 | 10001 | 公眾號XiezhrSpace【Oralce從入門到放棄】 | 999 | xiezhr |
| 2 | 10002 | 公眾號XiezhrSpace【MySQL從入門到放棄】 | 99 | xiezhr |
| 3 | 10003 | 公眾號XiezhrSpace【快速上手Linux核心命令】 | 88 | xiezhr |
| 4 | 10004 | 公眾號XiezhrSpace【Java從入門到精通】 | 150 | xiezhr |
| 5 | 10005 | 公眾號XiezhrSpace【Idea從入門到上癮】 | 200 | xiezhr |
| 6 | 10006 | 公眾號XiezhrSpace【如何快速搭建個人博客】 | 120 | xiezhr |
+----+-----------+--------------------------------------------+-----------+--------+
6 rows in set (0.00 sec)
② 將 product_price 表中的價格欄位 price 更新為 product 表中價格欄位 price 的 80%,
# 使用“UPDATE table1 t1,table2,...,table n”的方式來多表更新
mysql> UPDATE product t1, product_price t2 SET t2.price = t1.`saleprice` * 0.8 WHERE t1.productid= t2.productId;
Query OK, 5 rows affected, 2 warnings (0.01 sec)
Rows matched: 5 Changed: 5 Warnings: 2
mysql> select * from product_price;
+----+-----------+-------+
| id | productid | price |
+----+-----------+-------+
| 1 | 10001 | 80 |
| 2 | 10002 | 79 |
| 3 | 10003 | 70 |
| 4 | 10004 | 120 |
| 5 | 10005 | 160 |
| 6 | 1006 | NULL |
+----+-----------+-------+
6 rows in set (0.00 sec)
# 通過INNER JOIN
mysql> select * from product_price;
+----+-----------+-------+
| id | productid | price |
+----+-----------+-------+
| 1 | 10001 | 80 |
| 2 | 10002 | 79 |
| 3 | 10003 | 70 |
| 4 | 10004 | 120 |
| 5 | 10005 | 160 |
| 6 | 1006 | NULL |
+----+-----------+-------+
6 rows in set (0.00 sec)
# 通過LEFT JOIN
mysql> UPDATE product t1 LEFT JOIN product_price t2 ON t1.productid= t2.productid SET t2.price = t1.`saleprice` * 0.8 WHERE t1.productid='10001';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from product_price;
+----+-----------+-------+
| id | productid | price |
+----+-----------+-------+
| 1 | 10001 | 80 |
| 2 | 10002 | NULL |
| 3 | 10003 | NULL |
| 4 | 10004 | NULL |
| 5 | 10005 | NULL |
| 6 | 1006 | NULL |
+----+-----------+-------+
6 rows in set (0.00 sec)
# 通過子查詢
mysql> UPDATE product_price t2 SET t2.price=(SELECT t1.`saleprice` *0.8 FROM product t1 WHERE t1.productid = t2.productid);
Query OK, 5 rows affected, 2 warnings (0.01 sec)
Rows matched: 6 Changed: 5 Warnings: 2
mysql> select * from product_price;
+----+-----------+-------+
| id | productid | price |
+----+-----------+-------+
| 1 | 10001 | 80 |
| 2 | 10002 | 79 |
| 3 | 10003 | 70 |
| 4 | 10004 | 120 |
| 5 | 10005 | 160 |
| 6 | 1006 | NULL |
+----+-----------+-------+
6 rows in set (0.00 sec)
③ 同時更新兩張表(正式開發中用得比較少)
- 兩張表做關聯,同時更新了 product_price 表的 price 欄位和 product 表的 author兩個欄位,
mysql> UPDATE product t1 INNER JOIN product_price t2 ON t1.productid= t2.productid SET t2.price = t1.`saleprice` * 0.8, t1.`author` = 'xiezhr001';
Query OK, 5 rows affected, 2 warnings (0.00 sec)
Rows matched: 10 Changed: 5 Warnings: 2
mysql> select * from product;
+----+-----------+--------------------------------------------+-----------+-----------+
| id | productid | productname | saleprice | author |
+----+-----------+--------------------------------------------+-----------+-----------+
| 1 | 10001 | 公眾號XiezhrSpace【Oralce從入門到放棄】 | 100 | xiezhr001 |
| 2 | 10002 | 公眾號XiezhrSpace【MySQL從入門到放棄】 | 99 | xiezhr001 |
| 3 | 10003 | 公眾號XiezhrSpace【快速上手Linux核心命令】 | 88 | xiezhr001 |
| 4 | 10004 | 公眾號XiezhrSpace【Java從入門到精通】 | 150 | xiezhr001 |
| 5 | 10005 | 公眾號XiezhrSpace【Idea從入門到上癮】 | 200 | xiezhr001 |
| 6 | 10006 | 公眾號XiezhrSpace【如何快速搭建個人博客】 | 120 | xiezhr |
+----+-----------+--------------------------------------------+-----------+-----------+
6 rows in set (0.00 sec)
mysql> select * from product_price;
+----+-----------+-------+
| id | productid | price |
+----+-----------+-------+
| 1 | 10001 | 80 |
| 2 | 10002 | 79 |
| 3 | 10003 | 70 |
| 4 | 10004 | 120 |
| 5 | 10005 | 160 |
| 6 | 1006 | NULL |
+----+-----------+-------+
6 rows in set (0.00 sec)
洗掉資料
語法
# 1、單表洗掉
DELETE FROM 表名 【WHERE 篩選條件 】;
# 2、多表洗掉(級聯洗掉)
① 關聯洗掉
DELETE
表1的別名,
表2的別名
FROM
表1 別名,
表2 別名
WHERE 連接條件 AND 篩選條件 ;
② 內連接、左右連接洗掉
DELETE
表1的別名,
表2的別名
FROM
表1 別名
INNER | LEFT | RIGHT JOIN 表2 別名 ON 連接條件
WHERE 篩選條件 ;
實踐操作
① 單表洗掉
# 洗掉產品id為10005的產品資訊
mysql> select * from product;
+----+-----------+--------------------------------------------+-----------+-----------+
| id | productid | productname | saleprice | author |
+----+-----------+--------------------------------------------+-----------+-----------+
| 1 | 10001 | 公眾號XiezhrSpace【Oralce從入門到放棄】 | 100 | xiezhr001 |
| 2 | 10002 | 公眾號XiezhrSpace【MySQL從入門到放棄】 | 99 | xiezhr001 |
| 3 | 10003 | 公眾號XiezhrSpace【快速上手Linux核心命令】 | 88 | xiezhr001 |
| 4 | 10004 | 公眾號XiezhrSpace【Java從入門到精通】 | 150 | xiezhr001 |
| 5 | 10005 | 公眾號XiezhrSpace【Idea從入門到上癮】 | 200 | xiezhr001 |
| 6 | 10006 | 公眾號XiezhrSpace【如何快速搭建個人博客】 | 120 | xiezhr |
+----+-----------+--------------------------------------------+-----------+-----------+
6 rows in set (0.00 sec)
mysql> delete from product where productid = '10005';
Query OK, 1 row affected (0.02 sec)
mysql> select * from product;
+----+-----------+--------------------------------------------+-----------+-----------+
| id | productid | productname | saleprice | author |
+----+-----------+--------------------------------------------+-----------+-----------+
| 1 | 10001 | 公眾號XiezhrSpace【Oralce從入門到放棄】 | 100 | xiezhr001 |
| 2 | 10002 | 公眾號XiezhrSpace【MySQL從入門到放棄】 | 99 | xiezhr001 |
| 3 | 10003 | 公眾號XiezhrSpace【快速上手Linux核心命令】 | 88 | xiezhr001 |
| 4 | 10004 | 公眾號XiezhrSpace【Java從入門到精通】 | 150 | xiezhr001 |
| 6 | 10006 | 公眾號XiezhrSpace【如何快速搭建個人博客】 | 120 | xiezhr |
+----+-----------+--------------------------------------------+-----------+-----------+
5 rows in set (0.00 sec)
② 多表級聯洗掉
mysql> select * from product;
+----+-----------+--------------------------------------------+-----------+-----------+
| id | productid | productname | saleprice | author |
+----+-----------+--------------------------------------------+-----------+-----------+
| 1 | 10001 | 公眾號XiezhrSpace【Oralce從入門到放棄】 | 100 | xiezhr001 |
| 2 | 10002 | 公眾號XiezhrSpace【MySQL從入門到放棄】 | 99 | xiezhr001 |
| 3 | 10003 | 公眾號XiezhrSpace【快速上手Linux核心命令】 | 88 | xiezhr001 |
| 4 | 10004 | 公眾號XiezhrSpace【Java從入門到精通】 | 150 | xiezhr001 |
| 6 | 10006 | 公眾號XiezhrSpace【如何快速搭建個人博客】 | 120 | xiezhr |
+----+-----------+--------------------------------------------+-----------+-----------+
5 rows in set (0.00 sec)
mysql> select * from product_price;
+----+-----------+-------+
| id | productid | price |
+----+-----------+-------+
| 1 | 10001 | 80 |
| 2 | 10002 | 79 |
| 3 | 10003 | 70 |
| 4 | 10004 | 120 |
| 5 | 10005 | 160 |
| 6 | 1006 | NULL |
+----+-----------+-------+
6 rows in set (0.00 sec)
mysql> DELETE t1, t2 FROM product t1, product_price t2 WHERE t1.`productid` = t2.`productid` AND t1.`productid` = '10002';
Query OK, 2 rows affected (0.01 sec)
mysql> select * from product;
+----+-----------+--------------------------------------------+-----------+-----------+
| id | productid | productname | saleprice | author |
+----+-----------+--------------------------------------------+-----------+-----------+
| 1 | 10001 | 公眾號XiezhrSpace【Oralce從入門到放棄】 | 100 | xiezhr001 |
| 3 | 10003 | 公眾號XiezhrSpace【快速上手Linux核心命令】 | 88 | xiezhr001 |
| 4 | 10004 | 公眾號XiezhrSpace【Java從入門到精通】 | 150 | xiezhr001 |
| 6 | 10006 | 公眾號XiezhrSpace【如何快速搭建個人博客】 | 120 | xiezhr |
+----+-----------+--------------------------------------------+-----------+-----------+
4 rows in set (0.00 sec)
mysql> select * from product_price;
+----+-----------+-------+
| id | productid | price |
+----+-----------+-------+
| 1 | 10001 | 80 |
| 3 | 10003 | 70 |
| 4 | 10004 | 120 |
| 5 | 10005 | 160 |
| 6 | 1006 | NULL |
+----+-----------+-------+
5 rows in set (0.00 sec)
mysql> select * from product;
+----+-----------+--------------------------------------------+-----------+-----------+
| id | productid | productname | saleprice | author |
+----+-----------+--------------------------------------------+-----------+-----------+
| 1 | 10001 | 公眾號XiezhrSpace【Oralce從入門到放棄】 | 100 | xiezhr001 |
| 3 | 10003 | 公眾號XiezhrSpace【快速上手Linux核心命令】 | 88 | xiezhr001 |
| 4 | 10004 | 公眾號XiezhrSpace【Java從入門到精通】 | 150 | xiezhr001 |
| 6 | 10006 | 公眾號XiezhrSpace【如何快速搭建個人博客】 | 120 | xiezhr |
+----+-----------+--------------------------------------------+-----------+-----------+
4 rows in set (0.00 sec)
mysql> select * from product_price;
+----+-----------+-------+
| id | productid | price |
+----+-----------+-------+
| 1 | 10001 | 80 |
| 3 | 10003 | 70 |
| 4 | 10004 | 120 |
| 5 | 10005 | 160 |
| 6 | 1006 | NULL |
+----+-----------+-------+
5 rows in set (0.00 sec)
mysql> DELETE t1, t2 FROM product_price t2 INNER JOIN product t1 ON t1.`productid` = t2.`productid` WHERE t1.`productid` = '10003';
Query OK, 2 rows affected (0.01 sec)
mysql> select * from product;
+----+-----------+-------------------------------------------+-----------+-----------+
| id | productid | productname | saleprice | author |
+----+-----------+-------------------------------------------+-----------+-----------+
| 1 | 10001 | 公眾號XiezhrSpace【Oralce從入門到放棄】 | 100 | xiezhr001 |
| 4 | 10004 | 公眾號XiezhrSpace【Java從入門到精通】 | 150 | xiezhr001 |
| 6 | 10006 | 公眾號XiezhrSpace【如何快速搭建個人博客】 | 120 | xiezhr |
+----+-----------+-------------------------------------------+-----------+-----------+
3 rows in set (0.00 sec)
mysql> select * from product_price;
+----+-----------+-------+
| id | productid | price |
+----+-----------+-------+
| 1 | 10001 | 80 |
| 4 | 10004 | 120 |
| 5 | 10005 | 160 |
| 6 | 1006 | NULL |
+----+-----------+-------+
4 rows in set (0.00 sec)
小結
- 這篇文章主要說了MySQL中單表多表的增刪改,在update、delete 使用的時候一定要細心
- 除非打算更新洗掉表中所有資料,否則絕對不要使用不帶where子句的update或delete陳述句
- 保證每個表都有主鍵
- 在對update或delete陳述句使用where子句之前,先用select進行查詢測驗,保證過濾出來的記錄是正確的;
- update或delete陳述句執行前,盡量做好資料備份
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/551554.html
標籤:其他
上一篇:day09-達人探店
下一篇:返回列表
