目錄
一、表的創建
1.1創建學生表student_one
Sql語句:
create table student_one(
sno varchar(20) not null primary key,
sname varchar(20) not null,
ssex varchar(20) not null,
sbirthday datetime,
class varchar(20)
)charset=utf8;
加入數據:
insert into student_one values('1','陳奇','男','2000-11-02','1');
insert into student_one values('2','陳飛','男','1999-12-05','2');
insert into student_one values('3','周杰','女','1989-03-01','3');
insert into student_one values('4','昆凌','男','1989-04-15','4');
insert into student_one values('5','王麗','女','1999-05-16','5');
insert into student_one values('6','蔡蔡','男','2000-08-17','6');
運行結果:
1.2創建教師表teacher_one
Sql語句:
create table teacher_one
(
tno varchar(20) not null primary key,
tname varchar(20) not null,
tsex varchar(20) not null,
depart varchar(20) not null
)charset=utf8;
加入數據:
insert into teacher_one values('100','斯內普','男','計算機');
insert into teacher_one values('101','哈利波特','男','土木工程');
insert into teacher_one values('102','德拉科','男','中文');
insert into teacher_one values('103','郝敏','女','歷史');
insert into teacher_one values('104','莉莉','女','舞蹈');
運行結果:
1.3創建課程表course_one
Sql語句:
create table course_one(
cno varchar(20) not null primary key,
cname varchar(20) not null,
tno varchar(20) not null,
foreign key(tno) references teacher_one(tno)
)charset=utf8;
加入數據:
insert into course_one values('0-1','計算機導論','100');
insert into course_one values('1-5','混凝土結構','101');
insert into course_one values('2-1','古代文論','102');
insert into course_one values('3-2','世界古代史','103');
insert into course_one values('4-2','蒙古舞','104');
運行結果:
1.4創建成績表score_one
Sql語句:
create table score_one(
sno varchar(20) not null,
foreign key(sno) references student_one(sno),
cno varchar(20) not null,
foreign key(cno) references course_one(cno),
degree decimal
)charset=utf8;
加入數據:
insert into score_one values('1','0-1','99');
insert into score_one values('2','1-5','88');
insert into score_one values('3','2-1','77');
insert into score_one values('4','3-2','66');
insert into score_one values('5','4-2','98');
insert into score_one values('6','3-2','99');
運行結果:
二、基於多表的連接查詢
多表查詢的連接謂詞
Join:將兩個表連接在一起,可進行笛卡爾積、內連接、外連接
2.1笛卡爾積(交叉連接)
舉例:
目的:將teacher_one表和course_one表做笛卡爾積
Sql語句:
SELECT *
FROM teacher_one
CROSS JOIN course_one;
運行結果:
2.2 內連接:
內連接是最常見的一種連接,它也被稱爲普通連接和普通連接,但是隻連接匹配的行,所以內連接可能丟失信息
2.2.1顯示內連接
語法
SELECT 查詢的字段
FROM table1 JOIN table2
ON table_b ON table_a.外鍵 = table_b.主鍵;
舉例:
目的:將學生學號,名字,成績查詢出來
Sql語句:
SELECT student_one.sno, student_one.sname, score_one.degree
FROM score_one JOIN student_one
ON score_one.sno = student_one.sno;
運行結果:
2.2.2隱式內連接
語法:
SELECT 查詢的字段
FROM table_a , table_b
WHERE table_a.外鍵 = table_b.主鍵;
舉例:
目的:將學生學號,名字,成績查詢出來
Sql語句:
SELECT student_one.sno, student_one.sname, score_one.degree
FROM score_one, student_one
WHERE score_one.sno = student_one.sno;
運行結果:
2.3外連接查詢
外連接查詢擴充了內連接查詢的功能,包含全外連接、左外連接、右外連接
2.3.1左外連接
保留第一個表所有行,而第二個表只包含與第一個表匹配的行,第二個表相應的空行爲NULL值
語法:
SELECT 查詢的字段
FROM table1 LEFT JOIN table2
ON 條件
舉例:
目的:將每位老師的所教的課程查詢出來
Sql語句:
SELECT teacher_one.tname,course_one.cname
FROM teacher_one LEFT JOIN course_one
ON course_one.tno = teacher_one.tno
運行結果:
2.3.2右外連接
保留第二個表所有行,而第一個表只包含與第二個表匹配的行,第一個表相應的空行爲NULL值,與左外連接相反
語法
SELECT 查詢的字段
FROM table1 RIGHT JOIN table2
ON 條件
舉例:
目的:將學生的學號,姓名,成績查詢出來
Sql語句:
SELECT student_one.sno,student_one.sname,score_one.degree
FROM student_one RIGHT JOIN score_one
ON score_one.sno=student_one.sno
運行結果:
2.4子查詢
2.4.1普通子查詢
一條select語句結果作爲另一條select語句的(查詢條件,查詢結果等)。
語法:
SELECT 查詢的字段
FROM table_a
WHERE 字段 = (SELECT 字段 FROM table_a [WHERE 條件])
舉例:
目的:將sno小於3的同學的成績查詢出來
Sql語句:
SELECT student_one.sname, score_one.degree
FROM student_one LEFT JOIN score_one
ON score_one.sno = student_one.sno
WHERE student_one.sno IN (SELECT sno FROM student_one WHERE student_one.sno <3)
注意:當子查詢產生一系列的值時,用IN,如果只有單個的值,就用=
運行結果:
2.4.2使用EXISTS的子查詢
EXISTS:
EXISTS搜索條件並不真正使用子查詢的結果,它僅僅測試子查詢是否產生任何結果
語法:
SELECT 查詢的字段
FROM table
WHERE EXISTS (條件)
舉例:
目的:查詢teacher_one表裏面是否存在教師編號小於105的教師,不存在返回NULL
Sql語句:
SELECT teacher_one.tname, course_one.cname
FROM teacher_one LEFT JOIN course_one
ON course_one.tno = teacher_one.tno
WHERE EXISTS (SELECT tno FROM teacher_one WHERE teacher_one.tno <105)
運行結果:
2.4.3使用 NOT EXISTS的子查詢
NOT EXISTS:
與 EXISTS的作用相反,如果子查詢沒有返回行,則滿足 NOT EXISTS的WHERE子句
語法:
SELECT 查詢的字段
FROM table
WHERE NOT EXISTS (條件)
舉例:
目的:查詢teacher_one表裏面是否存在教師編號等於109的教師,存在返回NULL,不存在返回數據
Sql語句:
SELECT *
FROM teacher_one
WHERE NOT EXISTS (SELECT tno FROM teacher_one WHERE tno=109)
運行結果:
2.5 組合查詢(使用UNION運算符組合多個結果)
語法:
查詢語句A
UNION
查詢語句B
舉例:
目的:將性別爲男,學號爲5的同學的學號,姓名,年齡都查詢出來
Sql語句:
SELECT sno,sname,YEAR(from_days(datediff(now(), sbirthday))) AS '年齡'
FROM student_one
WHERE ssex='男'
UNION ALL
SELECT sno,sname,YEAR(from_days(datediff(now(), sbirthday))) AS '年齡'
FROM student_one
WHERE sno=5
運行結果: