MySQL的約束、多表查詢、子查詢

来源:http://www.cnblogs.com/gdwkong/archive/2017/09/06/7487263.html
-Advertisement-
Play Games

一、約束之主鍵約束 約束:約束是添加在列上的,用來約束列的。 1、主鍵約束(唯一標識):非空、唯一、被引用 當表的某一列被指定為主鍵後,該類就不能為空,不能有重覆值出現 創建表時指定主鍵的兩種方式: 指定sid列為主鍵列,即為sid列添加主鍵約束 修改表時指定主鍵: ALTER TABLE stu ...


一、約束之主鍵約束

約束:約束是添加在列上的,用來約束列的。

1、主鍵約束(唯一標識):非空、唯一、被引用

  • 當表的某一列被指定為主鍵後,該類就不能為空,不能有重覆值出現
  • 創建表時指定主鍵的兩種方式:
CREATE TABLE stu(
    sid  CHAR(6) PRIMARY KEY,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10)
);

CREATE TABLE stu(
    sid  CHAR(6) ,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10),
    PRIMARY KEY(sid)
);

  指定sid列為主鍵列,即為sid列添加主鍵約束

  • 修改表時指定主鍵:

ALTER TABLE stu ADD PRIMARY KEY(sid);

  • 刪除主鍵:

ALTER TABLE stu DROP PRIMARY KEY;

2、主鍵自增長

  • 因為主鍵列的特性是:必須唯一,不能為空,所以我們通常會指定主鍵為整型,然後設置其自動增長,這樣可以保證在插入數據時主鍵列的唯一和非空特性。
  • 創建表時指定主鍵自增長
CREATE TABLE stu(
    sid  INT PRIMARY KEY AUTO_INCREMENT,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10)
);
  • 修改表時設置主鍵自增長:
ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
  • 修改表時刪除主鍵自增長:
ALTER TABLE stu CHANGE sid sid INT ;
  • 測試主鍵自增長:

INSERT INTO stu VALUES(NULL,'zhangsan',23,'man');

INSERT INTO stu(sname,age,sex) VALUES(NULL,'zhangsan',23,'man');

3、非空約束

因為某些列不能設置為null值,所以可以對添加非空約束。

例如:

CREATE TABLE stu (
   sid INT PRIMARY KEY AUTO_INCREMENT,
   sname  VARCHAR(20) NOT NULL,
   age   INT,
   sex  VARCHAR(10)
);

對sname列設置了非空約束。

4、唯一約束

車庫某些列不能設置重覆的值,所以可以對列添加唯一約束。

例如:

CREATE TABLE stu (
   sid INT PRIMARY KEY AUTO_INCREMENT,
   sname  VARCHAR(20) NOT NULL UNIQUE,
   age   INT,
   sex  VARCHAR(10)
);

二、概念模型

1、對象模型:在Java中是domain ,例如:User、Student .

2、關係模型:在資料庫中表,1對多,1對1,多對多。

三、外鍵約束

  • 外鍵必須是另一表的主鍵的值(外鍵要引用主鍵。)
  • 外鍵可以重覆
  • 外鍵可以為空

1、創建時添加外鍵約束

CREATE TABLE dept (
    deptno INT PRIMARY KEY AUTO_INCREMENT,
    dname VARCHAR(50)
);
insert into dept values(10,'研發部');
insert into dept values(20,'人力部');
insert into dept values(30,'財務部');

CREATE TABLE emp (
    empno INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(50),
    deptno INT,
    CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno) 
);

CREATE TABLE dept (
    deptno INT PRIMARY KEY AUTO_INCREMENT,
    dname VARCHAR(50)
);
INSERT INTO dept VALUES(10,'研發部');
INSERT INTO dept VALUES(20,'人力部');
INSERT INTO dept VALUES(30,'財務部');

INSERT INTO emp(empno,ename) VALUES(null,'zhangsan');
INSERT INTO emp(empno,ename,deptno) VALUES(null,'lisi',10);

