主頁 > 資料庫 > MySQL外鍵約束和多表查詢

MySQL外鍵約束和多表查詢

2023-05-12 10:37:49 資料庫

外鍵約束和多表查詢

一、外鍵是什么

圖解

知識點

外鍵: 多個表之間的關聯欄位

特點1: 從表外鍵的值是對主表主鍵的參考,
特點2: 從表外鍵型別,必須與主表主鍵型別一致,

主從表:  外鍵欄位所在的表是從表,依賴欄位對應的表是主表
多表關系:  一對一    一對多    多對多
一對多關系:  主表是一方  從表是多方

外鍵約束

外鍵約束: FOREIGN KEY  

外鍵約束作用: 
保證了資料的準確性: 限制了從表在插入資料的時候,不能插入主表不存在的資料
保證了資料的完整性: 限制了主表在洗掉資料的時候,不能洗掉從表已經參考的資料

如果添加外鍵約束: 
在建從表時候添加(建議): constraint [外鍵名稱] foreign key(外鍵欄位名) references 主表(主鍵)
# 拓展存盤引擎
# 查看所有存盤引擎
show ENGINES;
# 查看默認存盤引擎
show variables like '%default_storage_engine%';
# 注意: innodb支持外鍵而myisam不支持外鍵
# 如果要使用外鍵: 你的mysql存盤引擎是myisam需要修改成innodb

#資料準備
# 分類表
CREATE TABLE category(
    cid   VARCHAR(32) PRIMARY KEY, # 分類id
    cname VARCHAR(100) #分類名稱
);

# 商品表
CREATE TABLE products
(
  pid VARCHAR(100) PRIMARY KEY , # 商品id
  pname VARCHAR(40) ,# 商品名稱
  price DOUBLE ,# 商品價格
  category_id VARCHAR(32),# 分類id
  CONSTRAINT FOREIGN KEY(category_id) REFERENCES category(cid) # 添加外鍵約束
);
# 查看表建表陳述句
show create table category;
show create table products;
# 插入測驗資料
#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');

# 演示外鍵約束的限制作用
# 限制從表插入資料的時候不能插入主表不存在的資料,否則報錯
INSERT INTO products (pid ,pname ,category_id) VALUES('p003','商品名稱2','c999'); # 報錯
# 限制主表不能刪洗掉從表已經參考的資料,否則報錯
DELETE FROM category WHERE cid = 'c001';# 報錯

多表查詢

圖解

資料準備

# 創建hero表
CREATE TABLE hero(
    hid       INT PRIMARY KEY,# 英雄id
    hname     VARCHAR(255),# 英雄名稱
    kongfu_id INT # 對應功夫id
);

# 創建kongfu表
CREATE TABLE kongfu
(
    kid   INT PRIMARY KEY, # 功夫id
    kname VARCHAR(255) # 功夫名
);
# 插入hero資料
INSERT INTO hero VALUES(1, '鳩摩智', 9),(3, '喬峰', 1),(4, '虛竹', 4),(5, '段譽', 12);

# 插入kongfu資料
INSERT INTO kongfu VALUES(1, '降龍十八掌'),(2, '乾坤大挪移'),(3, '猴子偷桃'),(4, '天山折梅手');

交叉連接

交叉連接關鍵字: cross join

注意: 交叉連接會產生笛卡爾積(離散數學里面學過)

格式: select 欄位名 from 左表 cross join 右表 ;     注意:以后一般不用

內連接

知識點

內連接關鍵字:表1 [inner] join 表2 on 條件
顯式內連接格式:select 欄位名 from 左表 inner join 右表 on 左右關聯條件;
隱式內連接格式:select 欄位名 from 左表,右表 where 左右關聯條件;

示例

# 需求: 查找英雄中有對應功夫的資訊
# 顯式格式: select 欄位名 from 左表 inner join 右表 on 左右表關聯條件
SELECT * FROM hero inner join kongfu on kongfu_id = kid;
# 隱式格式: select 欄位名 from 左表 , 右表 where 左右表關聯條件
SELECT * FROM hero,kongfu WHERE kongfu_id = kid;

