1. 程式人生 > >MySQL中的查詢約束語句和主鍵、聯合主鍵、外來鍵

MySQL中的查詢約束語句和主鍵、聯合主鍵、外來鍵

查詢語句

過濾空值

    過濾空值 如果該值是空的 就當做0來處理
    SELECT IFNULL(欄位名,0) FROM 表名

聚合函式

    排序
    利用ORDER BY 關鍵字 來 約束表按照什麼 條件來排序
    ASC代表升序 也是預設的
    DESC代表降序
    SELECT 欄位名 FROM 表名 ORDER BY 欄位名 ASC 

    聚合函式:
        SUM AVG MAX MIN COUNT
            SUM AVG MAX MIN 都可以自動過濾掉NULL,且不當做0處理

    查詢表的記錄數 關鍵字COUNT
查詢的是填寫的欄位名有幾條記錄,一行代表一條記錄 SELECT COUNT(欄位名) FROM 表名;
查詢總和 關鍵字 SUM 查詢的是 某個欄位的所有資料總和 這個欄位得是全數字 SELECT SUM(欄位名) FROM 表名; 查詢最大值 關鍵字MAX SELECT MAX (欄位名) FROM 表名; 查詢最小值 關鍵字MIN SELECT MIN(欄位名) FROM 表名; 查詢平均值 關鍵字 AVG SELECT AVG(欄位名) FROM 表名;

分組查詢

    分組查詢 GROUP
BY 關鍵字 SELECT 欄位名 FROM 表名 GROUP BY 欄位名 注意:分組查詢時,查詢的欄位必須是分組的欄位 因為記錄數要對應, 例如查詢的欄位名可能有3條記錄,而分組的欄位只有2條記錄, 不能構成一個表格,就會報錯

按條件查詢

    按條件查詢 HAVING 關鍵字
    SELECT 欄位名 FROM 表名 HAVING 篩選條件

    例如:查詢工資總和大於9000的部門編號以及工資和
    SELECT deptno,SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000
;
HAVING條件要放在分組之後且可以使用函式 而WHERE是分組之前使用的篩選條件,且不能使用函式

分頁查詢

    分頁查詢 LIMIT 關鍵字
    SELECT 欄位名 FROM 表名 LIMIT 起始頁,一共顯示幾條記錄

    這裡的起始頁,如果是從第一頁開始查詢,那麼起始頁就是0

模糊查詢

    模糊查詢 LIKE % 或 _ 關鍵字 
    %代表0-n個字元 
    _代表一個字元

    // 查詢emp表格中 開頭是w後面是任意幾個字元的記錄
    //w 後有0-n個字元 的記錄 都可以被查詢到
    SELECT * FROM emp WHERE ename LIKE 'w%';
    // 查詢表格中 只要帶有w字元的記錄
    // w前有0-n個字元 w後有0-n個字元 都可以被查詢到
    SELECT * FROM emp WHERE ename LIKE '%w%';
    // 查詢表格中 w後只帶有1個字元的記錄
    // 0個和超過1個字元的記錄都不會被查詢到
    SELECT * FROM emp WHERE ename LIKE 'w_';
    // 查詢表格中 w後只帶有3個字元的記錄
    // 0個和超過3個字元的記錄都不會被查詢到
    SELECT * FROM emp WHERE ename LIKE 'w___';

主鍵

    主鍵 PRIMARY KEY 的特點:
        1.唯一
        2.不能是空的
    在建立表的時候 新增主鍵 可以保證資料的完整性

    新增主鍵的方式一:
    CREATE TABLE 表名(
        欄位名 屬性 PRIMARY KEY(主鍵),
    );

    新增主鍵的方式二:
    CREATE TABLE 表名(
        欄位名 屬性,
        PRIMARY KEY(要設為主鍵的欄位名)
    );

    方式二的好處: 可以新增聯合主鍵

    一旦確定主鍵,那麼表中被設定為主鍵的屬性就不能出現重複的,且不能為NULL

    建立方式三:
    CREATE TABLE 表名(
        欄位名 屬性
    );
    ALTER TABLE 表名 ADD CONSTRAINT PRIMARY KEY(要設定為主鍵的欄位名)

    ADD CONSTRAINT 是新增約束的意思

