MySQL筆記(2)

來源:互聯網
上載者:User

標籤:zmq2   asd   zll   style   pat   hbm   clj   tcap   ane   

SQL 的約束

約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的完整性、唯一性。、

1 約束分類

約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的完整性、唯一性。

在MySQL中,通常有這幾種約束:

約束類型: 主鍵 預設值 唯一 外鍵 非空
關鍵字: PRIMARY KEY DEFAULT UNIQUE FOREIGN KEY NOT NULL
 刪除庫語句為:
1 DROP DATABASE <資料庫名>
2主鍵

主鍵 (PRIMARY KEY)是用於約束表中的一行,作為這一行的唯一識別碼,在一張表中通過主鍵就能準確定位到一行,因此主鍵十分重要。主鍵不能有重複且不可為空。

1 Id int(10)primary key2 constraint <主鍵名> primary key (主鍵)  eg constraint <app_pk> primary key (name)3 constraint <主鍵名> primary key (主鍵,主鍵) eg constraint <app_pk> primary key (id,name)     4 複合主鍵。主鍵不僅可以是表中的一列,也可以由表中的兩列或多列來共同標識
3 預設值約束

預設值約束 (DEFAULT) 規定,當有 DEFAULT 約束的列,插入資料為空白時,將使用預設值。

1 people_num int(10) default ‘10‘,      people_num有DEFAULT約束,預設值為10

DEFAULT 約束只會在使用 INSERT 語句時體現出來,INSERT語句中,如果被 DEFAULT 約束的位置沒有值,那麼這個位置將會被 DEFAULT 的值填充,如語句:

1 # 正常插入資料2 INSERT INTO department(dpt_name,people_num) VALUES(‘dpt1‘,11);3 4 #插入新的資料,people_num 為空白,使用預設值5 INSERT INTO department(dpt_name) VALUES(‘dpt2‘);

4 唯一約束

唯一約束 (UNIQUE) 比較簡單,它規定一張表中指定的一列的值必須不能有重複值,即這一列每個值都是唯一的。

1 unique (phone),   unique約束,phone的值唯一

當 INSERT 語句新插入的資料和已有資料重複的時候,如果有 UNIQUE約束,則 INSERT 失敗,比如:

1 INSERT INTO people VALUES(01,110110);2 INSERT INTO people VALUES(02,110110,);

5 外鍵約束

外鍵 (FOREIGN KEY) 既能確保資料完整性,也能表現表之間的關係。

一個表可以有多個外鍵,每個外鍵必須 REFERENCES (參考) 另一個表的主鍵,被外鍵約束的列,取值必須在它參考的列中有對應值。

在 INSERT 時,如果被外鍵約束的值沒有在參考列中有對應,則INSERT 失敗:

1 INSERT INTO abc VALUES(01,110111);

可見之後將 110111 改為110110,則插入成功:

6 非空約束

非空約束 (NOT NULL),聽名字就能理解,被非空約束的列,在插入值時必須非空。

1 age int(10),                              沒有非空約束2 phone int(12) not NULL,           有非空約束

在MySQL中違反非空約束,不會報錯,只會有警告,比如以下語句:

#INSERT 成功 age 為空白,因為沒有非空約束,表中顯示 NULLINSERT INTO pp(id ,phone) VALUES(01,110); #警告 phone 被非空約束,值為空白,表中顯示0INSERT INTO pp(id ,age) VALUES(02,110);

結果,出現警告,但還是插入資料成功,(5.5.50版本)5.6 版本以上的 MySQL 會報錯,禁止插入不符合非空約束的資料:

此時 pp表的內容為:

SELECT語句詳解

在資料庫動作陳述式中,使用最頻繁,也被認為最重要的是 SELECT 查詢語句。前面用到了 SELECT * FROM table_name; 這條語句用於查看一張表中的所有內容。

而 SELECT 與各種限制條件關鍵詞搭配使用,具有各種豐富的功能,這次實驗就進行詳細介紹。

1 基本的SELECT語句

SELECT 語句的基本格式為:

1 SELECT 要查詢的列名 FROM 表名字 WHERE 限制條件;

如果要查詢表的所有內容,則把 要查詢的列名 用一個星號 * 號表示,代表要查詢表中所有的列。

有時只需要查看某個表的指定的列,比如要查看people 表的 name 和 age:

1 SELECT name,age FROM people;
2 數學符號條件

SELECT 語句常常會有 WHERE 限制條件,用於達到更加精確的查詢。WHERE限制條件可以有數學符號 (=,<,>,>=,<=) ,剛才我們查詢了 name 和 age,現在稍作修改:

