Mysql單表、多表、SQL語句(DQL)
第1章 SQL語句(DQL)
1.1 DQL準備工作和語法
1.1.1 準備工作
#建立商品表:
pid int primary key,
pname varchar(20),
price double,
category_id varchar(32)
);
INSERT INTO product(pid,pname,price,category_id)VALUES(1,'聯想',5000,'c001');
INSERT INTOproduct(pid,pname,price,category_id) VALUES(2,'海爾',3000,'c001');
INSERT INTOproduct(pid,pname,price,category_id) VALUES(3,'雷神',5000,'c001');
INSERT INTOproduct(pid,pname,price,category_id) VALUES(4,'JACK JONES',800,'c002');
INSERT INTOproduct(pid,pname,price,category_id) VALUES(5,'真維斯',200,'c002');
INSERT INTOproduct(pid,pname,price,category_id) VALUES(6,'花花公子',440,'c002');
INSERT INTOproduct(pid,pname,price,category_id) VALUES(7,'勁霸',2000,'c002');
INSERT INTOproduct(pid,pname,price,category_id) VALUES(8,'香奈兒',800,'c003');
INSERT INTOproduct(pid,pname,price,category_id) VALUES(9,'相宜本草',200,'c003');
INSERT INTOproduct(pid,pname,price,category_id) VALUES(10,'麵霸',5,'c003');
INSERT INTOproduct(pid,pname,price,category_id) VALUES(11,'好想你棗',56,'c004');
INSERT INTOproduct(pid,pname,price,category_id) VALUES(12,'香飄飄奶茶',1,'c005');
INSERT INTOproduct(pid,pname,price,category_id) VALUES(13,'果9',1,NULL);
1.1.2 語法:
select [distinct]
* | 列名,列名
from 表
where 條件
1.2 簡單查詢
1.查詢所有的商品. select * from product;
2.查詢商品名和商品價格. select pname,price fromproduct;
3.別名查詢.使用的關鍵字是as(as可以省略的).
3.1表別名: select * from product as p;
3.2列別名:select pname as pn from product;
4.去掉重複值. select distinct price fromproduct;
5.查詢結果是表示式(運算查詢):將所有商品的價格+10元進行顯示.
selectpname,price+10 from product;
1.3 條件查詢
比較運算子 | > < <= >= = <> | 大於、小於、大於(小於)等於、不等於 |
BETWEEN ...AND... | 顯示在某一區間的值(含頭含尾) | |
IN(set) | 顯示在in列表中的值,例:in(100,200) | |
LIKE ‘張pattern’ | 模糊查詢,Like語句中, %代表零個或多個任意字元, _代表一個字元, 例如:first_name like ‘_a%’; | |
IS NULL | 判斷是否為空 | |
邏輯運算子 | and | 多個條件同時成立 |
or | 多個條件任一成立 | |
not | 不成立,例:where not(salary>100); |
#查詢商品名稱為“花花公子”的商品所有資訊:
SELECT *FROM product WHERE pname = '花花公子'
#查詢價格為800商品
SELECT * FROM product WHERE price = 800
#查詢價格不是800的所有商品
SELECT * FROM product WHERE price != 800
SELECT * FROM product WHERE price <> 800
SELECT * FROM product WHERE NOT(price = 800)
#查詢商品價格大於60元的所有商品資訊
SELECT * FROM product WHERE price > 60;
#查詢商品價格在200到1000之間所有商品
SELECT * FROM product WHERE price >= 200 AND price <=1000;
SELECT * FROM product WHERE price BETWEEN 200 AND 1000;
#查詢商品價格是200或800的所有商品
SELECT * FROM product WHERE price = 200 OR price = 800;
SELECT * FROM product WHERE price IN (200,800);
#查詢含有'霸'字的所有商品
SELECT * FROM product WHERE pname LIKE '%霸%';
#查詢以'香'開頭的所有商品
SELECT * FROM product WHERE pname LIKE '香%';
#查詢第二個字為'想'的所有商品
SELECT * FROM product WHERE pname LIKE '_想%';
#商品沒有分類的商品
SELECT * FROM product WHERE category_id IS NULL
#查詢有分類的商品
SELECT * FROM product WHERE category_id IS NOT NULL
1.4 排序查詢
通過order by語句,可以將查詢出的結果進行排序。暫時放置在select語句的最後。
格式:
SELECT * FROM 表名 ORDER BY 排序欄位 ASC|DESC;
ASC 升序 (預設)
DESC 降序
#1.使用價格排序(降序)
SELECT * FROM product ORDER BY price DESC;
#2.在價格排序(降序)的基礎上,以分類排序(降序)
SELECT * FROM product ORDER BY price DESC,category_id DESC;
#3.顯示商品的價格(去重複),並排序(降序)
SELECT DISTINCT price FROM product ORDER BY price DESC;
1.5 聚合查詢
之前我們做的查詢都是橫向查詢,它們都是根據條件一行一行的進行判斷,而使用聚合函式查詢是縱向查詢,它是對一列的值進行計算,然後返回一個單一的值;另外聚合函式會忽略空值。
今天我們學習如下五個聚合函式:
l count:統計指定列不為NULL的記錄行數;
l sum:計算指定列的數值和,如果指定列型別不是數值型別,那麼計算結果為0;
l max:計算指定列的最大值,如果指定列是字串型別,那麼使用字串排序運算;
l min:計算指定列的最小值,如果指定列是字串型別,那麼使用字串排序運算;
l avg:計算指定列的平均值,如果指定列型別不是數值型別,那麼計算結果為0;
#1 查詢商品的總條數
SELECT COUNT(*) FROM product;
#2 查詢價格大於200商品的總條數
SELECT COUNT(*) FROM product WHERE price > 200;
#3 查詢分類為'c001'的所有商品的總和
SELECT SUM(price) FROM product WHERE category_id = 'c001';
#4 查詢分類為'c002'所有商品的平均價格
SELECT AVG(price) FROM product WHERE category_id = 'c002';
#5 查詢商品的最大價格和最小价格
SELECT MAX(price),MIN(price) FROM product;
1.6 分組查詢
分組查詢是指使用group by字句對查詢資訊進行分組。
l 格式:
SELECT 欄位1,欄位2… FROM 表名 GROUP BY分組欄位 HAVING 分組條件;
分組操作中的having子語句,是用於在分組後對資料進行過濾的,作用類似於where條件。
l having與where的區別:
n having是在分組後對資料進行過濾.
where是在分組前對資料進行過濾
n having後面可以使用分組函式(統計函式)
where後面不可以使用分組函式。
#1 統計各個分類商品的個數
SELECT category_id ,COUNT(*) FROM product GROUP BY category_id ;
#2 統計各個分類商品的個數,且只顯示個數大於1的資訊
SELECT category_id ,COUNT(*) FROM product GROUP BY category_idHAVING COUNT(*) > 1;
第2章 SQLyog(MySQL圖形化開發工具)
l 安裝:
提供的SQLyog軟體為免安裝版,可直接使用
l 使用:
輸入使用者名稱、密碼,點選連線按鈕,進行訪問MySQL資料庫進行操作
在Query視窗中,輸入SQL程式碼,選中要執行的SQL程式碼,按F8鍵執行,或按執行按鈕執行。
第3章 SQL備份與恢復
3.1 SQL備份
資料庫的備份是指將資料庫轉換成對應的sql檔案
3.1.1 MySQL命令備份
資料庫匯出sql指令碼的格式:
mysqldump -u使用者名稱 -p密碼 資料庫名>生成的指令碼檔案路徑
例如:
mysqldump -uroot -proot day04>d:\day04.sql
以上備份資料庫的命令中需要使用者名稱和密碼,即表明該命令要在使用者沒有登入的情況下使用
3.1.2 視覺化工具備份
選中資料庫,右鍵 ”備份/匯出” , 指定匯出路徑,儲存成.sql檔案即可。
3.2 SQL恢復
資料庫的恢復指的是使用備份產生的sql檔案恢復資料庫,即將sql檔案中的sql語句執行就可以恢復資料庫內容。
3.2.1 MySQL命令恢復
使用資料庫命令備份的時候只是備份了資料庫內容,產生的sql檔案中沒有建立資料庫的sql語句,在恢復資料庫之前需要自己動手建立資料庫。
u 在資料庫外恢復
格式:mysql -uroot -p密碼 資料庫名 < 檔案路徑
例如:mysql -uroot -proot day04<d:\day04.sql
u 在資料庫內恢復
格式:source SQL指令碼路徑
例如:source d:\day0401.sql
注意:使用這種方式恢復資料,首先要登入資料庫.
3.2.2 視覺化工具恢復
資料庫列表區域右鍵“從SQL轉儲檔案匯入資料庫”, 指定要執行的SQL檔案,執行即可。
第4章 多表操作
實際開發中,一個專案通常需要很多張表才能完成。例如:一個商城專案就需要分類表(category)、商品表(products)、訂單表(orders)等多張表。且這些表的資料之間存在一定的關係,接下來我們將在單表的基礎上,一起學習多表方面的知識。
4.1 表與表之間的關係
l 一對多關係:
n 常見例項:客戶和訂單,分類和商品,部門和員工.
n 一對多建表原則:在從表(多方)建立一個欄位,欄位作為外來鍵指向主表(一方)的主鍵.
l 多對多關係:
n 常見例項:學生和課程、使用者和角色
n 多對多關係建表原則:需要建立第三張表,中間表中至少兩個欄位,這兩個欄位分別作為外來鍵指向各自一方的主鍵.
l 一對一關係:(瞭解)
n 在實際的開發中應用不多.因為一對一可以建立成一張表.
n 兩種建表原則:
u 外來鍵唯一:主表的主鍵和從表的外來鍵(唯一),形成主外來鍵關係,外來鍵唯一unique。
u 外來鍵是主鍵:主表的主鍵和從表的主鍵,形成主外來鍵關係。
4.2 外來鍵約束
現在我們有兩張表“分類表”和“商品表”,為了表明商品屬於哪個分類,通常情況下,我們將在商品表上新增一列,用於存放分類cid的資訊,此列稱為:外來鍵
此時“分類表category”稱為:主表,“cid”我們稱為主鍵。“商品表products”稱為:從表,category_id稱為外來鍵。我們通過主表的主鍵和從表的外來鍵來描述主外來鍵關係,呈現就是一對多關係。
外來鍵特點:
u 從表外來鍵的值是對主表主鍵的引用。
u 從表外來鍵型別,必須與主表主鍵型別一致。
l 宣告外來鍵約束
語法:alter table 從表 add [constraint] [外來鍵名稱] foreign key (從表外來鍵欄位名) references 主表 (主表的主鍵);
[外來鍵名稱]用於刪除外來鍵約束的,一般建議“_fk”結尾
alter table從表 drop foreignkey 外來鍵名稱
l 使用外來鍵目的:
n 保證資料完整性
4.3 一對多操作
4.3.1 分析
l category分類表,為一方,也就是主表,必須提供主鍵cid
l products商品表,為多方,也就是從表,必須提供外來鍵category_id
4.3.2 實現:分類和商品
###建立分類表
create table category(
cidvarchar(32) PRIMARY KEY ,
cnamevarchar(100) #分類名稱
);
# 商品表
CREATE TABLE `products` (
`pid`varchar(32) PRIMARY KEY ,
`name`VARCHAR(40) ,
`price`DOUBLE
);
#新增外來鍵欄位
alter table products add column category_idvarchar(32);
#新增約束
alter table products add constraint product_fkforeign key (category_id) references category (cid);
4.3.3 操作
#1 向分類表中新增資料
INSERT INTO category (cid ,cname) VALUES('c001','服裝');
#2 向商品表新增普通資料,沒有外來鍵資料,預設為null
INSERT INTO products (pid,pname) VALUES('p001','商品名稱');
#3 向商品表新增普通資料,含有外來鍵資訊(category表中存在這條資料)
INSERT INTO products (pid ,pname ,category_id)VALUES('p002','商品名稱2','c001');
#4 向商品表新增普通資料,含有外來鍵資訊(category表中不存在這條資料) -- 失敗,異常
INSERT INTO products (pid ,pname ,category_id)VALUES('p003','商品名稱2','c999');
#5 刪除指定分類(分類被商品使用) -- 執行異常
DELETE FROM category WHERE cid = 'c001';
4.4 多對多
4.4.1 分析
l 商品和訂單多對多關係,將拆分成兩個一對多。
l products商品表,為其中一個一對多的主表,需要提供主鍵pid
l orders 訂單表,為另一個一對多的主表,需要提供主鍵oid
l orderitem中間表,為另外新增的第三張表,需要提供兩個外來鍵oid和pid
4.4.2 實現:訂單和商品
### 商品表[已存在]
### 訂單表
create table `orders`(
`oid`varchar(32) PRIMARY KEY ,
`totalprice` double #總計
);
### 訂單項表
create table orderitem(
oidvarchar(50),-- 訂單id
pidvarchar(50)-- 商品id
);
###---- 訂單表和訂單項表的主外來鍵關係
alter table `orderitem` add constraintorderitem_orders_fk foreign key (oid) references orders(oid);
###---- 商品表和訂單項表的主外來鍵關係
alter table `orderitem` add constraintorderitem_product_fk foreign key (pid) references products(pid);
### 聯合主鍵(可省略)
alter table `orderitem` add primary key (oid,pid);
4.4.3 操作
#1 向商品表中新增資料
INSERT INTO products (pid,pname) VALUES('p003','商品名稱');
#2 向訂單表中新增資料
INSERT INTO orders (oid ,totalprice)VALUES('x001','998');
INSERT INTO orders (oid ,totalprice)VALUES('x002','100');
#3向中間表新增資料(資料存在)
INSERT INTO orderitem(pid,oid)VALUES('p001','x001');
INSERT INTO orderitem(pid,oid)VALUES('p001','x002');
INSERT INTO orderitem(pid,oid) VALUES('p002','x002');
#4刪除中間表的資料
DELETE FROM orderitem WHERE pid='p002' AND oid ='x002';
#5向中間表新增資料(資料不存在) -- 執行異常
INSERT INTO orderitem(pid,oid)VALUES('p002','x003');
#6刪除商品表的資料 -- 執行異常
DELETE FROM products WHERE pid = 'p001';