MYSQL基礎操作之數據約束與關聯查詢

来源:http://www.cnblogs.com/vastsum/archive/2016/10/25/5993570.html
-Advertisement-
Play Games

一、MYSQL約束 1.預設值約束,當欄位沒有插入值的時候,mysql自動給該欄位分配預設值。 預設值的欄位允許為空。 對預設值欄位也可以插入null。 2.非空約束 2.1非空欄位必須賦值(錯誤顯示) 2.2不能插入null(錯誤顯示) 3.唯一約束 下麵語句執行發生錯誤 錯誤提示 4.主鍵約束( ...


 一、MYSQL約束

1.預設值約束,當欄位沒有插入值的時候,mysql自動給該欄位分配預設值。
預設值的欄位允許為空。
對預設值欄位也可以插入null。

1 CREATE TABLE STUDENT(
2     ID INT,
3     NAME VARCHAR(20),
4     ADDRESS VARCHAR(20) DEFAULT '京口區'
5 );
6 INSERT INTO STUDENT (ID, NAME ) VALUES (1,'張三');
7 INSERT INTO STUDENT (ID , NAME,ADDRESS ) VALUES (2,'李四' ,NULL);

 

2.非空約束

1 CREATE TABLE STUDENT(
2     ID INT,
3     NAME VARCHAR(20),
4     GENDER VARCHAR(2) NOT NULL
5 );

 

2.1非空欄位必須賦值(錯誤顯示)

INSERT INTO STUDENT (ID , NAME) VALUES(1, '李四');

 

2.2不能插入null(錯誤顯示

INSERT INTO STUDENT (ID , NAME) VALUES (1, '張三' ,NULL);

 

 

3.唯一約束

1 CREATE TABLE STUDENT (
2     ID INT UNIQUE,
3     NAME VARCHAR(20)
4 );
5 INSERT INTO STUDENT (ID , NAME) VALUES (1, '張三');

 

下麵語句執行發生錯誤

INSERT INTO STUDENT (ID , NAME) VALUES (1, '李四');

 

錯誤提示

4.主鍵約束(非空+唯一),通常每張表都會設置一個主鍵欄位。用於標註表記錄的唯一性。
 主鍵一般都是沒有業務含義的。

1 CREATE TABLE STUDENT(
2     ID INT PRIMARY KEY,
3     NAME VARCHAR(20)
4 );
5 
6 INSERT INTO STUDENT (ID , NAME) VALUES (1, '張三');

下麵語句執行顯示錯誤

INSERT INTO STUDENT (ID , NAME ) VALUES (NULL , '李四');

錯誤提示

下麵錯誤也是一種錯誤

INSERT INTO STUDENT (ID ,NAME ) VALUES (1, '李四');

5.自增長約束
可以自動的遞增

 CREATE TABLE STUDENT(
    ID INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
);
INSERT INTO STUDENT (NAME) VALUES ('張三');
INSERT INTO STUDENT (NAME) VALUES ('李四');

整表數據刪除,不影響自增的刪除語句

DELETE FROM STUDENT;

刪除表之後再次(不用再創建表),添加插入語句如圖所示

刪除表中所有數據,刪除外鍵也是用這個語句。

DELETE FROM STUDENT;

再次插入數據

6.外鍵約束

被約束的表為副表,外鍵設置在副表上

eg:創建員工表(副表),創建部門表(主表),先創建主表,再創建副表

CREATE TABLE DEPT(
    ID INT PRIMARY KEY,
    DEPTID VARCHAR(20)
);

INSERT INTO DEPT (ID , DEPTNAME) VALUES (1, '軟體設計部門');
INSERT INTO DEPT (ID , DEPTNAME) VALUES (2, '人事部');
INSERT INTO DEPT (ID , DEPTNAME) VALUES (3, '財務部');
INSERT INTO DEPT (ID , DEPTNAME) VALUES (4, '運營部');

CREATE TABLE EMPLOYEE(
    ID INT PRIMARY KEY AUTO_INCREMENT,
    EMPNAME VARCHAR(20),
    DEPTID INT,
    CONSTRAINT EMPLOYEE_DEPT_FK FOREIGN KEY (DEPTID) REFERENCES DEPT(ID)
);

INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('張三' , 1);
INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('李四' , 2);
INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('王五' , 3);
INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('趙六' , 4);

查詢兩張表

7.下麵進行級聯關聯,意味著,當主表修改時,副表也修改

修改以上表的創建語句,並重新插入新的語句

 1 DROP TABLE EMPLOYEE;
 2 
 3 CREATE TABLE EMPLOYEE(
 4     ID INT PRIMARY KEY AUTO_INCREMENT,
 5     EMPNAME VARCHAR(20),
 6     DEPTID INT,
 7     CONSTRAINT EMPLOYEE_DEPT_FK FOREIGN KEY (DEPTID) REFERENCES DEPT(ID) ON UPDATE CASCADE ON DELETE CASCADE
 8 );
 9 
10 INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('張三' , 1);
11 INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('李四' , 2);
12 INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('王五' , 3);
13 INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('趙六' , 4);

查詢如圖所示

修改主表的一條記錄

UPDATE DEPT SET ID=5 WHERE ID=4;

主表的運行結果

副表的運行結果

--------------------------------------------------------------------------------------

二、關聯查詢

1.交叉查詢

SELECT * FROM EMPLOYEE,DEPT;

2.內連接查詢

多表查詢規則:1)查詢哪些表    2)確定哪些欄位    3)表與表之間的查詢條件(連接表的數量-1)

