文章目錄:
3.6 插入數據(INSERT INTO , VALUES)
4.1 基本查詢語句(SELECT , FROM , WHERE)
4.5 查詢空值(IS NULL)與去重(DISTINCT)
1.數據庫的相關操作
-
1.1 連接數據庫
mysql -u[用戶名] -p[密碼] -h[主機名](最後一個可以不加,特定情況時需要添加)
-
1.2 創建數據庫
模板:CREATE DATABASE 數據庫名;
舉例:CREATE DATABASE school;
-
1.3 查看數據庫有哪些
模板:SHOW DATABASES;
(無需加具體的數據庫名)
-
1.4 查看指定的數據庫
模板:SHOW CREATE DATABASE 數據庫名;
舉例:SHOW CREATE DATABASE school;
-
1.5 刪除指定的數據庫
模板:DROP DATABASE 數據庫名;
舉例:DROP DATABASE school;
-
1.6 使用數據庫(很重要)
模板:USE 數據庫名;
舉例:USE school;
(在對其中一個數據庫進行一系列操作的時候,必須要先聲明使用的是哪一個數據庫,即上面的SQL語句!!!)
-
1.7 用戶的創建和刪除
首先連接數據庫
mysql -u[用戶名] -p[密碼] -h[主機名](這個可以不加,特定情況需要添加)
在這裏我們通過root用戶來創建新的用戶
模板:CREATE USER "用戶名"@"localhost" identified by "密碼";
(用戶名和localhost兩側的引號可加可不加)
舉例:CREATE USER "U4"@"localhost" identified by"123456";
(此時,我們使用root用戶創建了一個新用戶U4,密碼爲123456)
對於新創建的用戶,我們也可以對它進行刪除
模板:DROP USER "用戶名"@"localhost";
舉例:DROP USER "U4"@"localhost";
(此時,我們刪除了上面創建的新用戶U4)
-
1.8 授權
在創建的一些用戶之後,我們可以爲指定的用戶授權!!!
模板:GRANT <權限列表> [權限可以是:SELECT,UPDATE,DELETE,INSERT]
ON <數據庫對象> [數據庫對象可以是基本表、視圖]
TO <用戶名>
[WITH GRANT OPTION]; [添加上這條語句之後,表示被授權的用戶可以繼續將權限轉授給其他用戶]
舉例1:GRANT SELECT
ON school.student
TO U4;
(此時,我們爲用戶U4授予school數據庫中student表的查詢權限)
(在這裏,需要說明一點:如果沒有指定具體的數據庫,那麼在基本表或者視圖的前面要加上該數據庫名的前綴)
(上面的student表是在school數據庫中的,所以我們要加上對應數據庫名的前綴)
(如果不想加這個前綴,也可以使用下面的語句)
舉例2:USE school;
[出現Database changed,表示需要使用這個數據庫]
GRANT SELECT
ON student (由於我們已經事先聲明USE school;所以在這裏就不需要添加數據庫名的前綴了)
TO U4;
(這兩種方法是一樣的,大家可以根據編寫SQL語句的習慣來選擇!!!)
上面提到的兩個例子,是授予部分權限,如果想授予指定用戶的所有權限,可以使用下面的語句:
模板:GRANT ALL PRIVILEGES
ON school.student
TO U5;
(此時,我們爲用戶U5授予了school數據庫中student表的所有權限)
-
1.9 收權
在授予指定用戶的一些權限之後,我們同樣可以將這些權限收回!!!
模板:REVOKE <權限列表> [權限可以是:SELECT,UPDATE,DELETE,INSERT]
ON <數據庫對象> [數據庫對象可以是基本表、視圖]
FROM <用戶名>
[CASCADE|RESTRICT];
(級聯CASCADE:當這個用戶爲其他用戶授權時,我們使用級聯將其一併收回)
(比如用戶root爲U4授予了SELECT權限,而用戶U4又爲U5授予了UPDATE權限,此時使用CASCADE就把兩個權限一起收回了)
(約束RESTRICT:當這個用戶沒有給其他用戶授權時,纔可以將它收回)
舉例:REVOKE SELECT,UPDATE(grade)
ON school.sc
FROM U4
CASCADE;
(此時,我們把用戶U4對school數據庫中student表的查詢和更新成績的權限收回,同時級聯收回U4授出給其他用戶的權限)
-
1.10 視圖的創建與刪除
舉例1:涉及單個表的視圖的創建
創建信工學院開設的課程視圖XG_C(cno,cname,credit)
屬性名依次表示課程號、課程名、學分,並查詢視圖中的數據。
CREATE VIEW XG_C(cno,cname,credit)
AS
SELECT cs_id,cs_name,cs_credit
FROM course
WHERE cs_depart="信工";
使用SELECT查詢所創建視圖中的數據
SELECT *
FROM XG_C;
舉例2:涉及多個表的視圖的創建
創建教師授課視圖Tea_C(tno,tname,cno,cname,credit)
屬性名依次表示教師號,教師名,課程號,課程名,學分,並查詢視圖中的數據。
CREATE VIEW Tea_C(tno,tname,cno,cname,credit)
AS
SELECT teacher.tea_id,tea_name,course.cs_id,cs_name,cs_credit
FROM course
JOIN teaching
ON course.cs_id=teaching.cs_id
JOIN teacher
ON teaching.tea_id=teacher.tea_id;
使用SELECT查詢所創建視圖中的數據
SELECT *
FROM Tea_C;
舉例3:在已有視圖的基礎上,繼續創建新的視圖
創建信工學院學生平均成績視圖XG_AVE(sno,gave)
CREATE VIEW XG_AVE(sno,gave)
AS
SELECT sno,AVG(grade)
FROM XG_GRADE
GROUP BY sno;
使用SELECT查詢所創建視圖中的數據
SELECT *
FROM XG_AVE;
舉例4:刪除視圖
DROP VIEW [視圖名];
(可以添加CASCADE級聯操作,表示將此視圖導出的所有視圖一併刪除)
-
1.11 斷開服務器的連接
模板1:exit;
模板2:quit;
2.表的相關操作
-
2.1 創建表
模板:CREATE TABLE 表名
(
字段名1 數據類型 [列級約束],
字段名2 數據類型 [列級約束],
......
表級約束
);
舉例:CREATE TABLE student
(
sno char(10),
sname varchar(5),
sage int(5),
sex char(3)
);
(在此,我們只是創建了一個基本表,並沒有對錶中字段添加相關約束,隨後會一一介紹!!!)
-
2.2 查看錶的結構
模板1:DESCRIBE 表名;
模板2:DESC 表名;
舉例: DESC student;
-
2.3 查看錶的詳細信息
模板:SHOW CREATE TABLE 表名;
舉例:SHOW CREATE TABLE student;
-
2.4 查看某個數據庫中有哪些表
模板:SHOW TABLES;
舉例:SHOW TABLES;
(這個和查看有哪些數據庫一樣,無需添加數據庫名或者表名)
-
2.5 刪除指定的表
模板:DROP TABLE 表名;
舉例:DROP TABLE student;
-
2.6 字段名的數據類型
int 整型
char(n) 定長字符型
varchar(n) 變長字符型
float(m,d) 單精度型,m表示總位數,d表示小數位數
decimal(m,d) 雙精度型
date 日期型
(這裏只介紹MySQL支持的主要數據類型)
-
2.7 添加主鍵約束
舉例:CREATE TABLE student
(
sno char(10) PRIMARY KEY,
sname varchar(5),
sage int(5),
sex char(3)
);
(我們在第一個字段名sno的後面添加列級約束:PRIMARY KEY,即指定字段sno爲student表的主鍵)
-
2.8 添加外鍵約束
模板:CONSTRAINT 外鍵約束名 FOREIGN KEY(外鍵名) REFERENCES 主表名(主鍵名)
(在添加外鍵約束的時候,需要有一個父表(主表)和子表)
舉例:CREATE TABLE student
(
sno char(10) PRIMARY KEY,
sname varchar(5),
sage int(5),
sex char(3)
);
CREATE TABLE score
(
sno char(10) PRIMARY KEY,
cno char(10),
cname varchar(10),
ctype varchar(5),
CONSTRAINT fk_temp FOREIGN KEY(sno) REFERENCES student(sno)
);
(我們在此就爲score表添加了外鍵約束,外鍵約束名爲fk_temp,外鍵名爲sno)
-
2.9 添加常用約束
常用約束類型有:
(1)primary key 單一主鍵約束,primary key(字段名1,字段名2) 聯合主鍵
(2)foreign key 外鍵約束
(3)unique 唯一約束 ,取值不能重複,但允許有一個爲空
(4)null 爲空約束(系統默認的)
(5)not null 非空約束
(6)default 值 默認約束,給定字段一個默認值,
添加字符串型默認值要使用單引號,表示爲'值’。
如果是整型則不需要加任何符號;
如果要添加的是中文默認值,則需要加上 DEFAULT CHARSET=utf8; 使用英文字符則不需要。
(7)auto_increment 自增約束,默認情況下初始值和增量都爲1。
1.添加唯一約束
CREATE TABLE student
(
sno char(10) PRIMARY KEY,
sname varchar(5) UNIQUE,
sage int(5),
sex char(3)
);
2.添加非空約束
CREATE TABLE student
(
sno char(10) PRIMARY KEY,
sname varchar(5) NOT NULL,
sage int(5),
sex char(3)
);
3.使用默認約束
CREATE TABLE student
(
sno char(10) PRIMARY KEY,
sname varchar(5),
sage int(5),
sex char(3) DEFAULT "男"
)DEFAULT CHARSET=utf8;
4.設置表的屬性值自動增加
CREATE TABLE student
(
sno char(10) PRIMARY KEY AUTO_INCREMENT,
sname varchar(5),
sage int(5),
sex char(3)
);
(默認情況下,關鍵詞AUTO_INCREMENT的初始值的增量均爲1)
3.數據庫和表的基本操作
-
3.1 修改表名
模板:ALTER TABLE 舊錶名 RENAME [TO] 新表名;
舉例:ALTER TABLE student RENAME people;
(此時我們把student表修改爲一個新的表名people)
-
3.2 修改字段名和字段的數據類型
模板1:修改字段名
ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型;
(數據類型必須跟在新字段名的後面,數據類型可改可不改,如果不需要修改字段的數據類型,
可以把新字段的數據類型設置爲和原來一樣,但是,千萬不要空着它!)
舉例: ALTER TABLE student CHANGE sage Sage int(5);
模板2:修改字段的數據類型
ALTER TABLE 表名 MODIFY 字段名 新數據類型;
舉例: ALTER TABLE student MODIFY sage varchar(5);
-
3.3 添加和刪除字段
模板1:添加字段(默認在表的最後一列添加字段)
ALTER TABLE 表名 ADD 字段名 數據類型 [約束類型];
舉例:ALTER TABLE student ADD smajor varchar(10) NOT NULL;
模板2:添加字段(指定在表的第一列添加字段)
ALTER TABLE 表名 ADD 字段名 數據類型 [約束類型] FIRST;
舉例:ALTER TABLE student ADD smajor varchar(10) FIRST;
模板3:添加字段(指定在表的某一列添加字段)
ALTER TABLE 表名 ADD 字段名 數據類型 [約束類型] ALTER 指定已存在的字段名;
舉例:ALTER TABLE student ADD smajor varchar(10) AFTER sage;
模板4:刪除字段
ALTER TABLE 表名 DROP 字段名;
舉例:ALTER TABLE student DROP smajor;
-
3.4 修改字段的排列位置
模板1:修改字段爲表的第一字段
ALTER TABLE 表名 MODIFY 字段名 數據類型 FIRST;
舉例:ALTER TABLE student MODIFY sname varchar(5) FIRST;
模板2:修改字段到表的某個字段之後
ALTER TABLE 表名 MODIFY 字段名 數據類型 AFTER 指定字段名;
舉例:ALTER TABLE student MODIFY sname varchar(5) AFTER sage;
-
3.5 刪除表的外鍵約束
模板:ALTER TABLE 表名 DROP FOREIGN KEY 外鍵約束名;
舉例:ALTER TABLE score DROP FOREIGN KEY fk_temp;
(其中fk_temp爲score表的外鍵約束名)
-
3.6 插入數據(INSERT INTO , VALUES)
模板1:INSERT INTO 表名 (字段名1,字段名2,......)
VALUES(字段名1的值,字段名2的值,......),
(字段名1的值,字段名2的值,......),
......
(字段名1的值,字段名2的值,......);
(如果插入的全部列的值,則INSERT INTO 表名後面的內容就可以省略;如果是部分列,則不能省略)
舉例:INSERT INTO student(sno,sname)
VALUES("201805050201","張三"),
("201805050255","李四"),
("201805050230","王五");
模板2:帶子查詢的插入語句
INSERT INTO 表名 (字段名1,字段名2,......)
SELECT 字段名1,字段名2,......
FROM 表名
此處可以添加一些指定條件(WHERE,GROUP BY等等)
舉例:INSERT INTO sc(sno,grade)
SELECT sno,AVG(grade)
FROM student
GROUP BY sno;
(此時,我們把student表按照學號分組,並計算每個學生的平均成績,之後再把學號和平均成績插入新表sc)
-
3.7 查看數據是否成功插入表中
模板:SELECT *;
FROM 表名;
舉例:SELECT *;
FROM student;
-
3.8 更新數據(UPDATE , SET)
模板1:更新表中的所有行的一列值
UPDATE 表名
SET 字段名1=它的新值;
舉例:UPDATE student
SET sage=20;
(此時,我們把student表的sage字段對應的所有值都更新爲20)
(模板中更新的新值也可以爲空,即:NULL)
模板2:更新表中的所有行的多列值
UPDATE 表名
SET 字段名1=它的新值,
字段名2=它的新值,
......;
舉例:UPDATE student
SET sage=20,
sex="男",
smajor="計科";
模板3:更新表中指定行的1列或多列值
UPDATE 表名
SET 字段名1=它的新值,
字段名2=它的新值,
......
WHERE 條件表達式;
舉例:UPDATE student
SET sage=18,
sex="女"
sno="201805050202"
WHERE id=3;
模板4:帶子查詢的更新語句
UPDATE 表名
SET 字段名=它的新值 (可以有多個字段名)
WHERE 條件表達式 IN
(
SELECT 字段名
FROM 表名
WHERE 條件表達式
);
舉例:UPDATE sc
SET grade=0
WHERE sno IN
(
SELECT sno
FROM student
WHERE sdept="信工"
);
(此時,我們把信工學院的全體學生的成績更新爲0)
-
3.9 刪除數據(DELETE , TRUNCATE)
模板1:刪除表中的指定行
DELETE FROM 表名
WHERE 條件表達式;
舉例:DELETE FROM student
WHERE sage>=18;
模板2:刪除表中的所有行
DELETE FROM 表名;
舉例:DELETE FROM student;
模板3:帶子查詢的刪除語句
DELETE FROM 表名
WHERE 字段名 IN
(
SELECT 字段名
FROM 表名
WHERE 條件表達式
);
舉例:DELETE FROM sc
WHERE sno IN
(
SELECT sno
FROM student
WHERE sdept="信工"
);
(此時,我們就刪除了信工學院全體學生的選課記錄)
模板4:DELETE 和 TRUNCATE
TRUNCATE TABLE 表名;
舉例:TRUNCATE TABLE student;
(DELETE:一條一條的刪除表中的數據)
(TRUNCATE:直接刪除的是表,而不是表中的內容,但是刪除結束後,還會重新創建一個表)
4.單表查詢
-
4.1 基本查詢語句(SELECT , FROM , WHERE)
模板1:查詢表中的某個字段
SELECT 字段名
FROM 表名;
舉例:SELECT sno
FROM student;
模板2:查詢表中的多個字段
SELECT 字段名1,字段名2
FROM 表名;
舉例:SELECT sno,sname
FROM student;
在模板1和2中,我們也可以用關鍵字 as 給字段名起別名,方便我們查看和理解查詢的結果!!!
舉例:SELECT sno as 學生學號,sname as 學生姓名
FROM student;
(在這裏,關鍵字 as 可以省略)
模板3:查詢表中的所有字段
SELECT *
FROM 表名;
舉例:SELECT *
FROM student;
模板4:條件查詢
SELECT 字段名1,字段名2
FROM 表名
WHERE 條件表達式;
舉例:SELECT sno,sname
FROM student
WHERE sex<>"女";
-
4.2 帶IN和NOT IN關鍵字的查詢
模板:SELECT 字段名
FROM 表名
WHERE 字段名 IN (n1,n2,n3,...);
舉例:SELECT sno,sname
FROM student
WHERE grade IN (98,99,100);
(查詢成績爲98,99,100的學生的學號和姓名)
(NOT IN的使用方法和IN是一樣的,在這就不再舉例了)
-
4.3 帶(NOT)BETWEEN AND 的範圍查詢
模板:SELECT 字段名
FROM 表名
WHERE 字段名 BETWEEN n1 AND n2;
舉例:SELECT sno,sname
FROM student
WHERE grade BETWEEN 90 AND 100;
(查詢成績在90到100之間的所有學生的學號和姓名)
(NOT BETWEEN AND 和 BETWEEN AND的使用方法是一樣的)
-
4.4 帶LIKE的字符匹配查詢
-
4.4.1 百分號通配符"%"
模板1:SELECT 字段名
FROM 表名
WHERE 字段名 LIKE '字符%';
(百分號通配符%可以匹配任意長度的字符,甚至包括零字符。其中 % 的位置可以根據需要在字符之間改變)
舉例1:SELECT sno,sname
FROM student
WHERE sno LIKE "20180505%";
(查詢學號以20180505開頭的學生學號和姓名)
舉例2:SELECT sno,sname
FROM student
WHERE sno LIKE "%0505%";
(查詢學號中間包含0505的學生學號和姓名)
舉例3:SELECT sno,sname
FROM student
WHERE sno LIKE "%0201";
(查詢學號結尾爲0201的學生學號和姓名)
-
4.4.2 下劃線通配符"_"
模板:SELECT 字段名
FROM 表名
WHERE 字段名 LIKE '字符_';
(下劃線通配符"_"只能模糊匹配1個字符)
(如果你想用下劃線通配符"_"匹配多個字符,那隻能多用幾個"_"咯!其中"_"的位置可以根據需要在字符間變化。
舉例1:SELECT sno,sname
FROM student
WHERE grade LIKE "_9";
(查詢學生成績以9結尾的學生學號和姓名)
舉例2:SELECT sno,sname
FROM student
WHERE grade LIKE "________02";
(查詢學號以02結尾的學生學號和姓名,假設學號是2018050502的格式,那麼在02之前就需要用8個下劃線通配符"_")
舉例3:SELECT sno,sname
FROM student
WHERE grade LIKE "_子%";
(查詢學生姓名中第二個字爲"子"的學生學號和姓名)
-
4.5 查詢空值(IS NULL)與去重(DISTINCT)
模板:SELECT 字段名
FROM 表名
WHERE 字段名 IS NULL;
(查詢數據表中的空值對應的數據)
舉例:SELECT sno,sname
FROM student
WHERE grade IS NULL;
(查詢student表中學生成績爲空的數據)
模板:SELECT DISTINCT 字段名
FROM 表名;
舉例:SELECT DISTINCT grade
FROM student;
(對student表中的成績字段進行去重處理)
-
4.6 帶 AND 與 OR 的多條件查詢
模板:SELECT 字段名
FROM 表名
WHERE 表達式1 AND 表達式2;
(小提示: 可以同時添加多個過濾條件,增加條件的同時只需增加一個 AND 關鍵字。)
舉例:SELECT sno,sname
FROM student
WHERE sage=18 AND sex="男";
(查詢年齡爲18,且性別爲男的學生學號和姓名)
模板:SELECT 字段名
FROM 表名
WHERE 表達式1 OR 表達式2;
(與AND相反,在WHERE聲明中使用OR關鍵字表示只需滿足兩個條件中的其中一個條件即可返回結果)
舉例:SELECT sno,sname
FROM student
WHERE sage=18 OR sex="男";
(查詢年齡爲18或者性別爲男的學生學號和姓名,只要滿足其中一個就行)
-
4.7 對查詢結果進行排序(ORDER BY)
模板:SELECT 字段名
FROM 表名
WHERE 條件表達式 (WHERE子句也可以不加)
ORDER BY 字段名 [ASC[DESC]];
(默認升序:ASC,也可以定義降序:DESC)
舉例:SELECT sno,sname
FROM student
WHERE sex="男"
ORDER BY sage DESC;
(我們對性別爲男的學生進行,按年齡降序排序,最後將其學號和姓名輸出)
-
4.8 分組查詢(GROUP BY)
模板:SELECT 字段名
FROM 表名
GROUP BY 字段名;
(分組查詢的關鍵字是Group By,查詢的是每個分組中 首次出現的一條記錄)
(一般情況下,GROUP BY都和聚合函數一起使用)
舉例:SELECT *
FROM student
GROUP BY sage;
(在GROUP BY子句之後還可以使用 HAVING 來對分組結果進行篩選)
-
4.9 使用 LIMIT 限制查詢結果的數量
模板:SELECT 字段名
FROM 表名
LIMIT [OFFSET,] 記錄數;
(第一個參數:OFFSET,可選參數,表示偏移量,如果不指定默認值爲0,表示從查詢結果的第一條記錄開始,
若偏移量爲1,則從查詢結果中的第二條記錄開始,以此類推)
(第二個參數,記錄數,表示返回查詢結果的條數)
舉例:SELECT *
FROM student
ORDER BY sage ASC
LIMIT 1,4;
(表示從student表中第2條記錄開始,向後檢索4條數據,並按年齡升序排序)
5.使用聚合函數查詢(不能出現在WHERE子句的後面)
-
5.1 COUNT()函數
模板:SELECT COUNT(*/字段名)
FROM 表名;
可加,可不加:WHERE 條件表達式;
(COUNT()函數是用來統計記錄的總條數)
舉例:SELECT COUNT(sno)
FROM student;
(統計student表中一共有多少條記錄)
-
5.2 SUM()函數
模板:SELECT SUM(字段名)
FROM 表名;
可加,可不加:WHERE 條件表達式;
(SUM()函數是對數據表的某列進行求和操作)
舉例:SELECT SUM(grade)
FROM score
WHERE course="語文";
(計算score表中語文成績的總和)
-
5.3 AVG()函數
模板:SELECT AVG(字段名)
FROM 表名;
可加,可不加:WHERE 條件表達式;
(AVG()函數是對數據表的某列進行求平均值操作)
舉例:SELECT AVG(grade)
FROM score
WHERE course="數學";
(計算score表中,數學科目的平均成績)
-
5.4 MAX()函數
模板:SELECT MAX(字段名)
FROM 表名;
可加,可不加:WHERE 條件表達式;
(MAX()函數是求某列的最大數值)
舉例:SELECT MAX(grade)
FROM score
WHERE course="數學";
(查詢score表中,數學科目成績的最高分)
-
5.5 MIN()函數
模板:SELECT MIN(字段名)
FROM 表名;
可加,可不加:WHERE 條件表達式;
(MIN()函數是求某列的最小數值)
舉例:SELECT MIN(grade)
FROM score
WHERE course="數學";
(查詢score表中,數學科目成績的最低分)
6.連接查詢(多表查詢)
-
6.1 內連接查詢
僅將兩個表中滿足連接條件的行組合起來作爲結果集,稱爲內連接;
關鍵字: [inner] join ... on。
模板:SELECT 字段名1,字段名2,......
FROM 表1
JOIN 表2
ON 表1.字段=表2.字段;
解釋:從表1中取出每一條記錄,去表2中與所有的記錄進行匹配,匹配必須是某個條件在表1中與表2中相同,
相同一般理解爲兩個表的公共字段,最終纔會保留結果,否則不保留。inner 關鍵字可省略不寫;on 表示連接條件。
舉例:SELECT student.sno,sname,smajor,cno
FROM student
JOIN score
ON student.sno=score.sno;
(我們對student表和score表做內連接運算,選取兩個表的公共字段sno進行連接)
(在輸出的時候,如果輸出的是公共字段sno,則需要在前面加上表名前綴:student.sno)
以上是其中一種寫法,下面我們介紹另一種寫法:
模板:SELECT 字段名1,字段名2,......
FROM 表1,表2
WHERE 表1.字段=表2.字段;
舉例:SELECT student.sno,sname,smajor,cno
FROM student,score
WHERE student.sno=score.sno;
-
6.2 外連接查詢(左/右)
外連接查詢分爲左外連接查詢和右外連接查詢;
關鍵字: left/right [outer] join ... on
模板1:SELECT 字段名1,字段名2,......
FROM 表1
LEFT JOIN 表2
ON 表1.字段=表2.字段; (不侷限於兩個表,可以有更多的表)
模板2:SELECT 字段名1,字段名2,......
FROM 表1
RIGHT JOIN 表2
ON 表1.字段=表2.字段; (不侷限於兩個表,可以有更多的表)
語法解釋:左外連接:在內連接的基礎上,還包含表1中所有不符合條件的數據行,並在其中的表2列填寫 NULL。
右外連接:在內連接的基礎上,還包含表2中所有不符合條件的數據行,並在其中的表1列填寫 NULL。
(與內連接相似,只是查詢結果少了一些數據,多出來了一些爲NULL的數據,所以不再舉例了)
-
6.3 複合條件連接查詢
複合條件連接查詢,就是在連接查詢的過程中,通過添加過濾條件來限制查詢結果,使查詢結果更加精確。
模板與內連接類似,只是在內連接的基礎上,增加了一些查詢條件!!!
舉例1:SELECT student.sno,sname,smajor,cno
FROM student,score
WHERE student.sno=score.sno AND sage>=18;
(對兩個表做內連接運算之後,再進行對年齡大於等於18的篩選和檢索)
舉例2:SELECT student.sno,sname,smajor,cno
FROM student,score
WHERE student.sno=score.sno
ORDER BY sage DESC;
(對兩個表做內連接運算之後,再對結果按年齡降序排序輸出)
以上,只是舉了兩個例子來更好的理解,複合條件當中還有很多,比如使用聚合函數,GROUP BY子句等等!!!
-
6.4 子查詢
-
6.4.1 帶比較運算符的子查詢
模板:SELECT *
FROM 表1
WHERE 字段名1=
(
SELECT 字段名2
FROM 表2
可加,可不加:WHERE 條件表達式
);
比較運算符:大於:>,大於等於:>=,小於:<,小於等於:<=,等於:=,不等於:!=或者<>
舉例:SELECT name,age
FROM tb_emp
WHERE age>
(
SELECT AVG(age)
FROM tb_emp
);
(查詢大於所有平均年齡的員工姓名與年齡)
-
6.4.2 帶(NOT)IN的子查詢
模板:與上面的帶比較運算符類似,只是把比較運算符換成了"IN"(相應的也有NOT IN)
舉例:SELECT cs_name 課程名,cs_type 課程類型
FROM course
WHERE cs_id IN
(
SELECT cs_id
FROM teaching
WHERE tea_id IN
(
SELECT tea_id
FROM teacher
WHERE tea_name="張三"
)
);
(這裏我們使用了三個表,來查詢“張三”老師所講授的課程名和課程類型)
-
6.4.3 帶ANY 或 ALL的子查詢
ALL關鍵字
ALL必須接在一個比較運算符的後面,表示與子查詢返回的所有值比較都爲TRUE,則返回TRUE。
舉例:SELECT position,salary
FROM tb_salary
WHERE salary>ALL
(
SELECT salary
FROM tb_salary
WHERE position='Java'
);
(查詢薪資表中比Java最高工資高的所有員工職位名稱和薪資,比所有的都高→大於最大值)
ANY和SOME關鍵字
ANY與比較操作符聯合使用,表示與子查詢返回的任何值比較爲TRUE,則返回TRUE。SOME是ANY的別名,一般用的比較少。
舉例:SELECT position,salary
FROM tb_salary
WHERE salary>ANY
(
SELECT salary
FROM tb_salary
WHERE position='Java'
);
(查詢薪資表中比Java最低工資高的所有員工職位名稱和薪資,比任何的都低→小於最小值)
-
6.4.4 帶(NOT)EXISTS謂詞的子查詢
帶有EXISTS謂詞的子查詢不返回任何數據,只產生邏輯真值"true",或邏輯假值"false"。
由EXISTS引出的子查詢,其目標列表達式通常都用*。
若內層查詢結果非空,則外層的WHERE子句返回真值;若內層查詢結果爲空,則外層的WHERE子句返回假值。
(NOT EXISTS與其相反)
模板:SELECT 字段名1,字段名2,......
FROM 表名
WHERE EXISTS
(
SELECT *
FROM 表名
WHERE 條件表達式......
);
舉例:SELECT stu_name 學生姓名,stu_major 專業
FROM student
WHERE EXISTS
(
SELECT *
FROM score
WHERE student.stu_id=score.stu_id
AND cs_id="05203314"
);
(查詢選修課程號爲"05203314"的學生的姓名及專業)
7.SQL語句的編寫順序
SELECT ...
FROM ...
WHERE ...
GROUP BY ... HAVING ...
ORDER BY ...
8.SQL語句的執行順序
FROM ...
WHERE ...
GROUP BY ... HAVING ...
SELECT ...
ORDER BY ...
9.SQL語句中四大功能、九大動詞
SQL語句功能 | 對應的動詞 |
數據查詢 | SELECT |
數據定義 | CREATE、ALTER、DROP |
數據操縱 | INSERT、UPDATE、DELETE |
數據控制 | GRANT、REVOKE |
那麼,以上的所有內容就是博主自己總結的MySQL中常用的一些SQL語句,本篇博客後續還會向其中增添內容,還未100%的完成,因爲博主也還在學習數據庫的過程中,所以並不是大佬,博文當中或許也會出錯,還望諒解!!!