1 SELECT name,age FROM people WHERE age>25;

篩選出 age 大於 25 的結果。

或者尋找一個名字為 Mary 的人的 name,age 和 phone:

1 SELECT name,age,phone FROM people WHERE name=‘Mary‘;
3 “AND”與“OR”

從這兩個單詞就能夠理解它們的作用。WHERE 後面可以有不止一條限制,而根據條件之間的邏輯關係,可以用 OR(或) AND(且) 串連:

1 #篩選出 age 小於 25,或 age 大於 302 SELECT name,age FROM people WHERE age<25 OR age>30;
1 #篩選出 age 大於 25,且 age 小於 302 SELECT name,age FROM people WHERE age>25 AND age<30;

而剛才的限制條件 age>25 AND age<30 ,如果需要包含25和30這兩個數位話,可以替換為 age BETWEEN 25 AND 30

4 IN 和 NOT IN

關鍵詞INNOT IN的作用和它們的名字一樣明顯,用於篩選“在”“不在”某個範圍內的結果,比如說我們要查詢在dpt3dpt4的人:

1 SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt IN (‘dpt3‘,‘dpt4‘);

NOT IN的效果則是,如下面這條命令,查詢出了不在dpt1也不在dpt3的人:

1 SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt NOT IN (‘dpt1‘,‘dpt3‘);
5 萬用字元

關鍵字 LIKE 在SQL語句中和萬用字元一起使用,萬用字元代表未知字元。SQL中的萬用字元是 _% 。其中 _ 代表一個未指定字元,% 代表不定個未指定字元。

比如,要只記得電話號碼前四位元為1101,而後兩位忘記了,則可以用兩個 _ 萬用字元代替:

1 SELECT name,age,phone FROM employee WHERE phone LIKE ‘1101__‘;

另一種情況,比如只記名字的首字母,又不知道名字長度,則用 % 萬用字元代替不定個字元:

1 SELECT name,age,phone FROM employee WHERE name LIKE ‘J%‘;

這樣就尋找出了首字母為 J 的人。

6 對結果排序

有時可能需要對結果按某一列來排序,這就要用到 ORDER BY 排序關鍵詞。預設情況下,ORDER BY的結果是升序排列,而使用關鍵詞ASCDESC可指定升序降序排序。

比如,我們按salary降序排列,SQL語句為:

1 SELECT name,age,salary,phone FROM employee ORDER BY salary DESC;
7 SQL 內建函數和計算

SQL 允許對錶中的資料進行計算。對此,SQL 有 5 個內建函數,這些函數都對 SELECT 的結果做操作:

函數名: COUNT SUM AVG MAX MIN
作用: 計數 求和 求平均值 最大值 最小值

其中 COUNT 函數可用於任何資料類型(因為它只是計數),而 SUM 、AVG 函數都只能對數字類資料類型做計算,MAX 和 MIN 可用於數值、字串或是日期時間資料類型。

具體舉例,比如計算出salary的最大、最小值,用這樣的一條語句:

1 SELECT MAX(salary) AS max_salary,MIN(salary) FROM employee;

使用AS關鍵詞可以給值重新命名

8 子查詢

上面討論的 SELECT 語句都僅涉及一個表中的資料,然而有時必須處理多個表才能獲得所需的資訊。例如:想要知道名為 "Tom" 的員工所在部門做了幾個工程。員工資訊儲存在 employee 表中,但工程資訊儲存在project 表中。

對於這樣的情況,我們可以用子查詢:

1 SELECT of_dpt,COUNT(proj_name) AS count_project FROM project2 WHERE of_dpt IN3 (SELECT in_dpt FROM employee WHERE name=‘Tom‘);

子查詢還可以擴充到3層、4層或更多層。

9 串連查詢

在處理多個表時,子查詢只有在結果來自一個表時才有用。但如果需要顯示兩個表或多個表中的資料,這時就必須使用串連 (join) 操作。

串連的基本思想是把兩個或多個表當作一個新的表來操作,如下:

1 SELECT id,name,people_num2 FROM employee,department3 WHERE employee.in_dpt = department.dpt_name4 ORDER BY id;

另一個串連語句格式是使用 JOIN ON 文法,剛才的語句等同於:

1 SELECT id,name,people_num2 FROM employee JOIN department3 ON employee.in_dpt = department.dpt_name4 ORDER BY id;

結果也與剛才的語句相同。

MySQL筆記(2)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.