外連接

知識點

左外連接關鍵字:表1 left [outer] join 表2 on 條件
右外連接關鍵字:表1 right [outer] join 表2 on 條件

注意:outer可以省略

左外連接格式: select 欄位名 from 左表 left outer join 右表 on 左右表關聯條件 ; 
右外連接格式: select 欄位名 from 左表 right outer join 右表 on 左右表關聯條件 ;

示例

# 需求: 查找所有英雄對應功夫資訊,即使沒有功夫也要展示資訊
# 左外連接格式: select 欄位名 from 左表 left outer join 右表 on 左右表關聯條件 ;
# 左連接效果: 以左表為主,左表資料都展示,右表只展示和左表關聯上的資料,其他內容null補全
select hname,kname from hero left outer join kongfu on hero.kongfu_id=kongfu.kid;
select hname,kname from hero left  join kongfu on hero.kongfu_id=kongfu.kid;

# 右外連接格式: select 欄位名 from 左表 right outer join 右表 on 左右表關聯條件 ;
select hname,kname from kongfu right outer join hero on hero.kongfu_id=kongfu.kid;
select hname,kname from kongfu right join hero on hero.kongfu_id=kongfu.kid;

內外連接練習

準備資料

# 創建分類表
CREATE TABLE category (
  cid VARCHAR(32) PRIMARY KEY ,
  cname VARCHAR(50)
);
# 創建商品表
CREATE TABLE products(
  pid VARCHAR(32) PRIMARY KEY ,
  pname VARCHAR(50),
  price INT,
  flag VARCHAR(2),    #是否上架標記為:1表示上架、0表示下架
  category_id VARCHAR(32),
  CONSTRAINT products_fk FOREIGN KEY (category_id) REFERENCES category (cid)
);
# 插入資料
# 分類
INSERT INTO category(cid,cname) VALUES('c001','家電');
INSERT INTO category(cid,cname) VALUES('c002','服飾');
INSERT INTO category(cid,cname) VALUES('c003','化妝品');
INSERT INTO category(cid,cname) VALUES('c004','奢侈品');
# 商品
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p001','聯想',5000,'1','c001');
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p002','海爾',3000,'1','c001');
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p003','雷神',5000,'1','c001');
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p004','JACK JONES',800,'1','c002');
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p005','真維斯',200,'1','c002');
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p006','花花公子',440,'1','c002');
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p007','勁霸',2000,'1','c002');
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p008','香奈兒',800,'1','c003');
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p009','相宜本草',200,'0','c003');

示例

# 1.查詢哪些分類的商品已經上架,要求展示分類名稱
# 注意: 如果表名稱較長,可以使用別名,as關鍵字可以省略
select distinct cname from category c join products p on c.cid = p.category_id where flag = '1';
# 2.查詢所有分類商品的個數,要求展示分類名稱
# 注意: 可以利用聚合函式(欄位名)的忽略null的特點
select cname,count(category_id) from category c left join products p ON c.cid = p.category_id GROUP BY cname;

子查詢

知識點

子查詢核心思路:   一個select陳述句的結果作為另一個select陳述句的部分(表或者條件)

子查詢作為表:  select 欄位名 from (子查詢陳述句) as 別名;

子查詢作為條件: select 欄位名 from 表名 where ... (子查詢陳述句);

示例

# 一個陳述句作為另外一個陳述句的一部分(表或者條件)


# 演示子查詢作為條件
#  1.查詢哪些分類的商品已經上架,要求展示分類名稱
SELECT DISTINCT
    category_id
FROM
    products
WHERE
    flag = '1'; #先找已經上架的商品的id
SELECT
    cname
FROM
    category
WHERE
    cid IN (SELECT DISTINCT category_id FROM products WHERE flag = '1');
#將上條查詢作為條件,進行子查詢
# 2.查詢“化妝品”分類上架商品詳情
SELECT
    cid
FROM
    category
WHERE
    cname = '化妝品'; #先查詢化妝品的商品id是什么
