??專欄【MySQL】
??喜歡的詩(shī)句:更喜岷山千里雪 三軍過(guò)后盡開顏。
??音樂(lè)分享【如愿】
大一同學(xué)小吉,歡迎并且感謝大家指出我的問(wèn)題??
??多表查詢
?多表關(guān)系
在項(xiàng)目開發(fā)中,在進(jìn)行數(shù)據(jù)庫(kù)表結(jié)構(gòu)設(shè)計(jì)時(shí),會(huì)根據(jù)業(yè)務(wù)需求以及業(yè)務(wù)模塊之間的關(guān)系,分析并設(shè)計(jì)表結(jié)構(gòu),由于業(yè)務(wù)之間相互關(guān)聯(lián),所以各個(gè)表結(jié)構(gòu)之間也存在各種聯(lián)系,基本分為以下三種
- 一對(duì)多(多對(duì)一)
- 多對(duì)多
- 一對(duì)一
??一對(duì)多(多對(duì)一)
案例:部門和員工之間的關(guān)系
關(guān)系:一個(gè)部門對(duì)于多個(gè)員工,一個(gè)員工對(duì)應(yīng)一個(gè)部門
??實(shí)現(xiàn)
在多
的一方建立外鍵
,指向少
的一方的主鍵
??多對(duì)多
案例:學(xué)生與課程之間的關(guān)系
關(guān)系:一個(gè)學(xué)生可以選修多門課程,一門課程也可以供多個(gè)學(xué)生選擇
??實(shí)現(xiàn)
建立第三張中間表
,中間表至少包含兩個(gè)外鍵分別關(guān)聯(lián)兩方主鍵
??????創(chuàng)建兩個(gè)表并且插入數(shù)據(jù)
create table student(
id int auto_increment primary key comment '主鍵ID',
name varchar(10) comment '姓名',
no varchar(10) comment '學(xué)號(hào)'
) comment '學(xué)生表';
insert into student values (null,'小吉','123'),(null,'fufu','123'),(null,'御坂美琴','123'),(null,'海綿寶寶','123');
create table course(
id int auto_increment primary key comment '主鍵ID',
name varchar(10) comment '課程名稱'
) comment '課程表';
insert into course values (null,'java'),(null,'php'),(null,'mysql'),(null,'c嘎嘎');
??????創(chuàng)建第三個(gè)表
通過(guò)第三個(gè)表來(lái)維護(hù)他們之間的關(guān)系
create table student_course(
id int auto_increment comment '主鍵' primary key,
studentid int not null comment '學(xué)生ID',
courseid int not null comment '課程ID',
constraint fk_courseid foreign key (courseid) references course(id),
constraint fk_studentid foreign key (studentid) references course(id)
)comment '學(xué)生課程之間表';
insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);
??以圖形化的方式來(lái)表示
??一對(duì)一
案例:用戶與用戶詳情的關(guān)系
關(guān)系:一對(duì)一關(guān)系,多用于單表拆分,將一張表的基礎(chǔ)字段放在一張表中,其他詳情字段放在另一張表中,以提升操作效率
??實(shí)現(xiàn):
在任意一方加入外鍵,關(guān)聯(lián)另外一方的主鍵
,并且設(shè)置外鍵為唯一的(unique)
先建立表
create table tb_user(
id int auto_increment primary key comment '主鍵ID',
name varchar(10) comment '姓名',
age int comment '年齡',
gender char(1) comment '1: 男 , 2:女 ',
phone char(11) comment '手機(jī)號(hào)'
) comment '用戶基本信息表';
先建立表
create table tb_user_edu(
id int auto_increment primary key comment '主鍵ID',
degree varchar(20) comment '學(xué)歷',
major varchar(20) comment '專業(yè)',
primaryschool varchar(50) comment '小學(xué)',
middleschool varchar(50) comment '中學(xué)',
university varchar(50) comment '大學(xué)',
userid int unique comment '用戶ID',
constraint fk_userid foreign key (userid) references tb_user(id)
)comment '用戶教育信息表';
然后向表中插入數(shù)據(jù)
insert into tb_user(id, name, age, gender, phone) values
(null,'小吉','1','2','3'),
(null,'小吉','1','2','3'),
(null,'小吉','1','2','3'),
(null,'小吉','1','2','3');
insert into tb_user_edu(id, degree, major, primaryschool, middleschool, university, userid) values
(null,'博士','計(jì)算機(jī)','1','1','嗶哩嗶哩大學(xué)',1),
(null,'博士','計(jì)算機(jī)','1','1','嗶哩嗶哩大學(xué)',2),
(null,'博士','計(jì)算機(jī)','1','1','嗶哩嗶哩大學(xué)',3),
(null,'博士','計(jì)算機(jī)','1','1','嗶哩嗶哩大學(xué)',4);
一條userid就對(duì)應(yīng)一個(gè)用戶的基本信息
??以圖形化的方式展示
?多表查詢語(yǔ)法
select * from 表1,表2,……;
??單表查詢
??多表查詢
??我們發(fā)現(xiàn),最終的結(jié)果有16條,但是是為什么呢
因?yàn)?4=16
course中有4條,student中有4條,44=16
這種現(xiàn)象稱為笛卡兒積
??????笛卡兒積
是指在數(shù)學(xué)中,集合A和集合B的所有的組成情況
當(dāng)前就是兩張表所有的組成情況
但是在設(shè)計(jì)開發(fā)中,我們不需要這么多的情況,我們需要消除無(wú)效的情況
??消除無(wú)效的笛卡兒積
select * from course ,student where course.id=student.id;
?內(nèi)連接
??隱式內(nèi)連接
select 字段列表 from 表1,表2 where 條件……;
查詢學(xué)生的姓名以及關(guān)聯(lián)的課程
select student.name,course.name from student,course where student.id=course.id;
??顯示內(nèi)連接
select 字段列表 from 表1 (inner) join 表2 on 連接條件……;
查詢學(xué)生的姓名以及關(guān)聯(lián)的課程
select student.name,course.name from student inner join course on student.id=course.id;
?外連接
??左外連接
??相當(dāng)于查詢左表的所有數(shù)據(jù) 包含 左表和右表交集部分的數(shù)據(jù)
select 字段列表 from 表1 left (outer) join 表2 on 條件……;
會(huì)查詢到左表的所有數(shù)據(jù)
左表
??右外連接
??相當(dāng)于查詢右表的所有數(shù)據(jù) 包含 左表和右表交集部分的數(shù)據(jù)
select 字段列表 from 表1 right (outer) join 表2 on 條件……;
會(huì)查詢到右表的所有數(shù)據(jù)
?自連接
就是在同一張表中進(jìn)行查詢
需要把一張表看作兩張表
自連接必須起別名
原來(lái)的表
??聯(lián)合查詢
對(duì)于聯(lián)合查詢(union
),就是把多次查詢的結(jié)果合并起來(lái),形成一個(gè)新的查詢結(jié)果集
查詢到的多張表的列數(shù)要保持一致,而且字段列表也要保持一致
select 字段列表 from 表A……
union (all)
select 字段列表 from 表B……;
??union all
合并查詢到的兩個(gè)表,不進(jìn)行查重
??union
合并查詢到的兩個(gè)表,進(jìn)行查重
這里我們發(fā)現(xiàn),“鹿杖客”出現(xiàn)了兩次
那么我們可以去掉all
來(lái)去重
??子查詢
SQL語(yǔ)句中嵌套select語(yǔ)句,稱為嵌套查詢
,又稱為子查詢
select * from t1 where column1 = ( select column1 from t2 );
子查詢的外部語(yǔ)句可以是insert update delete selete的任何一個(gè)
??????根據(jù)查詢結(jié)果不同,分為
查詢方式 | 查詢結(jié)果 |
---|---|
標(biāo)量子查詢 | 子查詢結(jié)果為單個(gè)值 |
列子查詢 | 子查詢結(jié)果為一列 |
行子查詢 | 子查詢結(jié)果為一行 |
表子查詢 | 子查詢結(jié)果為多行多列 |
??????根據(jù)子查詢位置,分為where之后,from之后,select之后
??標(biāo)量子查詢
使用操作符 = > < >= <=
查詢結(jié)果返回的是單個(gè)值這種最簡(jiǎn)單的方式
??列子查詢
子查詢返回的是一列(可以是多行)
常用操作符:in,not in,any,some,all
操作符 | 描述 |
---|---|
in | 在指定的集合范圍之內(nèi),多選一 |
not in | 不在指定的集合范圍之內(nèi) |
any | 子查詢返回列表中,有任意一個(gè)滿足即可 |
some | 與any等同,使用some的地方都可以使用any |
all | 子查詢返回列表的所有值都必須滿足 |
??行子查詢
子查詢返回的是一行(可以是多列)
常用操作符:= <> in ,not in
或者
??表子查詢
子查詢返回的是多行多列
常用運(yùn)算符:in文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-499294.html
??如果大家有不明白的地方,或者文章有問(wèn)題,歡迎大家在評(píng)論區(qū)討論,指正??文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-499294.html
到了這里,關(guān)于【從刪庫(kù)到跑路】MySQL數(shù)據(jù)庫(kù)的查詢(單表查詢,多表查詢,內(nèi)外連接,聯(lián)合查詢,子查詢)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!