INSERT INTO emp(empno,ename,deptno) VALUES(null,'zhangsan',80); /* Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`mydb2`.`emp`, CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`)) */

2、修改表時添加外鍵約束:

ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERNCES dept(deptno);

四、資料庫關係模型

1、一對一關係

  在表中建立一對一關係比較特殊,需要讓其中一張表的主鍵,即是主鍵又是外鍵。

CREATE TABLE hasband (
    hid INT PRIMARY KEY AUTO_INCREMENT,
    hname VARCHAR(50)
);

CREATE TABLE wife (
    wid INT PRIMARY KEY AUTO_INCREMENT,
    wname VARCHAR(50),
    CONSTRAINT fk_wife_hasband FOREIGN KEY (wid)  REFERENCES hasband(hid) 
);

2、多對多關係

在表中建立多對多關係需要使用中間表,即需要三張表,在中間表中使用兩個外鍵,分別引用其他兩張表的主鍵。

CREATE TABLE student (
    sid INT PRIMARY KEY ,
    ......
);

CREATE TABLE teacher(
    tid INT PRIMARY KEY ,
    ......
);

CREATE TABLE stu_tea (
    sid INT,
    tid INT,
    ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY (sid)  REFERENCES student(sid) ,
    ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY (tid)  REFERENCES teacher(tid) 
);

在中間表中建立關係,如:

INSERT INTO stu_tea VALUES(5,1);

INSERT INTO stu_tea VALUES(2,2);

INSERT INTO stu_tea VALUES(3,2);

五、多表查詢

1、分類

  • 合併結果集
  • 連接查詢
  • 子查詢

2、合併結果查詢

  • 要求被合併表中,結果集列的類型和列數相同
  • UNION,去除重覆行
  • UNION ALL,不去除重覆行

SELECT * FROM 表1名

UNION ALL

SELECT * FROM 表2名;

3、連接查詢

①分類

  • 內連接
  • 外連接
    • 左外連接
    • 右外連接
    • 全外連接(mysql不支持)
    • 自然連接(屬於一種簡化方式)

②內連接

  • 方言:SELECT * FROM 表1 別名1,表2 別名2 WHERE 別名1.xx=別名2.xx;

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;

SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno;

     以條件篩選去除笛卡爾積中無用的信息。

  • 標準:SELECT * FROM 表1 別名1 INNER JOIN 表2 別名2 ON 別名1.xx=別名2.xx;

SELECT e.ename, e.sal , d.dname  FROM emp e INNER JOIN dept d ON  e.deptno=d.deptno;

  • 自然:SELECT * FROM 表1 別名1 NATURAL JOIN 表2 別名2 ;

SELECT e.ename, e.sal , d.dname  FROM emp e NATURAL JOIN dept d;

  • 內連接查詢出的所有記錄都滿足條件

③外連接

  • 左外:SELECT * FROM 表1 別名1 LEFT OUTER JOIN 表2 別名2 ON 別名1.xx=別名2.xx;
    • 左表記錄無論是否滿足條件都會查詢出來,而右表只有滿足條件才能出來。左表中不滿足條件的記錄,右表部分都為null。

SELECT e.ename, e.sal , IFNULL(d.dname,'無部門') AS dname  FROM emp e LEFT OUTER JOIN dept d ON  e.deptno=d.deptno;

  • 左外自然:SELECT * FROM 表1 別名1 NATURAL LEFT OUTER JOIN 表2 別名2 ON 別名1.xx=別名2.xx;
  • 右外:SELECT * FROM 表1 別名1 RIGHT OUTER JOIN 表2 別名2 ON 別名1.xx=別名2.xx;
    • 右表記錄無論是否滿足條件都會查詢出來,而左表只有滿足條件才能出來。右表中不滿足條件的記錄,左表部分都為null。
  • 右外自然:SELECT * FROM 表1 別名1 NATURAL RIGHT OUTER JOIN 表2 別名2 ON 別名1.xx=別名2.xx;
  • 全鏈接:可以使用UNION來完成全連接。