SELECT *
FROM
    products
WHERE
      flag = '1'
  AND category_id = (SELECT cid FROM category WHERE cname = '化妝品');
#將上條查詢作為條件,進行子查詢

# 3.查詢“化妝品”和“家電”兩個分類上架商品詳情
SELECT
    cid
FROM
    category
WHERE
    cname IN ('化妝品', '家電');#先查詢化妝品和家電的商品id是什么
SELECT *
FROM
    products
WHERE
      flag = '1'
  AND category_id IN (SELECT cid FROM category WHERE cname IN ('化妝品', '家電'));
#將上條查詢作為條件,進行子查詢

# 演示子查詢作為表
# 1.查詢“化妝品”分類上架商品詳情,要求包含分類名稱
# 顯式內連接
SELECT *
FROM
    category
WHERE
    cname = '化妝品'; #查詢化妝品分類下的商品資訊,作為表
SELECT *
FROM
    products p
        JOIN (SELECT * FROM category WHERE cname = '化妝品') t1 ON p.category_id = t1.cid
WHERE
    flag = '1'; #將上表與商品表連接起來,之后進行查詢

自連接

知識點

自連接作為一種特例,可以將一個表與它自身進行連接,稱為自連接,

語法: 自連接語法和內外連接的語法一樣,只不過換成了只在同一張表上面操作

特點: 特殊的地方就是左表和右表是同一張表,只是起了不同的別名

示例

# 假設現在有一個區域表areas,里面是我國區域階級,如下圖所示北京市下屬有幾個區,每個區的pid是其上級區域
# 分析: 省市區三級都在一個表中,那么就可以使用自連接

# 需求1: 查詢河北省所有的城市
# 自連接方式  思路: 通過起別名把一個表(區域表)變成兩個表(城市表,省級表)使用
#自連接,將表復制為兩個表,一個取名city,一個起名province,進行關聯,查找
SELECT *
FROM
    areas city
        JOIN areas province ON city.pid = province.id
WHERE
    province.title = '河北省';

#查邯鄲市下的區縣
SELECT *
FROM
    areas district
        JOIN areas city on district.pid = city.id
where city.title='邯鄲市';

image-20230511203635933

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/552292.html

標籤:其他

上一篇:資料治理三大模式詳解,治理新范式釋放資料潛能

下一篇:返回列表

