1. MySQL多表查詢 1.1 外鍵約束 為了消除多張表查詢出現的笛卡爾積的現象,MySQL在建表併進行多表之間的關鍵查詢可以使用外鍵關聯查詢。 外鍵:從表1(sub)的某列引用(ref)另外一個表2(main)的某列的值,把表1的這列叫做表2這列的外鍵。 1.2 外鍵的設置使用 比如上述最簡單的 ...
1. MySQL多表查詢
1.1 外鍵約束
為了消除多張表查詢出現的笛卡爾積的現象,MySQL在建表併進行多表之間的關鍵查詢可以使用外鍵關聯查詢。
外鍵:從表1(sub)的某列引用(ref)另外一個表2(main)的某列的值,把表1的這列叫做表2這列的外鍵。
1.2 外鍵的設置使用
比如上述最簡單的員工(employee)和部門表(department),設置外鍵dept_id與id相關聯。
步驟如下:
①在多方表中設置fk外鍵,使用外鍵dept_id關聯一方表中的主鍵id,並選擇好參考表;
②修改選項設置中的存儲引擎為InnoDB,支持設置外鍵操作;
註意:在MySQL中,InnoDB支持事務和外鍵.MyISAM 不支持事務和外鍵。
上述操作也可以使用SQL語句方式修改存儲引擎為InnDB:
ALTER TABLE 表名 ENGINE='InnoDB';
如在命令行界面輸入如下語句:
同樣使用SQL語句創建外鍵關聯:
ALTER TABLE employee ADD CONSTRAINT employee_fk(外鍵名) FOREIGN KEY (dept_id) REFERENCES dept(dept_id);
1.3 連接查詢分類
連接查詢總的分類可以用一張圖來簡單描述,主要分為外連接查詢(左外連接、右外連接、全連接)、內連接查詢(內連接、自連接)。
1.4 內連接查詢
內連接兩張表的情況如下圖,連接查詢得到的是兩張表的交集部分。
SQL語句寫法上可分為顯式和隱式寫法:
隱式內連接寫法:
select <selectList> From table1,table2 where table1.列 = table2.列;
顯式內連接寫法(推薦寫法):
select <selectList> From table1 [inner] join table2 on table1.列 = table2.列;
查詢實例:
說明:本例以下所有查詢以product、product_category、product_stock三張表為例;
①需求:查詢所有商品的名稱和分類名稱:
隱式寫法:
SELECT p.product_name, pc.category_name FROM product p, product_category pc WHERE p.category_id = pc.id;
顯式寫法:
SELECT p.product_name, pc.category_name FROM product p INNER JOIN product_category pc ON p.category_id = pc.id; SELECT p.product_name, pc.category_name FROM product p JOIN product_category pc ON p.category_id = pc.id;
②需求: 查詢貨品id,貨品名稱,貨品所屬分類名稱;
隱式寫法:
SELECT * FROM product p, product_category pc WHERE p.category_id = pc.id AND p.sale_price > 200 AND pc.category_name = '無線滑鼠';
顯式寫法:
SELECT * FROM product p JOIN product_category pc ON p.category_id = pc.id AND p.sale_price > 200 AND pc.category_name = '無線滑鼠';
1.5 外連接查詢
外連接查詢分為左外連接查詢和右外連接查詢。
左外連接:查詢出JOIN左邊表的全部數據與右表滿足ON條件的部分,JOIN右邊表不匹配的數據使用NULL來填充數據行。
右外連接:查詢出JOIN右邊表的全部數據與左表滿足ON條件的部分,JOIN左邊表不匹配的數據使用NULL來填充數據行。
語法格式:
select <selectList> from table1 left/right [outer] join table2 on table1.列 = table2.列;
查詢實例:
查詢每種商品名稱,分類的名稱和包含的具體商品總數(storeNum)
SELECT p.product_name, pc.category_name, IFNULL(ps.store_num,0) FROM product p LEFT JOIN product_category pc ON p.category_id = pc.id LEFT JOIN product_stock ps ON p.id = ps.product_id;
註:IFNULL(expr1,expr2)的使用是如果當前expr1為NULL,則顯示expr2的值。
1.6 自連接查詢
在特定的查詢場景下(商品分類、地區、許可權),需要設計將表中的數據進行分類或二級關聯時,可能會用到自連接查詢的表設計方法。
自連接方式:
查詢實例:
查詢每個商品分類的名稱和父分類名稱
#隱式寫法 SELECT pare.category_name, sub.category_name FROM product_category sub, product_category pare WHERE sub.id = pare.parent_id;
# 顯示寫法 SELECT pare.category_name, sub.category_name FROM product_category sub JOIN product_category pare ON sub.id = pare.parent_id;
查詢結果:
1.7 子查詢
子查詢(嵌套查詢):一個查詢語句嵌套在另一個查詢語句中,內層查詢的結果可以作為外層查詢條件。(相當於查詢出來一個結果,然後把結果當著一張表在進行查詢)
一般的,嵌套在WHERE或者FROM字句中。
子查詢(嵌套查詢)一般分為單行單列子查詢和單行多列子查詢。
查詢實例:
① 單行單列子查詢
# 單行單列子查詢 # 查詢零售價比羅技MX1100更高的所有商品信息 SELECT * FROM product WHERE sale_price > ( SELECT sale_price FROM product WHERE product_name = '羅技MX1100' );
查詢結果:
②單行多列子查詢
# 查詢分類編號和折扣與羅技M100相同的所有商品信息 SELECT * FROM product WHERE (category_id, cutoff) IN (SELECT category_id, cutoff FROM product WHERE product_name = '羅技MX1100'); SELECT * FROM product WHERE (category_id, cutoff) = (SELECT category_id, cutoff FROM product WHERE product_name = '羅技MX1100');
查詢結果:
2.MySQL數據操作DML語句
2.1 插入語句(insert)
插入語句:一次只插入一行。
語法:
insert into table_name (column1,column2,column3...) values (value1, value2, value3…);
插入多行數據記錄。
語法:
insert into table_name (column1,column2,column3...) values (value1, value2, value3…), (value4, value5, value6…), (value7, value8, value9…);
實例:
# 插入一行
INSERT INTO mytable(id, name, age, sex) VALUES (1, '琳', 21, 0);
INSERT INTO mytable(sex, age, name, id) VALUES (1, 18, '小白', 2); #順序可以打亂,只要插入的鍵值一一對應即可
# 插入多行-- MySQL特有 INSERT INTO mytable(id, name, age, sex) VALUES (3, 'test01', 26, 0), (4, 'test02', 27, 1), (5, 'test03', 28, 1);
2.2 修改語句(update)
修改語法:
update table_name set column1 = value1, column2 = value2, column3 = value3… [where condition];
註意:如果省略了where語句,則是修改全表的數據。
修改實例:
# 修改數據 # 將零售價大於300的貨品零售價上調0.2倍 UPDATE product SET sale_price = sale_price * 1.2 WHERE sale_price > 300; # 將零售價大於300的有線滑鼠的貨品零售價上調0.1倍 UPDATE product p JOIN product_category pc ON p.category_id = pc.id SET sale_price = sale_price * 1.1 WHERE sale_price > 300 AND pc.category_name = '有線滑鼠';
2.3 刪除語句(delete)
語法:
delete from table_name [where condition];
註:如果省略了where,則會全表數據都進行刪除。
實例:
# 刪除一條 DELETE FROM mytable WHERE id = 4; # 刪除多條 DELETE FROM mytable WHERE id >=3;
3. MySQL數據備份
MySQL數據備份有兩種方式:通過Navicat工具的SQL導入/導出和使用命令行的方式導入/導出。這裡主要說明使用命令行的方式。
語法:
導出:mysqldump -u賬戶 -p密碼 資料庫名稱>腳本文件存儲地
MySql自身的資料庫維護
通過cmd命令進入dos視窗:
mysqldump -uroot -padmin jdbcdemo> C:/shop_bak.sql
導入:mysql -u賬戶 -p密碼 資料庫名稱< 腳本文件存儲地址
mysql -uroot -padmin jdbcdemo< C:/shop_bak.sql