聯合主鍵

    CREATE TABLE 表名(
        欄位名1 屬性1,
        欄位名2 屬性2,
        欄位名3 屬性3,
        // 新增聯合主鍵
        PRIMARY KEY(欄位名1,欄位名2)
    );

    當設定聯合主鍵時,只要聯合主鍵不完全一致,都可以插入到資料庫中
        例如:
        欄位名1       欄位名2      欄位名3
          1              1            a    --可以
          1              2            a    --可以
          2              1            a    --可以
          2              2            a    --可以
          1              1            a    --不可以
          1              2            a    --不可以
          2              2            a    --不可以
          2              1            a    --不可以

    前四條記錄不完全一樣,
    所以可以被插入到資料庫中,
    但是後四條記錄在前四條中已經插入過了,
    所以不能再被插入到資料庫中,
    所以只要設定了聯合主鍵的兩個欄位不完全一樣,
    就可以被插入到資料庫中
    而欄位三沒有被設定聯合主鍵,所以完全一樣或者不一樣,
    都沒有什麼區別

外來鍵

    外來鍵的作用:
        引用完整性(外來鍵約束 讓表與表之間,通過欄位建立聯絡)


    設定外來鍵 FOREIGN KEY 關鍵字
    外來鍵要設定在從表中
    CONSTRAINT fk_從表名_設定外來鍵的欄位名 FOREIGN KEY(設定外來鍵的欄位名) REFERENCES 主表名(主表中,要和外來鍵繫結的欄位名)

    // fk_從表名_設定外來鍵的欄位名 
    // 這是自己取的名字,取什麼都可以
    // 但是這樣取名方便理解,一看就明白
    // fk代表外來鍵的意思

    建立時,要先建立主表再建立從表,
    因為沒有主表字段,
    那麼從表的欄位存在就沒有任何意義了

    刪除記錄的時候要先刪除從表中的記錄,
    如果先刪除主表的記錄,
    那麼從表的記錄就完全沒有意義了,
    所以要先刪除從表的記錄

    -- 主表
    CREATE TABLE student(
        sid INT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        sex VARCHAR(100) DEFAULT 'nan'
    );
    -- 從表
    CREATE TABLE score(
        id INT ,
        score INT NOT NULL,
        sid INT,
        -- 建立外來鍵 建立表聯絡
        -- FOREIGN KEY(當前表的欄位)
        -- REFERENCES student(sid);
        CONSTRAINT fk_score_sid FOREIGN KEY(sid) REFERENCES student7(sid)
    );

主表
這裡寫圖片描述

從表
這裡寫圖片描述

這裡主表的sid和從表的sid是互相對應的


    第二種新增外來鍵的方式:
        ALTER TABLE 從表名 ADD CONSTRAINT fk_從表名_設定外來鍵的欄位名 FOREIGN KEY(sid) REFERENCES stu(id);

        // fk_從表名_設定外來鍵的欄位名 
        // 這是自己取的名字,取什麼都可以
        // 但是這樣取名方便理解,一看就明白
        // fk代表外來鍵的意思

唯一約束

    唯一約束 UNIQUE 關鍵字
    (不能重複,可以為有空值)
    CREATE TABLE 表名(
        欄位名1 屬性1,
        欄位名2 屬性2 UNIQUE
    );

自動增長列

    自動增長列 auto_increment 關鍵字

    CREATE TABLE 表名(
        欄位名1 屬性1 auto_increment,
        欄位名2 屬性2
    );

    這裡如果當欄位名1為主鍵時,也可以插入NULL
    因為這個關鍵字會自動給欄位新增值,
    且是+1增長的

域完整性

限制單元格的資料內容

    值不為空 NOT NULL 關鍵字
    CREATE TABLE 表名(
        欄位名1 屬性1 NOT NULL,
        欄位名2 屬性2
    );

    當插入資料時,欄位1不能為空


    預設值 DEFAULT 關鍵字
    CREATE TABLE 表名(
        欄位名1 屬性1 DEFAULT 預設值
    );

    當插入資料時,
    欄位1沒有填,
    那麼就會自動將 預設值填上去

    例如:
    CREATE TABLE student(
        gender VARCHAR(100) DEFAULT 'nan'
    );  

    當插入資料 gender 沒有填的時候,
    會預設將 'nan' 填上去