標籤雲
其他(158911) Python(38128) JavaScript(25420) Java(18033) C(15226) 區塊鏈(8265) C#(7972) AI(7469) 爪哇(7425) MySQL(7179) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5338) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4570) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1972) 功能(1967) Web開發(1951) HtmlCss(1936) python-3.x(1918) C++(1915) 弹簧靴(1913) xml(1889) PostgreSQL(1875) .NETCore(1860) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • MySQL外鍵約束和多表查詢

    外鍵約束和多表查詢 一、外鍵是什么 圖解 知識點 外鍵: 多個表之間的關聯欄位 特點1: 從表外鍵的值是對主表主鍵的參考。 特點2: 從表外鍵型別,必須與主表主鍵型別一致。 主從表: 外鍵欄位所在的表是從表,依賴欄位對應的表是主表 多表關系: 一對一 一對多 多對多 一對多關系: 主表是一方 從表是 ......

    uj5u.com 2023-05-12 10:37:49 more
  • 資料治理三大模式詳解,治理新范式釋放資料潛能

    隨著世界經濟由工業經濟向數字經濟轉型,資料逐步成為關鍵的生產要素,企業開始將資料作為一種戰略資產進行管理。資料從業務中產生,在IT系統中承載,要對資料進行有效治理,需要業務充分參與,IT系統確保遵從,這是一個非常復雜的系統工程。 資料治理架構 實踐證明,企業只有構筑一套企業級的資料治理綜合體系,明確 ......

    uj5u.com 2023-05-12 10:37:28 more
  • Apache DolphinScheduler 開源之夏學生專案申請開啟,6 大課題等你

    開源之夏 2023 學生報名已經正式開啟!Apache DolphinScheduler 今年繼續參與開源之夏的活動,2023 年 4 月 29 日-6 月 3 日 15:00 UTC+8,同學們可以在開源之夏官網 https://summer-ospp.ac.cn/ 找到 Apache Dolph ......

    uj5u.com 2023-05-12 10:37:11 more
  • 共筑數字化未來,金山辦公攜手華為云完成檔案中心和GaussDB適配

    摘要:金山辦公攜手華為云完成金山辦公自主研發的“WPS檔案中心系統”與華為云GaussDB相互兼容性測驗認證,并獲得華為云授予的《技術認證書》。 本文分享自華為云社區《共筑數字化未來 金山辦公攜手華為云完成檔案中心和GaussDB適配》,作者:GaussDB 資料庫。 近日,金山辦公攜手華為云完成金 ......

    uj5u.com 2023-05-12 10:37:00 more
  • 資料剖析更靈活、更快捷,火山引擎 DataLeap 動態探查全面升級

    更多技術交流、求職機會,歡迎關注位元組跳動資料平臺微信公眾號,回復【1】進入官方交流群 近期,火山引擎 DataLeap 上線“動態探查”能力,為用戶提供全域資料視角、完善的抽樣策略,提高資料探查的靈活度以及回應速率。 傳統的資料探查是基于庫表的全量探查,由后端引擎執行,通過自動化檢查資料成分、關系、 ......

    uj5u.com 2023-05-12 10:36:52 more
  • Oracle 定時任務job實際應用

    (Oracle 定時任務job實際應用) 一、Oracle定時任務簡介 Oracle定時任務是在oracle系統中一個非常重要的子系統,運用得當,可以大大提高我們系統運行和維護能力。oracle定時任務的功能,可以在指定的時間點自行執行任務。 那么在實際作業中,什么樣的場景會用到定時任務呢?下面是在 ......

    uj5u.com 2023-05-12 10:36:45 more
  • 通過空間占用和執行計劃了解SQL Server的行存盤索引

    1 索引介紹 索引是一種幫助查詢陳述句能夠快速定位到資料的一種技術。索引的存盤方式有行存盤索引、列存盤索引和記憶體優化三種存盤方式: 行存盤索引,使用B+樹結構,行存盤指的是資料存盤格式為堆、聚集索引和記憶體優化表的表,用于OLTP場景。行存盤索引按順序排列的值串列,每個值都有指向其所在的資料頁面的指標。 ......

    uj5u.com 2023-05-12 10:36:17 more
  • 共筑數字化未來,金山辦公攜手華為云完成檔案中心和GaussDB適配

    摘要:金山辦公攜手華為云完成金山辦公自主研發的“WPS檔案中心系統”與華為云GaussDB相互兼容性測驗認證,并獲得華為云授予的《技術認證書》。 本文分享自華為云社區《共筑數字化未來 金山辦公攜手華為云完成檔案中心和GaussDB適配》,作者:GaussDB 資料庫。 近日,金山辦公攜手華為云完成金 ......

    uj5u.com 2023-05-12 10:35:51 more
  • 資料庫定時備份linux篇

    (資料庫定時備份linux篇) 1 序言 相信大家都還記得這則新聞吧,歐洲云計算巨頭 OVH 位于法國斯特拉斯堡的機房發生嚴重火災,大火徹底摧毀了五層高、占地 500 平方米的 SBG2 資料中心。 當地報紙稱 115 位消防員投入 6 個小時才將其撲滅。經過長達 6 個小時的持續燃燒,SBG2 內 ......

    uj5u.com 2023-05-12 10:29:55 more
  • 資料庫定時備份winserver2012篇

    (資料庫定時備份winserver2012篇) 1 序言 資料是無價的,所以生產環境中定時備份資料庫顯得尤為重要。備份能防止服務器故障、天災人禍和人為誤操作帶來的資料丟失。 上一篇文章我們說了Linux環境下的資料備份。這一篇就把之前留下的坑給填上了。 這一篇我們說一說winserver2012環境 ......

    uj5u.com 2023-05-12 10:18:54 more