1. 程式人生 > >Mysql單表、多表、SQL語句(DQL)

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';