MySQL階段二——sql語句基礎(2)
數據查詢操作
01.創建數據表
(02-05練習)
(連接查詢練習使用)
02.單表查詢
03.分組統計
04.嵌套查詢
05.集合查詢
06.連接查詢
07.連接查詢與集合查詢的不同
數據查詢操作
01.創建數據表
1)創建Student表
(2)創建Course表
(3)創建SC表
(02-05練習)
create table student
(
sno char(8) primary key,
sname char(8),
ssex char(2)not null,
sage int,
sdept char(20)
);
create table course
(
cno
cname char(40)not null,
cpno char(4),
ccredit smallint,
);
create table sc
(
sno char(8)foreign key(sno)references student(sno),
cno char(4),
grade smallint
);
(連接查詢練習使用)
CREATE TABLE `join_class` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c_name` char(7) DEFAULT NULL,
`room` char(3) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
CREATE TABLE `join_teacher` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`t_name` varchar(10) DEFAULT NULL,
`gender` enum(‘male‘,‘female‘,‘secret‘) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
CREATE TABLE `join_teacher_class` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`t_id` int(11) DEFAULT NULL,
`c_id` int(11) DEFAULT NULL,
`days` tinyint(4) DEFAULT NULL,
`begin_date` date DEFAULT NULL,
`end_date` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
02.單表查詢
01)按照目標列查詢
select sno,sname,sage from student;
02)目標列包含表達式查詢
select sname,‘year of birth:‘,2014-sage,lower(sdept) from student;
03)查詢結果集中修改列名稱
select sname,‘year of birth:‘as birth,2000-sage BIRTHDAY,DEPARTMENT=lower(sdept) from student;
04)取消重復行
select sno from sc;
select DISTINCT sno from sc;
05)簡單條件查詢
select sname from student where sdept=‘cs‘;
06)按範圍查詢
select sname,sdept,sage from student where sage between 20 and 23
07)查詢屬性值屬於指定集合的行
select sname,sno,ssex from student where sdept in(‘IS‘,‘MA‘,‘CS‘);
08)模糊查詢
select sname,sno,ssex from student where sname like‘劉%‘
09)查詢空值
select sno,cno from sc where grade is null;
10)結果集排序
select * from student order by sdept,sage desc;
升序|降序(asc|desc)
校對規則決定排序關系
允許多字段排序,先找第一個字段排序,如果不能區分,再按照第二個字段排序,以此類推。
註:如果是分組,則應該使用分組字段進行排序的group by語法。
11)多重條件查詢
select sno,sname from student where sdept=‘IS‘and sage>23
12)limit語法
限制獲取的記錄數量,放在最後。
語法:limit offset,row_count
Offset:偏移量(類似數組下標,索引位從0開始)
Row_count:總記錄數,如果數量大於,則獲取余下的。
03.分組統計
01)聚集函數的使用
Count(*)
Count([distinct|all] 列名)
Sum([distinct|all] 列名)
Avg([distinct|all] 列名)
Max([distinct|all] 列名)
Min([distinct|all] 列名)
select count(*) from student;
select count(distinct sno)from sc
select max(grade) from sc
select sum(grade) 總分,avg(grade) 均分,max(grade) 最高分
from sc group by cno
02)分組統計
如果分組後還要求按一定的條件對這些組進行篩選,最終只輸出滿足指定條件的組,則可以使用having短語指定篩選條件。
Where子句和having短語的區別在於作用對象不同。Where子句作用與基本表或視圖,從中選擇滿足條件的元組。Having短語作用與組,從中選擇滿足條件的組。
select cno 課程號,count(*) 人數,avg(grade) 均分,max(grade) 最高分
from sc group by cno
having avg(grade)>90
註意:where子句中是不能用聚集函數作為條件表達式的,這裏條件表達式用having
04.嵌套查詢
l 帶有IN謂詞的子查詢
select Sno,Sname,Sdept from Student
where Sdept IN ( select Sdept from Student where Sname= ‘劉晨‘);
l 帶有比較運算符的子查詢
select Sno, Cno from SC x
where Grade >= ( select AVG(Grade) from SC y
where y.Sno=x.Sno);
l 帶有修飾符的比較運算符引出的子查詢
select Sname,Sage from Student
where Sage < ALL ( select Sage from Student where Sdept= ‘CS‘)
AND Sdept <> ‘CS‘ ;
>any <any >=any <=any
>all<all>=all <=all
l 帶有exists引出的子查詢
select Sname from Student
where EXISTS (select * from SC where Sno=Student.Sno AND Cno= ‘1‘)
05.集合查詢
l 集合並
select * from Student where Sdept= ‘CS‘
UNION
select * from Student where Sage<=19
l 集合交
select * from Student where Sdept=‘CS‘
INTERSECT
select * from Student where Sage<=19
l 集合差
select * from Student where Sdept=‘CS‘
EXCEPT
select * from Student where Sage <=19;
註意:
規定,多個select語句的檢索到的字段數,必須一致。
更加嚴格的是,數據類型上,應該也有要求一致;但是,MySQL內部會做類型轉換處理,要求是能夠轉換成功;
提示:
在語句的括號不是必須的。
檢索結果中的列名稱問題:第一條select語句的列名而定。
排序:
子語句結果的排序:
01.將子語句包裹子括號內
02.子語句的order by,
只有在order bby配合limit是才生效。原因是:union在做子語句時,會對limit子句的order by優化(忽略)。
06.連接查詢
01.連接概述
每個實體,一個表,一個業務邏輯,使用多個實體的數據,多張表應該一起使用,將多個表的記錄連接起來。
02.總體思路
將所有的數據,按照某種條件,連接起來 ,再進行篩選處理。
03.連接的分類
根據連接的條件不同,分類如下:
內連接:數據內部的連接,要求,連接的多個數據都必須存在才能進行連接。
外連接:如果負責連接的一個或多個數據不真實存在,則稱為外連接。
自然連接
內外連接的區別:
#內連接
SELECT join_teacher.t_name,join_teacher_class.begin_date,join_teacher_class.days
FROM join_teacher INNER JOIN join_teacher_class
ON join_teacher.id=join_teacher_class.t_id;
#外連接
SELECT join_teacher.t_name,join_teacher_class.begin_date,join_teacher_class.days
FROM join_teacher LEFT OUTER JOIN join_teacher_class
ON join_teacher.id=join_teacher_class.t_id;
註意:多了一個孫武
04.連接過程
01)先拿左表數據依次與右表連接(左表第一條與右表第一條,左表第一條與右表第二條...)
02)判斷條件 on,條件相等,保留結果。
03)循環1,2步
05.內連接
01)數據內部的連接,要求,連接的多個數據都必須存在才能進行連接。
02)語法:tb_left inner join tb_right on 連接條件;
03)內連接的處理:內連接,在連接的時候,是可以忽略連接條件的。意味著,所有的左表的數據,都要與右表的記錄做一個連接。共存在m*n個連接。這種連接,就稱之為,交叉連接,或者笛卡兒積連接。此時可以使用cross join代替inner join。
註意:MySQL中的crossjoin與innerjoin相同,但在數據庫的定義上,交叉連接就是笛卡兒積,是沒有條件的inner join。
MySQL inner join是默認的連接方案,可以省略inner。
04)有條件的內連接:
會在連接時過濾非法的連接。
Where的寫法:數據過濾,理解上,數據安裝交叉連接完成後,再做數據過濾。
On的寫法:在連接時,就對數據進行判斷。
Using的寫法:using要求,負責連接的兩個實體之間的字段名稱一致。
建議是,在有同名字段時,使用using,而在通用條件的時候,使用on。
在數據過濾時(不是指的連接過濾)使用where。
註意:查詢條件,與外連接通用(外連接,不能使用where作為連接條件)
Using條件進行連接:
05)多種組合連接,查詢結果相同但是邏輯不同
06.外連接
如果負責連接的一個或多個數據不真實存在,則稱為外連接。
01)分類
左外連接
右外連接
全外連接(MySQL暫時不支持)
02)左外連接(left outer join:outer可以省略)
在連接的時候,如果出現左邊表數據連接不到右邊表的情況,則左邊表的數據在最終結果中保留,右邊表采用虛擬數據。如果 出現右邊表數據連接不到左邊表數據,右邊表數據被丟棄。
03)右外連接(right join)
與左外連接相反。
07.自然連接
通過MySQL自己的判斷完成連接過程:
不需要指定連接條件。MySQL會使用多表內的,相同字段,作為連接條件。
分類:自然連接分成內外之分:
內,natural join
外,左外,右外
Natrual left join
Natural right join
例:
create table one(
One_id int,
Ont_data char(1),
Public_filed int
);
Create table two(
Two_id int,
Two_data char(1) not null default ‘t’,
Putblic_field int
);
註意:連接時,支持多表連接
08.練習1
01)表
查詢某個班級所有學生的全部信息;
Select s.*,si.* from info_class as c left join info_student as s on c.id=s.clsss_id
Left join info_student_info as si on s.id=si.id where c.class_name=’php’;
09.練習2(重要面試題)
上面兩個是表,下面是要得到的結果
查詢4月份所有的比賽結果:
Match left join class on match.host_id=class.id left join class on match.guest_id=class.id
010.練習3
Subquery(子查詢)+join
Id | Dept_name | Parent_id |
1 | 行政部 | 0 |
2 | 教學部 | 0 |
3 | PHP | 2 |
4 | Java | 2 |
5 | .net | 2 |
6 | 平面 | 2 |
7 | 咨詢 | 1 |
8 | 財務 | 1 |
任務一:獲得所有的頂級部門
任務二:獲得教學部門的所有子部門
07.連接查詢與集合查詢的不同
Union查詢的時記錄之間的組合
Join查詢的是字段上的組合
本文出自 “秦斌的博客” 博客,謝絕轉載!
MySQL階段二——sql語句基礎(2)