Mysql約束和多表查詢

數據完整性

  • 作用:保證用戶輸入的數據保存到數據庫中是正確的
  • 確保數據的完整性:在創建表時給表中添加約束
  • 完整性的分類:
    • 實體完整性
    • 域完整性
    • 引用完整性
實體完整性約束
  • 實體:即表中的一行(一條記錄)代表一個實體(entity)
  • 實體完整性的作用:標識每一行數據不重複
  • 約束類型:
    • 主鍵約束(primary key)
    • 唯一約束(unique)
    • 自動增長列(auto_increment)
主鍵約束(primary key)
  • 注:每個表中要有一個主鍵
  • 特點:數據唯一,且不能爲null
  • 示例:
  • 第一種添加方式:
 CREATE TABLE student(
	id INT PRIMARY KEY,
	NAME VARCHAR(20)
 );
  • 第二種方式:此種方式優勢在於,可以創建聯合主鍵
CREATE TABLE student(
   id INT,
   NAME VARCHAR(20),
   PRIMARY KEY(id)
);
 #創建聯合主鍵
CREATE TABLE student(
   classid INT,
   stuid INT,
   NAME VARCHAR(20),
   PRIMARY KEY(classid,stuid)
);
  • 第三種方式:(不推薦)
 #不建議使用此種方式添加主鍵
CREATE TABLE student(
   id INT,
   NAME VARCHAR(20)
);
ALTER TABLE student ADD PRIMARY KEY(id);
唯一約束(unique)
  • 特點:數據不能重複,可以爲null
 CREATE TABLE student(
   id INT PRIMARY KEY,
   NAME VARCHAR(20) UNIQUE
);
自動增長列(auto_increment)
  • sqlserver數據庫(identity)Oracle數據庫(sequence)
  • 自動增長不能單獨使用,一般需要和主鍵配合
  • 注:給主鍵添加自動增長的數值,列只能是數值類型
 CREATE TABLE student(
   id INT PRIMARY KEY AUTO_INCREMENT,
   NAME VARCHAR(20)
);
域完整性約束
  • 域完整性約束的作用:限制此單元格的數據正確,不對其它單元格起作用,域代表當前單元格
  • 域完整性約束:數據類型、非空約束(not null)、默認值約束(default)、check約束(mysql5.5不支持)check(sex='男’or sex=‘女’)
  • 數據類型在上一個博客提了一下,這裏就不具體介紹
非空約束(not null)
 CREATE TABLE student(
   id INT PRIMARY KEY AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   sex VARCHAR(10)
);
默認約束(default)
 CREATE TABLE student(
   id INT PRIMARY KEY AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   sex VARCHAR(10) DEFAULT 'male'
);
引用完整性約束
  • 外鍵約束:foreign key
  • 示例:
    • 第一種添加外鍵方式。推薦
	 #學生表(主表)
CREATE TABLE student(
   sid INT PRIMARY KEY AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   sex VARCHAR(10) DEFAULT 'male'
);
#成績表(從表)
CREATE TABLE score(
   id INT,
   score INT,
   sid INT,
   FOREIGN KEY(sid) REFERENCES student(sid)
);
  • 第二種添加外鍵方式
ALTER TABLE score ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES student(sid);

多表查詢

多表關係
  • 一對一
  • 一對多
  • 多對多
  • 注:具體事例有很多,以生活中來參考
多表查詢
  • 合併結果集
    • UNION
    • UNION ALL
  • 連接查詢
    • 內連接【INNER】JOIN ON
    • 外連接OUTER JOIN ON
      • 左外連接LEFT【OUTER】JOIN
      • 右外連接RIGHT【OUTER】JOIN
  • 子查詢
合併結果集
  • 作用:合併結果集就是把兩個select語句的查詢結果合併到一起
  • 合併結果集有兩種方式:
    • UNION:去除重複記錄
    • UNION ALL:不去除重複記錄
 #UNION
 SELECT * FROM student UNION SELECT * FROM score;
#UNION ALL
SELECT * FROM student UNION ALL SELECT * FROM score;
連接查詢
  • 連接查詢就是求出多個表的乘積,列如:t1連接t2,那麼查詢出的結果就是t1*t2
  • 連接查詢會產生笛卡爾積
  • 示例
 SELECT stu.sid,stu.name,stu.sex,sc.score 
 FROM student stu,score sc 
 WHERE stu.sid=sc.sid;
  • 內連接
 SELECT * 
 FROM student 
 INNER JOIN score 
 ON student.sid=score.id;
  • 外連接
    • 左外連接
    • 以左表爲主表,右表時從表
    • 左連接是先查詢出左表(即以左表爲主),然後查詢右表,左表中滿足條件和不滿足條件都顯示出來,右邊不滿足條件的顯示null
  	 SELECT * 
  	 FROM student stu 
  	 LEFT OUTER JOIN score sc 
  	 ON stu.sid=sc.sid;
  • 右外連接(和右外連接相反)
  • 以右表爲主表,左表爲從表
 SELECT * 
 FROM student stu 
 RIGHT OUTER JOIN score sc 
 ON stu.sid=sc.sid;
  • 連接查詢總結:連接查詢可以爲多張表,不限於兩張表,去除笛卡爾積通常以主外鍵關係去除
子查詢
  • 一個select語句中包含另一個完整的select語句
  • 子查詢就是嵌套查詢,即select中包含select,如果一條語句中存在兩個,或兩個以上select,那麼就是子查詢語句了。裏面的查詢叫子查詢,外面的查詢叫父查詢,一般情況下都是先執行子查詢,再執行父查詢
子查詢出現的位置:
a.where,作爲被查詢的條件的一部分
b.from後,作爲臨時表
當子查詢出現在where後作爲條件時,還可以使用如下關鍵字
a.any
b.all
子查詢結果集的常見形式
a.單行單列(用於條件)
b.多行單列(用於條件)
c.多行多列(用於表)
  • 注:綜合練習在後面,這裏就不單獨舉例
導出導入數據庫
  • 導出導入數據庫有很多方法,者裏就不介紹,可視化工具的導入導出方式,只介紹命令方式
  • 導出數據庫表
mysqldump -uroot -p 數據庫名 > 導出路徑/名字.sql
  • 導入數據庫表
#先登錄數據庫
mysql -uroot -p
#然後選擇數據庫
use 數據庫
#導入
source 路徑名/名字.sql

綜合練習

  • 創建商城數據庫表結構
#創建用戶表 
CREATE TABLE USER( 
userId INT PRIMARY KEY AUTO_INCREMENT, 
username VARCHAR(20) NOT NULL, 
PASSWORD VARCHAR(18) NOT NULL, 
address VARCHAR(100), 
phone VARCHAR(11) 
);
#一對多的實現 
#創建分類表 
CREATE TABLE category(
 cid VARCHAR(32) PRIMARY KEY ,
 cname VARCHAR(100) NOT NULL 
 #分類名稱 
 );
 # 商品表 
 CREATE TABLE `products` ( 
`pid` VARCHAR(32) PRIMARY KEY, 
`name` VARCHAR(40) ,
`price` DOUBLE(7,2),
category_id VARCHAR(32), 
CONSTRAINT FOREIGN KEY(category_id) REFERENCES category(cid) 
);

#多對多的實現 
#訂單表 
CREATE TABLE `orders`( 
`oid` VARCHAR(32) PRIMARY KEY , 
`totalprice` DOUBLE(12,2), 
#總計 
`userId` INT, 
CONSTRAINT FOREIGN KEY(userId) REFERENCES USER(userId) 
#外鍵 
);

#訂單項表 
CREATE TABLE orderitem( 
oid VARCHAR(32), 
#訂單id 
pid VARCHAR(32), 
#商品id
num INT , 
#購買商品數量 
PRIMARY KEY(oid,pid), 
#主鍵
FOREIGN KEY(oid) REFERENCES orders(oid),
FOREIGN KEY(pid) REFERENCES products(pid) 
);

#初始化數據 
#用戶表添加數據
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('張三','123','北京昌平沙 河','13812345678'); 
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('王五','5678','北京海 澱','13812345141'); 
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('趙六','123','北京朝 陽','13812340987'); 
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('田七','123','北京大 興','13812345687');

#給分類表初始化數據 
INSERT INTO category VALUES('c001','電器'); 
INSERT INTO category VALUES('c002','服飾'); 
INSERT INTO category VALUES('c003','化妝品'); 
INSERT INTO category VALUES('c004','書籍');

#給商品表初始化數據 
INSERT INTO products(pid,NAME,price,category_id) VALUES('p001','聯想',5000,'c001'); 
INSERT INTO products(pid,NAME,price,category_id) VALUES('p002','海爾',3000,'c001'); 
INSERT INTO products(pid,NAME,price,category_id) VALUES('p003','雷神',5000,'c001'); 
INSERT INTO products(pid,NAME,price,category_id) VALUES('p004','JACK JONES',800,'c002'); 
INSERT INTO products(pid,NAME,price,category_id) VALUES('p005','真維斯',200,'c002'); 
INSERT INTO products(pid,NAME,price,category_id) VALUES('p006','花花公子',440,'c002'); 
INSERT INTO products(pid,NAME,price,category_id) VALUES('p007','勁霸',2000,'c002'); 
INSERT INTO products(pid,NAME,price,category_id) VALUES('p008','香奈兒',800,'c003'); 
INSERT INTO products(pid,NAME,price,category_id) VALUES('p009','相宜本草',200,'c003'); 
INSERT INTO products(pid,NAME,price,category_id) VALUES('p010','梅明子',200,NULL);

#添加訂單
INSERT INTO orders VALUES('o6100',18000.50,1); 
INSERT INTO orders VALUES('o6101',7200.35,1); 
INSERT INTO orders VALUES('o6102',600.00,2); 
INSERT INTO orders VALUES('o6103',1300.26,4);

#訂單詳情表 
INSERT INTO orderitem VALUES('o6100','p001',1),('o6100','p002',1),('o6101','p003',1);
多表查詢
  • 查詢所有用戶的訂單
SELECT o.oid,o.totalprice,u.userId,u.username 
FROM orders o 
INNER JOIN 
USER u 
ON o.userId=u.userId;
  • 查詢用戶id爲1的所有訂單詳情
SELECT o.oid,o.totalprice,o.userId,u.username,om.pid 
FROM orders o 
INNER JOIN USER u 
ON o.userId=u.userId 
INNER JOIN orderitem om 
ON o.oid=om.oid 
WHERE u.userId=1;
子查詢
  • 查看用戶爲張三的訂單
SELECT * 
FROM orders 
WHERE userId=(
SELECT userId 
FROM USER 
WHERE username = '張三'
);
  • 查詢出訂單的價格大於800的所有用戶信息
SELECT * 
FROM USER 
WHERE userId IN(
SELECT DISTINCT userId 
FROM 
orders 
WHERE totalprice>800
);
分頁查詢
  • 查詢商品表第三頁的信息,每頁3條信息
SELECT * FROM products LIMIT 6,3;
簡單介紹就到這裏,感謝您的觀看
發佈了19 篇原創文章 · 獲贊 19 · 訪問量 5634
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章