1. 程式人生 > >MySQL入門很簡單——讀書筆記

MySQL入門很簡單——讀書筆記

第八章 檢視
試圖是從一個或多個表中匯出來的表,是一種虛擬存在的表。檢視就像一個視窗,通過這個視窗,可以看到系統專門提供的資料。這樣,使用者可以只看到對自己有用的資料,而不用看到整個資料表中的其他資料。
8.1檢視簡介
8.1.1 檢視是一種虛擬的表,是從資料庫中一個或多個表中匯出來的表。檢視還可以從已經存在的檢視的基礎上定義。
資料庫中只存在了檢視的定義,而並沒有存放檢視中的資料。使用檢視進行查詢時,資料庫系統會從原來的表中取出對應的資料。
檢視是在原有的表或者檢視的基礎上重新定義的虛擬表,這可以從原有的表上選取對使用者有用的資訊。那些對使用者沒用,或者使用者沒有許可權去了解的資訊,都可以直接遮蔽掉。
這樣既使應用簡單化,也保證了系統的安全。
檢視的作用:
1.使操作簡單化:檢視需要達到的目的是所見即所需。從試圖看到的資訊就是所需要了解的資訊。檢視可以簡化對資料的操作。
2.增加資料的安全性:通過檢視,使用者只能查詢和修改指定的資料,指定資料以外的資訊,使用者根本接觸不到。
資料庫授權命令可以限制使用者的操作許可權,但不能先知道特定行和列上。使用檢視後,可以簡單方便的將使用者的許可權先知道特定的行和列上。
保證敏感資訊不會被沒有許可權的人看到,保證一些機密資訊的安全。
3.提高表的邏輯獨立性:檢視可以遮蔽原有表結構變化帶來的影響。原有增加列、刪除列和未被引用的列,對檢視不會造成影響。
同樣,如果修改了表中的某些列,可以使用修改檢視來解決這系列帶來的影響。
8.2建立檢視
8.2.1建立檢視的語法形式 
CREATE [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW 檢視名 [(屬性清單)] AS SELECT 語句 [WITH [CASCADED|LOCAL] CHECK OPTION];
ALGORITHM 表示檢視選擇的演算法;UNDEFINED 是MySQL自動選擇所要使用的演算法, MERGE 表示將使用檢視的語句與檢視定義合併起來,使得檢視定義的某一部分取代語句對應的部分;TEMPTABLE 將檢視的結果存入臨時表,然後使用臨時表執行語句。
CASCADED 表示更新檢視時要滿足所有相關檢視和表的條件,該引數為預設值;LOCAL 表示更新檢視時,要滿足該檢視本身定義的條件即可。
技巧:使用 CREATE VIEW 語句建立檢視時,最好加上 WITH CHECK OPTION 引數,而且最好加上 CASCADED 引數。這樣,從檢視上派生出來的新檢視後,更新新檢視需要考慮其父檢視的約束條件。這種方式比較嚴格,可以保證資料的安全性。
建立檢視,需要有 CREATE VIEW 的許可權。
SELECT SELECT_priv,CREATE_view_priv FROM mysql.user WHERE user='root';
8.2.2 在單表上建立檢視
CREATE VIEW department_view1 AS SELECT * FROM department;
DESC department_view1;
建立帶屬性清單的檢視 
CREATE VIEW department_view2(name,function,location)
AS SELECT d_name,function,address FROM department;
DESC department_view2;
8.2.3在多表上建立檢視
use test;
use job;
DESC department;
DESC department;
CREATE TABLE department(
d_id INT(4) NOT NULL PRIMARY KEY,
d_name VARCHAR(20) NOT NULL UNIQUE,
function VARCHAR(50),
address VARCHAR(50)
);
DESC worker;
CREATE ALGORITHM=MERGE VIEW worker_view1(name,department,sex,age,address) 
AS SELECT name,department.d_name,sex,2009-birthday,worker.address FROM worker,department WHERE worker.d_id=department.d_id 
WITH LOCAL CHECK OPTION;
2009-birthday 對應 age
DESC worker_view1;
8.3檢視檢視
DESCRIBE worker_view1;
DESC worker_view1;
8.3.2 SHOW TABLE STATUS LIKE '檢視名';檢視檢視基本資訊
SHOW TABLE STATUS LIKE 'worker_view1';
mysql> show table status like 'worker_view1';
+--------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+---------+
| Name         | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+--------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+---------+
| worker_view1 | NULL   | NULL    | NULL       | NULL | NULL           | NULL        | NULL            | NULL         | NULL      | NULL           | NULL        | NULL        | NULL       | NULL      | NULL     | NULL           | VIEW    |
+--------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+---------+
表的說明(Comment)項的值為WIEW,說明該表為檢視。儲存引擎、資料長度等資訊顯示為  NULL ,說明該表是虛擬表,與普通表有差異。同樣使用 SHOW TABLE STATUS LIKE 'department';
mysql> show table status like 'department';
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name       | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| department | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |   8388608 | NULL           | 2015-05-07 03:30:39 | NULL        | NULL       | utf8_general_ci | NULL     |                |         |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
department表的基本資訊都顯示出來,包括儲存引擎、建立時間等。但是Comment項沒有資訊。這就是檢視和普通表最直接的區別。
使用 SHOW TABLE STATUS LIKE '表名/檢視名'; 檢視各個屬性顯示 NULL ,只有 Comment 顯示值為 VIEW。而普通表各個屬性顯示正常,只有 Comment 無任何顯示。
8.3.3 SHOW CREATE VIEW 檢視檢視詳細(其實是所有)資訊
語句 SHOW CREATE VIEW 檢視名;
SHOW CREATE VIEW worker_view1;
mysql> SHOW CREATE VIEW worker_view1;
+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View         | Create View                                                                                                                                                                                                                                                                                                                                                                | character_set_client | collation_connection |
+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| worker_view1 | CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `worker_view1` AS select `worker`.`name` AS `name`,`department`.`d_name` AS `department`,`worker`.`sex` AS `sex`,(2009 - `worker`.`birthday`) AS `age`,`worker`.`address` AS `address` from (`worker` join `department`) where (`worker`.`d_id` = `department`.`d_id`) WITH LOCAL CHECK OPTION | utf8                 | utf8_general_ci      |
+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
8.3.4 在 VIEWS 表中查詢所有檢視詳細資訊,通常情況下使用 SHOW CREATE VIEW 檢視名; 進行查詢
SELECT * FROM information_schema.VIEWS;
8.4修改檢視
①. CREATE OR REPLACE VIEW
②. ALTER
8.4.1 CREATE OR REPLACE VIEW 語句修改檢視
語句: CREATE OR REPLACE VIEW [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW 檢視名 [(屬性清單)] AS SELECT 語句 [WITH [CASCADED|LOCAL] CHECK OPTION];
eg: CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW department_view1(department,function,location) AS SELECT d_name,function,address FROM department;
DESC department_view1;
8.4.2 ALTER 語句修改檢視
語句: ALTER [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW 檢視名 [(屬性清單)] AS SELECT 語句 [WITH [CASCADED|LOCAL] CHECK OPTION];
eg:
ALTER VIEW department_view2(department,name,sex,location) 
AS SELECT d_name,worker.name,worker.sex,worker.address 
FROM department,worker 
WHERE department.d_id=worker.d_id 
WITH CHECK OPTION;
8.5 更新檢視
包括插入(INSERT)、更新(UPDATA)、刪除(DELETE)表中的資料。
SELECT * from department;
INSERT INTO department VALUES
(1001,'人事部','管理公司人事變動','2號樓3層'),
(1002,'生產部','主管生產','5號樓1層');
CREATE VIEW department_view3(name,function,address) 
AS SELECT d_name,function,address 
FROM department 
WHERE d_id=1001;
SELECT * FROM department_view3;  
等價於
UPDATE department SET d_name='科研部',function='新產品研發',address='3號樓5層' WHERE d_id=1001;
不可更新的檢視:
①檢視中含有 SUM()、COUNT()、MAX()、MIN()等函式
eg: CREATE VIEW worker_view4(name,sex,total) 
AS SELECT name,sex,COUNT(name) FROM worker;
②檢視中包含 UNION/UNION ALL/DISTINCT/GROUP BY/HAVING 等關鍵字。
eg: CREATE VIEW worker_view5(name,sex,address) AS SELECT name,sex,homeaddress FROM worker GROUP BY d_id;
③常量檢視
eg: CREATE VIEW worker_view6 AS SELECT 'Aric' as name;
mysql > UPDATE worker_view6 SET name='aaa';
ERROR 1228(HY000):The target table worker_view6 of the UPDATE is not updatable
④檢視中包含子查詢
eg: CREATE VIEW worker_view7(name) AS SELECT (SELECT name FROM worker);
⑤由不可更新的檢視匯出的檢視
eg: CREATE VIEW worker_view8 AS SELECT * FROM worker_view7;
mysql > UPDATE worker_view8 SET name='Aric';
ERROR 1288(HY00):The target table worker_view8 of the UPDATE is not updatable
⑥建立檢視時, ALGORITHM 為 TEMPTABLE 型別。
eg: CREATE ALGORITHM=TEMPTABLE VIEW worker_view9 AS SELECT * FROM worker;
⑦試圖對應的表上存在沒有預設值的列,而且該列沒有包含在視圖裡。
⑧ WITH [CASCADED|LOCAL] CHECK OPTION也將決定檢視是否更新。沒有指明時,預設為 CASCADED
eg: 
mysql > CREATE VIEW view_test AS SELECT * FROM worker WHERE age<25 WITH LOCAL CHECK OPTION;
mysql > CREATE VIEW view_test1 AS SELECT * FROM view_test WHERE age>15 WITH LOCAL CHECK OPTION;
mysql > CREATE VIEW view_test2 AS SELECT * FROM worker WHERE sex='F' WITH CASCADED CHECK OPTION;
view_test1 和 view_test2 這兩個檢視是在 view_test 的基礎上建立而成的。
更新 view_test1
mysql > UPDATE view_test1 SET age=26 WHERE num=1; 試圖更新成功,因為條件 age=26 滿足 view_test1 中 age>15 的條件。
更新 view_test2
mysql > UPDATE view_test2 SET age=26 WHERE num=2; ERROR : CHECK OPTION failed....  檢視二更新失敗是因為不滿足檢視 view_test 中 age<25 的條件,所以更新失敗。
8.6 刪除檢視
刪除檢視是指刪除資料庫中已存在的檢視。刪除檢視時,只能刪除檢視的定義,不會刪除檢視的資料。
語句 : DROP VIEW [IF EXISTS] 檢視名列表 [RESTRICT|CASCADE]
eg: DROP VIEW IF EXISTS worker_view1;
mysql > SHOW CREATE VIEW worker_view1; ERROR :TABLE doesnot EXIST.
同時刪除兩個檢視
eg: DROP VIEW IF EXISTS department_view1,department_view2;
mysql > SHOW CREATE VIEW department_view1; ERROR : TABLE doesnot EXIST
mysql > SHOW CREATE VIEW department_view2; ERROR : TABLE doesnot EXIST
檢視使用者的 DROP 許可權
mysql > SELECT DROP_priv FROM mysql.user WHERE user='root';
+-----------+
| drop_priv |
+-----------+
| Y         |
+-----------+
CREATE TABLE work_info(
id INT(10) PRIMARY KEY NOT NULL UNIQUE,#編號
name VARCHAR(20) NOT NULL,#姓名
sex VARCHAR(4) NOT NULL,#性別
age INT(5),#年齡
address VARCHAR(50),#家庭住址
tel VARCHAR(20)#電話號碼
);
CREATE TABLE college(
number INT(10) PRIMARY KEY NOT NULL UNIQUE,#學號
name VARCHAR(20) NOT NULL,#姓名
major VARCHAR(20) NOT NULL,#專業
age INT(5)#年齡
);
CREATE TABLE mytable(
id INT(10) PRIMARY KEY NOT NULL UNIQUE,#編號
name VARCHAR(20) NOT NULL,#姓名
sex VARCHAR(4),#性別
info text#備註
);
第九章 觸發器
觸發器(TRIGGER)是由事件來觸發某個操作。這些事件包括 INSERT 語句, UPDATE , DELETE 語句。eg:當學生表中增加了一個學生的資訊時,學生的總數就必須同時改變。可以在這裡建立一個觸發器,每次增加一個學生的記錄,就執行一次計算學生總數的操作。這樣就可以保證,每次增加學生的紀錄後,學生總數與記錄數是一致的。觸發器觸發的執行語句只有一個,也可能有多個。
語句: CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件 ON 表名 FOR EACH ROW 執行語句;
BEFORE|AFTER 引數指定了觸發器執行的時間,BEFORE 指出發時間之前執行處罰語句,AFTER 表示在觸發事件之後執行觸發語句;"觸發事件"引數是指觸發的條件,其中包括 INSERT 、 UPDATE 、 DELETE 。"表名" 引數觸發事件操作的標的名稱; FOR EACH ROW 表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器;"執行語句" 引數指觸發器被觸發後執行的程式。
eg:
①建立表
CREATE TABLE trigger_time(
exec_time time
);
②建立觸發器
CREATE TRIGGER dept_trig1 BEFORE INSERT ON department FOR EACH ROW INSERT INTO trigger_time VALUES(NOW());
③向 department 表插入資料
SELECT * FROM department;
INSERT INTO department VALUES(1003,'銷售部','負責產品生產','1號樓銷售大廳');
④檢視是否引發觸發器
SELECT * FROM trigger_time;
9.1.2 建立有多個執行語句的觸發器
語句:
delimiter &&
CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件 
ON 表名 FOR EACH ROW
BEGIN 
執行語句1;
執行語句2;
END &&
delimiter;
eg:
①建立觸發器
delimiter &&
CREATE TRIGGER dept_trig2 AFTER DELETE
ON department FOR EACH ROW
BEGIN 
INSERT INTO trigger_time VALUES('21:01:01');
INSERT INTO trigger_time VALUES('22:01:01');
END &&
delimiter;
②刪除資料語句
DELETE FROM department WHERE d_id=1003;
SELECT * FROM trigger_time;
注意:MySQL中,一個表在相同觸發時間的相同觸發事件,只能建立一個觸發器。
9.2檢視觸發器
9.2.1 SHOW TRIGGERS 語句檢視觸發器資訊
語句:
SHOW TRIGGERS;檢視所有觸發器的詳細資訊
mysql> show triggers;
+------------+--------+------------+---------------------------------------------------------------------------------------------------+--------+---------+----------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| Trigger    | Event  | Table      | Statement                                                                                         | Timing | Created | sql_mode                                                       | Definer        | character_set_client | collation_connection | Database Collation |
+------------+--------+------------+---------------------------------------------------------------------------------------------------+--------+---------+----------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| dept_trig1 | INSERT | department | INSERT INTO trigger_time VALUES(NOW())                                                            | BEFORE | NULL    | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
[email protected]
| utf8                 | utf8_general_ci      | utf8_general_ci    |
| dept_trig2 | DELETE | department | BEGIN
INSERT INTO trigger_time VALUES('21:01:01');
INSERT INTO trigger_time VALUES('22:01:01');
END | AFTER  | NULL    | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
[email protected]
| utf8                 | utf8_general_ci      | utf8_general_ci    |
+------------+--------+------------+---------------------------------------------------------------------------------------------------+--------+---------+----------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
查詢指定觸發器的詳細資訊
語句: SELECT * FROM information_schema.triggers WHERE trigger_name='觸發器名';
eg: SELECT * FROM information_schema.triggers WHERE trigger_name='dept_trig1';
mysql> select * from information_schema.triggers where trigger_name='dept_trig1';
+-----------------+----------------+--------------+--------------------+----------------------+---------------------+--------------------+--------------+------------------+----------------------------------------+--------------------+---------------+----------------------------+----------------------------+--------------------------+--------------------------+---------+----------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| TRIGGER_CATALOG | TRIGGER_SCHEMA | TRIGGER_NAME | EVENT_MANIPULATION | EVENT_OBJECT_CATALOG | EVENT_OBJECT_SCHEMA | EVENT_OBJECT_TABLE | ACTION_ORDER | ACTION_CONDITION | ACTION_STATEMENT                       | ACTION_ORIENTATION | ACTION_TIMING | ACTION_REFERENCE_OLD_TABLE | ACTION_REFERENCE_NEW_TABLE | ACTION_REFERENCE_OLD_ROW | ACTION_REFERENCE_NEW_ROW | CREATED | SQL_MODE                                                       | DEFINER        | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | DATABASE_COLLATION |
+-----------------+----------------+--------------+--------------------+----------------------+---------------------+--------------------+--------------+------------------+----------------------------------------+--------------------+---------------+----------------------------+----------------------------+--------------------------+--------------------------+---------+----------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| def             | test           | dept_trig1   | INSERT             | def                  | test                | department         |            0 | NULL             | INSERT INTO trigger_time VALUES(NOW()) | ROW                | BEFORE        | NULL                       | NULL                       | OLD                      | NEW                      | NULL    | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
[email protected]
| utf8                 | utf8_general_ci      | utf8_general_ci    |
+-----------------+----------------+--------------+--------------------+----------------------+---------------------+--------------------+--------------+------------------+----------------------------------------+--------------------+---------------+----------------------------+----------------------------+--------------------------+--------------------------+---------+----------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
9.3 觸發器的使用
DROP TABLE trigger_test;
CREATE TABLE trigger_test(
id INT(4) PRIMARY KEY UNIQUE NOT NULL auto_increment,
info VARCHAR(30)
);
DROP TRIGGER dept_trig1;
DROP TRIGGER before_insert;
delimiter &&
CREATE TRIGGER before_insert BEFORE INSERT
ON department FOR EACH ROW
BEGIN
INSERT INTO trigger_test VALUES(NULL,"before_insert");
END &&
delimiter;
DROP TRIGGER dept_trig2;
DROP TRIGGER after_insert;
delimiter &&
CREATE TRIGGER after_insert AFTER INSERT
ON department FOR EACH ROW
BEGIN
INSERT INTO trigger_test VALUES(NULL,"after_insert");
END &&
delimiter;
DELETE FROM department WHERE d_id=1003;
INSERT INTO department VALUES(1003,'銷售部','負責產品生產','1號銷售大廳');
SELECT * FROM trigger_test;
在啟用觸發器時,對觸發器中的執行語句存在一些限制。例如,觸發器不能包含 START TRANSACTION/COMMIT/ROLLBACK 等關鍵詞,也不能包含 CALL 語句。
在觸發器執行過程中,任何步驟出錯都會阻止程式向下執行。
9.4刪除觸發器
語句: DROP TRIGGER 觸發器名;
eg: DROP TRIGGER dept_trig1;
mysql> select * from information_schema.triggers where trigger_name='dept_trig1';
Empty set
CREATE TABLE product(
id INT(10) PRIMARY KEY NOT NULL UNIQUE,#編號
name VARCHAR(20) NOT NULL,#產品功能
function VARCHAR(50),#主要功能
company VARCHAR(20),#生產廠商
address VARCHAR(50)#家庭住址
);
CREATE TABLE operate(
op_id INT(10) PRIMARY KEY NOT NULL UNIQUE auto_increment,#編號
op_type VARCHAR(20) NOT NULL,#操作方式
op_time time NOT NULL#操作時間
);
CREATE TRIGGER product_af_del AFTER DELETE
ON product FOR EACH ROW
INSERT INTO operate VALUES(NULL,'Delete product',NOW());
第十章 查詢資料
10.1基本查詢語句
語句: 
SELECT 屬性列表 FROM 表名和檢視列表 
[WHERE 條件表示式1] 
[GROUP BY 屬性名1 [HAVING 條件表示式2]]
[ORDER BY 屬性名2 [ASC|DESC]]
CREATE TABLE employee(
num INT(4) PRIMARY KEY UNIQUE NOT NULL,
d_id INT(4) NOT NULL,
name VARCHAR(20) NOT NULL,
age INT(4) NOT NULL,
sex VARCHAR(10),
homeaddr VARCHAR(30)
);
INSERT INTO employee VALUES
(1,1001,'張三',26,'男','北京市海淀區'),
(2,1001,'李四',24,'女','北京市昌平區'),
(3,1002,'王五',25,'男','湖南長沙市'),
(4,1004,'Aric',15,'男','England');
SELECT num,name,age,sex,homeaddr FROM employee;
SELECT * FROM employee;
SELECT * FROM employee WHERE d_id IN(1001,1004);
SELECT * FROM employee WHERE name NOT IN('張三','李四');
SELECT * FROM employee WHERE age BETWEEN 15 AND 25;
SELECT * FROM employee WHERE age NOT BETWEEN 15 AND 25;
SELECT * FROM employee WHERE name LIKE 'Aric';
SELECT * FROM employee WHERE name='Aric';
SELECT * FROM employee WHERE homeaddr LIKE '北京%'; %任意字元(萬用字元)
SELECT * FROM employee WHERE name like 'Ar_c'; _代表一個字元
SELECT * FROM employee WHERE name NOT LIKE '張%';
SELECT * FROM work WHERE info is NULL;
SELECT * FROM work WHERE info is NOT NULL;
SELECT * FROM employee WHERE d_id=1001 AND sex LIKE '男';
SELECT * FROM employee WHERE d_id<1004 AND age<26 AND sex='男';
SELECT * employee WHERE num IN(1,2,3) AND age BETWEEN 15 AND 25 AND homeaddr LIKE '%北京市%';
SELECT * FROM employee WHERE d_id=1001 OR sex LIKE '男';
SELECT * FROM employee WHERE num IN(1,2,3) OR age BETWEEN 24 AND 25 OR homeaddr like '%北京市%';
SELECT * FROM employee WHERE num IN(1,3,4) AND age=25 OR sex='女';
SELECT * FROM employee WHERE sex='女' OR num IN(1,3,4) AND age=25;
SELECT DISTINCT d_id FROM employee;
SELECT * FROM employee ORDER BY age;
SELECT * FROM employee ORDER BY age DESC;
SELECT * FROM employee ORDER BY d_id ASC,age DESC;
10.2.12 分組查詢
語句: GROUP BY [HAVING 條件表示式][WITH ROLLUP];
GROUP BY 關鍵字可以和 GROUP_CONCAT() 函式一起使用。 GROUP_CONCAT() 函式會把每個分組中指定欄位值都顯示出來。同時, GROUP BY 關鍵字通常與集合函式一起使用。集合函式包括 COUNT()/SUM()/AVG()/MAX()/MIN()
SELECT * FROM employee GROUP BY sex;
SELECT sex,GROUP_CONCAT(name) FROM employee GROUP BY sex;
+-----+--------------------+
| sex | GROUP_CONCAT(name) |
+-----+--------------------+
| 女  | 李四               |
| 男  | 張三,王五,Aric     |
+-----+--------------------+
SELECT sex,COUNT(sex) FROM employee GROUP BY sex;
SELECT sex,COUNT(sex) FROM employee GROUP BY sex HAVING COUNT(sex)>=3;
SELECT * FROM employee FROM GROUP BY d_id,sex;  先按d_id分組, 再按sex分組
SELECT sex,COUNT(sex) FROM employee GROUP BY sex WITH ROLLUP; WITH ROLLUP 在資料記錄的最後統計一個記錄數總和,跟 COUNT() 連用。
SELECT sex,COUNT(sex) FROM employee GROUP BY sex WITH ROLLUP;
10.2.12 用 LIMIT 限制查詢結果的數量
1.不指定初始位置
eg: 
SELECT * FROM employee LIMIT 2; 從初始位置開始,顯示前兩條記錄
SELECT * FROM employee LIMIT 6; 從初始位置開始,顯示前6條記錄,如果不足6條,則顯示有的全部記錄。
2.指定初始位置
SELECT * FROM employee LIMIT 0,2;從初始位置開始,顯示前兩條記錄,"0"代表初始位置
SELECT * FROM employee LIMIT 1,2;從第2條記錄開始,顯示兩條記錄
10.3集合函式查詢
10.3.1 COUNT() 
SELECT COUNT(*) FROM employee;
SELECT d_id,COUNT(*) FROM employee GROUP BY d_id;
10.3.2 SUM()函式
SELECT * FROM grade;
SELECT num,SUM(score) FROM grade WHERE num=1001;
10.3.3 AVG()函式
SELECT AVG(age) FROM employee;
SELECT course,AVG(score) FROM grade GROUP BY course;
10.3.4 MAX()函式
SELECT MAX(age) FROM employee;
SELECT course,MAX(score) FROM grade GROUP BY course;
SELECT MAX(name) FROM work;
SELECT MIN(age) FROM age;
SELECT course,MIN(score) FROM grade GROUP BY course;
內連線
SELECT num,name,employee.d_id,age,sex,d_name,function FROM employee,department WHERE employee.d_id=department.d_id;
外連線
①左連線 eg:
SELECT num,name,employee.d_id,age,sex,d_name,function FROM employee LEFT JOIN department ON employee.d_id=department.d_id;
②右連線 eg:
SELECT num,name,employee.d_id,age,sex,d_name,function FROM employee RIGHT JOIN department ON employee.d_id=department.d_id;
10.4.3 複合條件連線查詢
SELECT num,name,employee,d_id,age,sex,d_name,function FROM employee,department WHERE employee.d_id=department.d_id AND age>24;
SELECT num,name,employee,d_id,age,sex,d_name,function FROM employee,department WHERE employee.d_id=department.d_id ORDER BY age ASC;
10.5 子查詢
IN  eg:
SELECT * FROM employee WHERE d_id IN(SELECT d_id FROM department);
SELECT * FROM employee WHERE d_id NOT IN(SELECT d_id FROM department);
10.5.2 帶比較運算子的子查詢
CREATE TABLE scholarship(
level INT(4),
score INT(4)
);
INSERT INTO scholarship VALUES
(1,90),
(2,80),
(3,70);
CREATE TABLE computer_stu(
id INT(4)PRIMARY KEY NOT NULL,
name VARCHAR(30) NOT NULL,
score INT(4) NOT NULL
);
INSERT INTO computer_stu VALUES
(1001,'Lily',85),
(1002,'Tom',91),
(1003,'Jim',87),
(1004,'Aric',77),
(1005,'Lucy',65),
(1006,'Andy',99),
(1007,'Ada',85),
(1008,'Jeck',70);
SELECT id,name,score FROM computer_stu WHERE score>=
(SELECT score FROM scholarship WHERE LEVEL=1);
SELECT * FROM employee;
SELECT * FROM department;
SELECT d_id,d_name FROM department WHERE d_id!=
(SELECT d_id FROM employee WHERE age=24);
SELECT d_id,d_name FROM department WHERE d_id<>
(SELECT d_id FROM employee WHERE age=24);
10.5.3 帶 EXISTS 關鍵字的子查詢  內層語句不返回記錄,只返回真假值;當內層語句返回值為真,則進行外層查詢
SELECT * FROM employee;
SELECT * FROM department;
SELECT * FROM employee WHERE EXISTS
(SELECT d_name FROM department WHERE d_id=1003);
SELECT * FROM employee WHERE EXISTS 
(SELECT d_name FROM department WHERE d_id=1004);
SELECT * FROM employee WHERE age>24 AND EXISTS
(SELECT d_name FROM department WHERE d_id=1003);
SELECT * FROM employee WHERE NOT EXISTS 
(SELECT d_name FROM department WHERE d_id=1003); 因為內層語句返回記錄,故 NOT EXISTS 為假
10.5.4 帶 ANY 關鍵字的子查詢
SELECT * FROM computer_stu;
SELECT * FROM scholarship;
SELECT * FROM computer_stu 
WHERE score>=ANY
(SELECT score FROM scholarship);
10.5.5 帶 ALL 關鍵字的子查詢
SELECT * FROM computer_stu WHERE score>=ALL
(SELECT score FROM scholarship);
10.6 合併查詢結果 UNION/ UNION ALL
UNION 將所有查詢結果合併到一起,去除掉相同的
UNION ALL 關鍵字則只是簡單的合併到一起
語句: SELECT 語句1 UNION|UNION ALL SELECT語句2 UNION|UNION ALL SELECT語句n;
SELECT d_id FROM department UNION SELECT d_id FROM employee;
SELECT d_id FROM department UNION ALL SELECT d_id FROM employee;
10.7 位表和欄位取別名
10.7.1 為表取名
SELECT * FROM department d WHERE d.d_id=1001;
10.7.2 為欄位取別名
語句: 屬性名 [AS] 別名
SELECT d_id AS department_id, d_name AS department_name FROM department;
SELECT d.d_id AS department_id,d.d_name AS department_name,d.function,d.address FROM department d WHERE d.d_id=1001;
10.8 使用正則表示式查詢

相關推薦

MySQL入門簡單——讀書筆記

第八章 檢視 試圖是從一個或多個表中匯出來的表,是一種虛擬存在的表。檢視就像一個視窗,通過這個視窗,可以看到系統專門提供的資料。這樣,使用者可以只看到對自己有用的資料,而不用看到整個資料表中的其他資料。 8.1檢視簡介 8.1.1 檢視是一種虛擬的表,是從資料庫中一個或多個表中匯出來的表。檢視還可以從已經存在

MySQL入門簡單-學習筆記

避免編寫重複的語句 安全性可控 執行效率高 14.1、建立儲存過程和函式 14.1.1、建立儲存過程 CREATE PROCEDUREsp_name ([proc_parameter[,...]]) [characteristic...] routine_body pr

MySQL入門簡單-檢視

1、檢視是從一個或多個表中匯出的表,是虛擬的表。通過檢視可以看到系統專門提供的資料,作用是方便使用者對資料的操作。      檢視可以從存在的檢視的基礎上定義。資料庫只存放檢視的定義,不存放檢視中的資料,資料存放在原來的表。使用檢視查詢資料時,資料庫系統從原來的表中取出對應

《Java Web開發入門簡單》學習筆記

《Java Web開發入門很簡單》學習筆記 1123 第1章 瞭解Java Web開發領域Java Web主要涉及技術包括:HTML、JavaScript、CSS、JSP、Servlet、JDBC、Ja

Redis入門簡單之四【初識Jedis】

ive 基本 common port sta ole urn 超時時間 keyword Redis入門很簡單之四【初識Jedis】 博客分類: NoSQL/Redis/MongoDB redisnosql緩存jedis 使用Jedis提供的Java API對

Redis入門簡單之二【常見操作命令】

哈希表 shu 分享 排序。 sca ann mongodb pin set Redis入門很簡單之二【常見操作命令】 博客分類: NoSQL/Redis/MongoDB redisnosql緩存 Redis提供了豐富的命令,允許我們連接客戶端對其進行直接

《數據庫設計入門經典》讀書筆記——第一章:數據庫建模的過去與現在

port 混合 如果 執行 很好 創建表 規則 什麽 增長 《數據庫設計入門經典》,現在學習的是這本書,雖然以前就看過類似的書,可能由於之前經驗不足,書中說的某些東西只消化了一部分,現在重溫一邊好懂多了。所以說讀第一遍讀不懂不要緊,過個一年半載的再來讀,還是會讀不懂的,哈哈

《數據庫設計入門經典》讀書筆記——第三章:工作場所中的數據庫建模

中間 特定 理論 大學 並且 外鍵 另一個 必須 所有 規範化用於粒度化和組織在數據庫中使用的數據。 在第4章中將詳細介紹規範化和應用範式的過程。在這個階段只需要知道規範化是用於將數據劃分到單獨表中的方法或公式——根據一組規則。 不信任將視圖用於除了安全性目標之外的任何事情

Python入門數的讀書筆記

mit file rop osi 特殊方法 表達 顯式 運算符 一般來說 入門書地址 三引號 (""" 或 ‘‘‘) 來指定多行字符串字符串是不可變的輸出小數點後三位 print(‘{0:.3f}‘.format(1 / 3))輸出字符串長度為 11 print(‘{0:_

學好這4步Python入門簡單

1. 變數型別簡介及操作: 變數讓你能夠把程式中準備使用的每一段資料都賦給一個簡短、易於記憶的名字,變數型別是指賦值於變數中的資料型別。   Python變數型別(深色Mark部分變數為不可更改的變數) 2. 條件控制及迴圈語句: 條件語句是通過一條或多條語句的執

C程式設計語言(第2版)簡單讀書筆記

最近重新看了C語言聖經,查漏補缺,記了簡單的筆記,全部來自原書,共9866字,記錄一下。  騰訊文件地址:https://docs.qq.com/doc/DUmt5VU5Tem1LQUxx 第一章 導言   c語言中一個通用的例項:在允許使用某種型別變數值的任何場合,都可以使用該型別的更復雜的

mysql資料庫的簡單操作筆記

《資料庫的簡單操作筆記》 <---- 一、     1.建立資料庫;     mysql> create database db_admin;      2.檢視資

2015 數學建模競賽 入門與提高 讀書筆記

《數學建模競賽入門與提高》 第1章:數學建模概述        近半個多世紀以來,數學已經走進了各大領域,而與其他學科相結合形成交叉學科,首要的關鍵一步就是建立研究物件的數學模型,並加以計算求解,數學建模和計算機技術在知識經濟時代的作用可謂是如虎添翼。 1.1  初入門徑

Redis入門簡單之七【使用Jedis實現客戶端Sharding】

 1. sharding機制:即通常所說的“分片”,允許資料存放在不同的物理機器上,  以適應資料量過大的場景,克服單臺機器記憶體或者磁碟空間的限制。而這種“離散式”地存放,對客戶端來說是透明的,對客戶端來講,完全看不到這種差別。  2. 常見的記憶體快取中介軟體,比如Memcached支援伺服器端Sha

mysql技術內幕》讀書筆記

第2章 使用sql管理資料 2.6 索引表 唯一索引 單列不允許有重複值出現,多列(符合)索引,不允許出現重複的組合值。 常規(非唯一性)索引 可以獲得索引的好處,但會出現重複值的情況。 fulltext索引 可用於完成全文檢索 spatial索引 只適用於

Redis入門簡單之六【Jedis常見操作】

<一>. 使用list:  可以使用列表模擬佇列(queue)、堆疊(stack),並且支援雙向的操作(L或者R)。  1. 右邊入隊: Java程式碼   jedis.rpush("userList", "James");     2. 左邊出隊:右邊出棧(rpop),即為對堆疊的

基於 Agent 的模型入門Python實現 讀書筆記

def populate(self): self.all_house = list(itertools.product(range(self.width).range(self.height))) random.shuffle(self.all_houses) self.n_empt

MySQL 入門介紹簡單下載方式和安裝流程

本文主要介紹為8.0版本 MySQL資料庫介紹 • MySQL是一種開放原始碼的關係型資料庫管理系統(RDBMS), MySQL資料庫系統使用最常用的資料庫管理語言--結構化查詢語 言(SQL)進行資料庫管理。 • MySQL的歷史最早可以追溯到1979年,那時Oracle也才剛剛開始, 微軟的SQL Ser

oracle入門簡單:四、本地Net服務名配置

預設情況下,利用客戶端工具,例如,sqlplus、PL/SQL Developer等連線資料庫時,並不會直接使用資料庫的SID,而是通過本地Net服務名。所謂本地,是指Oracle客戶端。本地Net服務名的配置中包含了要連線的資料庫伺服器的主機名、資料庫的SID、監聽器的

unity 5.x從入門到精通 讀書筆記(一)

transform 場景 engine class 遊戲 iou 遊戲制作 初始化 bsp 《unity 5.x從入門到精通》前四章是一些Unity的情況介紹,第五章開始介紹Unity的基礎操作,第六章通過一個3D場景的實現介紹了3D遊戲制作模式的基本操作。