1 SELECT EMPNAME , dept.DEPTNAME
2         FROM EMPLOYEE
3         INNER JOIN DEPT
4         ON EMPLOYEE.DEPTID = DEPT.ID;

3.使用別名

1 SELECT EMPNAME AS '員工姓名', D.DEPTNAME AS '部門' -- 註意這裡的D
2                 FROM EMPLOYEE AS E
3                 INNER JOIN DEPT AS D
4                 ON E.DEPTID = D.ID;

4.左外連接查詢,左邊的數據一定會完全顯示。查詢時先寫左表

首先我們改造一下副表

UPDATE EMPLOYEE SET DEPTID = NULL WHERE  ID= 4;

 

 

 

如果是內連接查詢則顯示

如果左連接查詢

1  SELECT    D.DEPTNAME, E.EMPNAME
2                  FROM DEPT AS D -- 左表
3                  LEFT OUTER JOIN EMPLOYEE AS E -- 右表
4                  ON D.ID = E.DEPTID;

 

右連接其實和左連接一樣,只是查詢表的位置不同,下麵是右連接,顯示的和左連接的相同

1  SELECT D.DEPTNAME,E.EMPNAME
2                 FROM EMPLOYEE AS E-- 左表
3                 RIGHT JOIN DEPT AS D -- 右表
4                 ON E.ID = D.ID;

 

5.自連接查詢,自連接查詢一般應用於表數據為樹狀結構。

首先我們創建表並查詢

 1 CREATE TABLE PERSON(
 2     ID INT PRIMARY KEY AUTO_INCREMENT,
 3     NAME VARCHAR(20),
 4     BOSSID INT
 5 );
 6 
 7 INSERT INTO PERSON (NAME,BOSSID) VALUES ('張三',NULL);
 8 INSERT INTO PERSON (NAME,BOSSID) VALUES ('李四',1);
 9 INSERT INTO PERSON (NAME,BOSSID) VALUES ('王五',2);
10 INSERT INTO PERSON (NAME,BOSSID) VALUES ('趙六',3);
11 INSERT INTO PERSON (NAME,BOSSID) VALUES ('李七',3);
12 
13 SELECT P.NAME AS '老闆' ,B.NAME AS '員工'
14     FROM PERSON AS P
15     RIGHT JOIN PERSON AS B
16     ON P.ID = B.BOSSID;

 

顯示結果

註意上面創建表的BOSSID的結構。


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

-Advertisement-
Play Games
更多相關文章
  • Hadoop集群搭建安裝過程(三)(圖文詳解 盡情點擊!!!) 一、JDK的安裝 安裝位置都在同一位置(/usr/tools/jdk1.8.0_73) jdk的安裝在克隆三台機器的時候可以提前安裝,通過scp使安裝文件和環境配置(/etc/profile)都拷貝過去,並使三台機 器都通過(sourc ...
  • 對於大神來說,不看都知道,但是對於和我一樣的菜鳥,就需要解釋一下了。 a,b是數據表名稱,c,d,e,f是數據。而c,d,e,f這些數據不一定非得來自b表,可以來自left join,right join和內連接查詢出來的結果 個人覺得使用起來還是比較方便的。 1 SELECT c,d,e FROM ...
  • 業務運行一段時間,發現原來的主鍵設置並不合理,這個時候,想變更主鍵。這種需求在實際生產中還是蠻多的。 下麵,看看pt-online-schema-change解決這類問題的處理方式。 首先,創建一張測試表 create table t2(c1 int primary key, c2 int); 構造 ...
  • 在開髮網站時,我們需要對用戶註冊的郵箱進行核對與驗證,用戶填寫的郵箱是否有效郵箱。好吧,我們先從資料庫入手,修改用戶表讓用戶有填寫email的欄位,添加了2個欄位: ALTER TABLE [dbo].[Users] ADD [Email] VARCHAR(100) NULL, [IsVerify] ...
  • ORA-00001: 違反唯一約束條件 (.) ORA-00017: 請求會話以設置跟蹤事件 ORA-00018: 超出最大會話數 ORA-00019: 超出最大會話許可數 ORA-00020: 超出最大進程數 () ORA-00021: 會話附屬於其它某些進程;無法轉換會話 ORA-00022:  ...
  • Hadoop集群搭建(一)(上篇中講到了Linux虛擬機的安裝) 一、安裝所需插件(以hadoop2.6.4為例,如果需要可以到官方網站進行下載:http://hadoop.apache.org) hadoop2.6.4插件、已經裝好的虛擬機(CentOS,這個百度一下自行安裝)、虛擬機安裝後將其克 ...
  • 配置Spark standalone HA 主機:node1,node2,node3 master: node1,node2 slave:node2,node3 修改配置文件: node1,node3: spark-env.sh node2: spark-env.sh node2與node1的差別僅 ...
  • 使用sqlserver和IIS開發.net B/S程式時,數據量逐漸增多,用戶也逐漸增多,那麼伺服器的穩定性就需要維護了。資料庫如何占用更小記憶體,無用的日誌如何瞬間清空? ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...