SELECT e.ename, e.sal , d.dname 
FROM emp e LEFT OUTER JOIN dept d 
ON e.deptno=d.deptno
UNION
SELECT e.ename, e.sal , d.dname 
FROM emp e RIGHT OUTER JOIN dept d 
ON e.deptno=d.deptno;

4、子查詢

查詢中有查詢(查看select關鍵字的個數)

①出現的位置

  • WHERE後作為條件存在
  • FROM後作為表存在(多行多列)

②條件

  • 單行單列:SELECT * FROM 表1 別名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 別名2 WHERE 條件) ;

SELECT * FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);

  • 多行單列:SELECT * FROM 表1 別名1 WHERE 列1 [IN,ALL,ANY] (SELECT 列 FROM 表2 別名2 WHERE 條件);

SELECT * FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE job='經理') ;

  • 單行多列:SELECT * FROM 表1 別名1 WHERE (列1,列2)IN (SELECT 列1,列2 FROM 表2 別名2 WHERE 條件);

SELECT * FROM emp WHERE (job,deptno) IN (SELECT job,deptno from emp WHERE deptno=30) ;

  • 多行多列:SELECT * FROM 表1 別名1,(SELECT......)表2 別名2 WHERE 條件;

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 資料庫查詢優化 1.使用索引 應儘量避免全表掃描,首先應考慮在 where 及 order by ,group by 涉及的列上建立索引。 2.優化sql語句 通過 explain(查詢優化神器)用來查看 SQL 語句的執行效果, 可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。 任何地方 ...
  • Oracle第二章:用戶與許可權 用戶 安裝完Oracle,Oracle預設有兩個用戶: 1、sys用戶,又叫資料庫系統管理員、特權用戶,該數據的地位至高無上。 它是資料庫的系統管理員,負責資料庫的安裝、維護、升級、備份、恢復、優化等操作 在sys用戶之下,保存著資料庫所有的系統字典。 不能用norm ...
  • 在本節中將通過一個預測房屋價格的實例來講解利用線性回歸預測房屋價格,以及在tensorflow中如何實現 ...
  • COALESCE(columnname,string) 函數 將 NULL 值作為字元串(用空字元串或其他字元串替換 NULL)- 接受一列輸入值(欄位)如果該欄位為 NULL,則返回後面替換的字元串 SUBSTRING(string,start,length) 提取從指定位置開始,具有特定長度的字 ...
  • 1、什麼是JDBC? JDBC(Java DataBase Connectivity)就是Java資料庫連接,說白了就是用Java語言來操作資料庫。原來我們操作資料庫是在控制台使用SQL語句來操作資料庫,JDBC是用Java語言向資料庫發送SQL語句。 2、JDBC原理 SUN提供訪問資料庫規範稱為 ...
  • MySQL有一種日誌,叫做慢查詢日誌,主要就是用來記錄一些耗時的查詢操 作。通過這個日誌我們就可以分析出哪些的操作是影響性能的,我們需要對其 進行一些優化措施。 ...
  • 題目:從 scott 用戶的 emp/dept 表中,查詢所有員工工資都大於1000的部門的信息及員工信息 肢解: 1、從scott用戶的emp/dept表中,查詢所有員工工資都大於1000的部門信息 2、從scott用戶的emp/dept表中,查詢所有員工工資都大於1000的員工信息 3、條件都是 ...
  • 今天在使用taskctl的designer時,十多分鐘掛了2次,每次掛了之後就簽不出來了,只能等半小時,然後在taskctl的QQ群里咨詢了,給的解決方案是 http://www.taskctl.com/forum/detail_58.html ,我按照步驟操作時發現ctladmin登錄不了,在群里 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...