1. 程式人生 > >MySQL階段二——sql語句基礎(2)

MySQL階段二——sql語句基礎(2)

mysql

數據查詢操作

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

char(4) primary key,

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)循環12

05.內連接

01)數據內部的連接,要求,連接的多個數據都必須存在才能進行連接。

02)語法:tb_left inner join tb_right on 連接條件;

03)內連接的處理:內連接,在連接的時候,是可以忽略連接條件的。意味著,所有的左表的數據,都要與右表的記錄做一個連接。共存在m*n個連接。這種連接,就稱之為,交叉連接,或者笛卡兒積連接。此時可以使用cross join代替inner join

註意:MySQL中的crossjoininnerjoin相同,但在數據庫的定義上,交叉連接就是笛卡兒積,是沒有條件的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)