1、插入數據數據庫
一、爲表的全部字段插入數據函數
一般狀況下,插入的新紀錄要包含表的全部字段spa
INSERT 語句有兩種方式能夠同時爲表的全部字段插入數據,第一種方式是不指定具體的字段名,第二種方式是列出表的全部字段。3d
(1)INSERT 語句中不指定具體的字段名code
語法規則:blog
INSERTINTO 表名 VALUES(值1,值2,…,值n)
【例1】向 student 表中插入記錄排序
注意:student 表包含 6 個字段,那麼 INSERT 語句中的值也應該是 6 個。並且數據類型也應該與字段的數據類型一致。Sno,sname,ssex,sbirth,zno 和 sclass 這 6 個字段是字符串類型,取值必須加上引號。若是不加上引號,數據庫系統會報錯。資源
(2)INSERT 語句中列出全部字段rem
語法規則:字符串
INSERT INTO 表名(字段名1,字段名2,…,字段名n) VALUES(值1,值2,…,值n);
【例2】向 student 表中插入記錄
注意:若是表的字段比較多,用第二種方法就比較麻煩。可是,第二種方法比較靈活。能夠隨意地設置字段的順序,而不須要按照表定義時的順序。值的順序也必須跟着字段順序的改變而改變。
【例3】向 student 表中插入一條新記錄。INSERT 語句中字段的順序與表定義時的順序不一樣。
注意:sbirth 字段和 ssex 字段的順序發生了改變。其對於值的位置也跟着發生了改變。
二、爲表的指定字段插入數據
語法規則:
INSERT INTO 表名(字段名1,字段名2,…,字段名n) VALUES(值1,值2,…,值n);
【例4】向 student 表的sno,sname 和 ssex 這 3 個字段插入數據
注意:這種方式也能夠隨意的設置字段的順序,而不須要按照表定義時的順序。
三、同時插入多條記錄
語法規則:
INSERT INTO 表名 [(字段名列表)]
VALUES(取值列表1), (取值列表2), …(取值列表n);
【例5】向 student 表的 sno,sname 和 ssex這 3 個字段插入數據。總共插入 3 條記錄
【例6】向 student 表插入 3 條記錄
注意:不指定字段時,必須爲每一個字段都插入數據。若是指定字段,就只須要爲指定的字段插入數據。
【例7】向 student 表的 sno,sname 和 ssex 字段插入數據。INSERT 語句中,這 3 個字段的順序能夠任意排列。
技巧:向 MySQL 的某個表中插入多條記錄時,可使用多個 INSERT 語句逐條插入記錄,也可使用一個 INSERT 語句插入多條記錄。選擇哪一種方式一般根據我的喜愛來決定。若是插入的記錄不少時,一個 INSERT 語句插入多條記錄的方式的速度會比較快。
2、修改數據
修改數據是更新表中已經存在的記錄。在 MySQL 中,經過 UPDATE 語句來修改數據。
語法規則:
UPDATE 表名 SET 字段名1=值1, 字段名2=值2, … 字段名n=值n WHERE 條件表達式
【例8】更新 student 表中 sno 值爲 1418855243 的記錄。將 sname 字段的值變爲 '李壯'。將 sbirth 字段的值變爲 '1996-03-23'
說明:表中知足條件表達式的記錄可能不止一條。使用 UPDATE 語句會更新全部知足條件的記錄。但在 MySQL 中是須要一條一條的執行。
【例9】更新 student 表中 sname 值爲李凱的記錄。將 sbirth 字段的值變爲 "1997-01-01"。將 ssex 字段的值變爲 "女"。
結果顯示更新了兩條數據
3、刪除數據
刪除數據是刪除表中已經存在的記錄,在 MySQL 中,經過 DELETE 語句來刪除數據
語法規則:
DELETE FROM 表名 [WHERE 條件表達式]
【例10】刪除 student 表中 sno 值爲 1418855243 的記錄
DELETE 語句能夠同時刪除多條記錄。
【例11】刪除 student 表中 sclass 的值爲 '商務1301' 的記錄。
注意:DELETE 語句中若是不加上「WHERE條件表達式」,數據庫系統會刪除指定表中的全部數據。需謹慎使用。
4、單表查詢
一、select 語法
語法規則:
select [ all | distinct] <目標列表達式> [別名] [ , <目標列表達式> [別名] ]... from <表名或視圖名> [別名] [ , <表名或視圖名> [別名] ]... [where <條件表達式>]
[group by <列名1> ]
[having <條件表達式> ]
[order by <列名2> [ ASC| DESC ]] [limit 字句]
-- 其中[]內的內容是可選的。
二、簡單查詢
(1)查詢全部字段
查詢全部字段是指查詢表中的全部字段的數據,有兩種方式:一種是列出表中的全部字段,另外一種是使用通配符 「*」 來查詢
注意:經過使用通配符 *,能夠查詢表中全部字段的數據,這種方式比較簡單,尤爲是數據庫表中的字段不少時,這種方式更加明顯。可是從顯示結果順序的角度 來說,使用通配符 * 不夠靈活。若是要改變顯示字段的順序,能夠選擇使用第一種方式。
【例12】查詢學生的全部信息,使用列出表中的全部字段方式查詢。
【例12】查詢學生的全部信息,使用使用通配符 * 方式查詢。
(2)指定字段查詢
雖然經過 select 語句能夠查詢全部字段,但有些時候,並不須要將表中的全部字段都顯示出來,只須要查詢咱們須要的字段就能夠了,這就須要咱們在 select 中指定須要的字段。
【例13】查詢學生的學號和姓名
(3)DISTINCT 避免重複數據查詢
distinct 關鍵字能夠去除重複的查詢記錄。和 distinct 相對的是 all 關鍵字,即顯示全部的記錄(包括重複的),而 all 關鍵字是系統默認的。
注意:查詢的字段必須包含在表中。若是查詢的字段不在表中,系統會報錯。例如,在 student 表中查詢 weight 字段,系統會出現 「ERROR 1054 (42522): Unknown column 'weight' in 'field list'」 這樣的錯誤提示信息。
【例14】查詢在 student 表中都有哪些班級
1)all 關鍵字查詢結果
2)distinct 關鍵字查詢結果
(4)爲表和字段取別名
有時爲了顯示結果更加直觀,須要一個更加直觀的名字來表示這一列,而不是用數據庫中的列的名字。
語法格式:
select [ all | distinct] <目標列表達式> [AS] [別名] [ , <目標列表達式> [AS] [別名] ]... from <表名或視圖名> [別名] [ , <表名或視圖名>[別名] ]...
【例15】查詢學號爲 1414855328 的學生的學號,姓名和計算機應用軟件的成績。並指定返回的結果中的列名爲學號,姓名和計算機應用軟件的成績,而不是sno、sname 和 grade。
【例16】查詢 student 表中字段 ssex 的值,若是爲男的變爲 「M」,爲女的變爲 「F」,同時在結果集中顯示的列名改成 「性別」
說明:這裏使用了 Limit 關鍵字,限制返回的符合結果數量。其詳細用法在後來會講到。
三、條件查詢
條件查詢主要使用關鍵字 where 指定查詢的條件。
注意:條件表達式中設置的條件越多,查詢出來的記錄就會越少。
(1)帶關係運算符和邏輯運算符的查詢
MySQL 中,能夠經過關係運算符和邏輯運算符來編寫 「條件表達式」。
【例18】查詢成績大於 90 分的學生的學號以及分數
【例19】查詢成績等於 96 或者在 70 分到 80 分之間但不等於 75 的學生的學號,成績
(2)帶 IN 關鍵字的查詢
IN 關鍵字能夠判斷某個字段的值是否在指定的集合中。
語法格式:
[NOT] IN (元素1, 元素2, 元素3, ... )
【例20】查詢成績在集合 (65,75,85,95) 中的學生的學號和成績
(3)帶 BETWEEN...AND 關鍵字的查詢
between...and 關鍵字能夠判斷讀某個字段的值是否在指定的範圍內
語法格式:
[ NOT ] between 取值1 and 取值2
【例21】查詢成績在 75 分到 80 分之間學生的學號,和成績。包含 75 分和 80 分。
【例22】下面使用 NOT BETWEEN AND 關鍵字查詢 student 表。查詢條件是 sno 字段的取值不在 1418855240 ~ 1418855242 之間。
技巧:BETWEEN AND 和 NOT BETWEEN AND 關鍵字在查詢指定範圍的記錄時頗有用。例如,查詢學生成績表的年齡段、分數段等。還有查詢員工的工資水平時也可使用這兩個關鍵字。
(4)帶 IS NULL 關鍵字的空值查詢
is null關鍵字能夠用來判斷字段的值是否爲空值(NULL)。
語法格式:
is [ not ] null
【例23】查詢尚未分專業的學生的學號和姓名
注意:IS NULL 是一個總體,不能將 IS 換成 「=」 ,
zno=null 表示要查詢的 zno 的值是字符串 「null」 ,而不是空值。
(5)帶 LIKE 關鍵字的查詢
like 關鍵字能夠匹配字符串是否相等
語法規則:
[ not ] like "字符串"
【例24】下面使用 LIKE 關鍵字來匹配一個完整的字符串 '馬小梅'。
說明:使用 LIKE 關鍵字和使用 「=」 的效果是同樣的。可是,這隻對匹配一個完整的字符串這種狀況有效。若是字符串中包含了通配符,就不能這樣進行替換了。
【例25】下面使用 NOT LIKE 關鍵字來查詢不是姓李的全部人的記錄
說明:使用 LIKE 和 NOT LIKE 關鍵字能夠很好地匹配字符串。並且,可使用 「%」 和 「_」 這兩個通配字符來簡化查詢。
四、高級查詢
(1)分組查詢
GROUP BY 關鍵字能夠將查詢結果按某個字段或多個字段進行分組。
語法格式:
GROUP BY 字段名 [HAVING 條件表達式] [WITH ROLLUP]
【例26】按 student 表的 ssex 字段進行分組查詢
說明:若是單獨使用 GROUP BY 關鍵字,查詢結果只顯示一個分組的一條記錄。
【例27】按 student 表的 ssex 字段進行分組查詢。而後顯示記錄數大於等於 10 的分組。
說明: 「HAVING條件表達式」 與 「WHERE條件表達式」 都是用來限制顯示的。可是,二者起做用的地方不同。「WHERE條件表達式」 做用於表或者視圖,是表和視圖的查詢條件。「HAVING條件表達式」 做用於分組後的記錄,用於選擇知足條件的組。
(2)對查詢結果排序
ORDER BY 關鍵字對記錄進行排序
語法格式:
order by 字段名 [ asc | desc ]
【例28】查詢 student 表中全部記錄,按照 zno 字段進行排序
MySQL 中,能夠指定按多個字段進行排序
【例29】查詢 student 表中全部記錄,按照 zno 字段的升序方式和 sno 字段的降序方式進行排序。
(3)限制查詢結果數量
LIMIT 子句用來限制被 SELECT 語句返回的行數。
語法格式:
LIMIT {[offset,] row_count | row_count OFFSET offset}
【例30】在 student 表中查找從第 3 名同窗開始的以後 3 位學生的信息。
(4)聚合函數
聚合函數包括 COUNT()、SUM()、 AVG(), MAX() 和 MIN()。其中:
COUNT() 用來統計記錄的條數;
SUM() 用來計算字段的值的總和;
AVG() 用來計算字段的值的平均值;
MAX() 用來查詢字段的最大值;
MIN() 用來查詢字段的最小值。
【例31】使用 COUNT() 函數統計 student 表的記錄數
【例32】使用 SUM() 函數統計 sc 表中學號爲 1414855328 的同窗的總成績。
5、多表查詢
(1)首先準備員工表和部門表
-- 建表 create table department( id int, name varchar(20)); create table employee1( id int primary key auto_increment, name varchar(20), sex enum('male', 'female') not null default 'male', age int, dep_id int ); -- 插入數據 insert into department values (200, '技術'), (201, '人力資源'), (202, '銷售'), (203, '運營'); insert into employee1(name,sex,age,dep_id) values ('趙一', 'male', 18, 200), ('錢二', 'female', 48, 201), ('孫三', 'male', 38, 201), ('李四', 'female', 28, 202), ('週五', 'male', 18, 200), ('吳六', 'female', 18, 204);
查看錶
(2)多表鏈接查詢
1)交叉鏈接:不適用於任何匹配條件。生成笛卡爾積
select * from employee1, department;
2)內鏈接:找兩張表共有的部分,至關於利用條件從笛卡爾積結果中篩選出了正確的結果。(只鏈接匹配的行)
-- department沒有204這個部門,於是employee表中關於204這條員工信息沒有匹配出來
select * from employee1, department where employee1.dep_id=department.id; -- 上面用where表示的能夠用下面的內鏈接表示,建議使用下面的那種方法
select * from employee1 inner join department on employee1.dep_id=department.id; -- 也能夠這樣表示
select employee1.id, employee1.name, employee1.age, employee1.sex, department.name
from employee1, department where employee1.dep_id=department.id;
注意:內鏈接的 join 能夠忽略不寫,可是仍是加上看起來清楚點
3)左鏈接:左表的記錄將會被所有顯示出來,而右表只會顯示符合搜索條件的記錄,右表記錄不足的地方均爲 NULL
-- 左連接:在按照on的條件取到兩張表共同部分的基礎上,保留左表的記錄
select * from employee1 left join department on department.id=employee1.dep_id; select * from department left join employee1 on department.id=employee1.dep_id;
4)右鏈接:左表只會顯示符合搜索條件的記錄,右表的記錄將會被所有顯示出來,左表記錄不足的地方均爲 NULL
-- 右連接:在按照on的條件取到兩張表共同部分的基礎上,保留右表的記錄
select * from employee1 right join department on department.id=employee1.dep_id; select * from department right join employee1 on department.id=employee1.dep_id;
5)全外鏈接:顯示左右兩個表的所有記錄
注意:MySQL 不支持全外鏈接 full join,但可使用 union 實現全外鏈接
select * from employee1 left join department on department.id=employee1.dep_id union
select * from employee1 right join department on department.id=employee1.dep_id;
(3)符合條件的鏈接查詢
示例1:之內鏈接的方式查詢 employee 和 department 表,而且 employee 表中的 age 字段值必須大於 25,即找出公司全部部門中年齡大於 25 歲的員工
select * from employee1
inner join department on employee1.dep_id=department.id and age > 25;
示例2:之內鏈接的方式查詢 employee 和 department 表,而且以 age 字段的升序方式顯示
select * from employee1 inner join department on employee1.dep_id=department.id and age > 25
order by age asc;
6、子查詢
在具體應用中,若是須要實現多表數據記錄查詢,通常不使用鏈接查詢,由於該操做效率比較低,因而 MySQL 提供了鏈接查詢的替代操做 —— 子查詢操做。
經過子查詢,能夠實現多表之間的查詢。子查詢中可能包括 IN, NOT IN,ANY,EXISTS 和 NOT EXISTS 等關鍵字。子查詢中還可能包含比較運算符,如 「=」、「!=」、「>」 和 「<」 等。
(1)帶 IN 關鍵字的子查詢
IN 關鍵字能夠判斷某個字段的值是否在指定的集合中。
【例33】查詢成績在集合 (65,75,85,95) 中的學生的學號和成績
【例34】查詢選修過課程的 student 的記錄
(2)帶 EXISTS 關鍵字的子查詢
exists 關鍵字表示存在,使用 exists 關鍵字時,內查詢語句不返回查詢的記錄。
【例35】若是存在 「金融」 這個專業,就查詢全部的課程信息
【例36】若是存在 「計算機科學與技術」 這個專業,就查詢全部的課程信息
(3)帶 ANY 關鍵字的子查詢
ANY 關鍵字表示知足其中任何一個條件。
【例37】查詢比其餘班級比計算 1401 班級某一個同窗年齡小的學生的姓名和年齡
(4)帶 ALL 關鍵字的子查詢
ALL 關鍵字表示知足全部的條件
【例38】查詢比其餘班級比計算 1401 班級全部同窗年齡都大的學生的姓名和年齡