【MySQL】黑马教程MySQL数据库 MySQL基础(二)
文章目錄
- 【MySQL】黑馬教程MySQL數(shù)據(jù)庫(kù) MySQL基礎(chǔ)(二)
- 函數(shù)
- 字符串函數(shù)
- 數(shù)值函數(shù)
- 日期函數(shù)
- 流程函數(shù)
- 總結(jié)
- 約束
- 概述
- 約束演示
- 外鍵約束
- 添加外鍵
- 刪除外鍵
- 刪除/更新行為
- 多表查詢
- 多表關(guān)系
- 多表查詢概念
- 內(nèi)連接
- 外連接
- 自連接
- 聯(lián)合查詢 - union,union all(集合查詢)
- 子查詢
- 標(biāo)量子查詢
- 列子查詢
- 行子查詢
- 表子查詢
- 多表查詢案例
- 案例
【MySQL】黑馬教程MySQL數(shù)據(jù)庫(kù) MySQL基礎(chǔ)(二)
本專欄主要是根據(jù)B站黑馬程序員網(wǎng)課視頻寫該專欄,網(wǎng)課鏈接如下黑馬程序員 MySQL數(shù)據(jù)庫(kù)入門到精通,從mysql安裝到mysql高級(jí)、mysql優(yōu)化全囊括。
使用的軟件是DataGrip,可以在官網(wǎng)下載,如果需要破解,可以私信聯(lián)系,免費(fèi)破解。(一鍵操作即可,懂得都懂😀😀😀)
寫該專欄的目的,一方面作為個(gè)人筆記,純手工敲出來,運(yùn)行結(jié)果均為自己動(dòng)手敲出,大家盡量敲一遍(沒必要根據(jù)我的一樣,參考網(wǎng)課),切勿手高眼低;另一方面,網(wǎng)上的教程層次不齊,有些地方看的難受,比如代碼展示方面,純文字,并且比較啰嗦,抓重點(diǎn)即可。(僅個(gè)人觀點(diǎn),勿噴😸😸😸)
函數(shù)
函數(shù)是指一段可以直接被另一段程序調(diào)用的程序或代碼。
字符串函數(shù)
MySQL中內(nèi)置了很多字符串函數(shù),常用的幾個(gè)如下:
| concat(S1, S2, ……Sn) | 字符串拼接,將S1, S2, ……Sn拼接成一個(gè)字符串 |
| lower(str) | 將字符串str全部轉(zhuǎn)為小寫 |
| upper(str) | 將字符串str全部轉(zhuǎn)為大寫 |
| lpad(str, n, pad) | 左填充,用字符串pad對(duì)str的左邊進(jìn)行填充,達(dá)到n個(gè)字符串長(zhǎng)度 |
| rpad(str, n, pad) | 右填充,將字符串pad對(duì)str的右邊進(jìn)行填充,達(dá)到n個(gè)字符串長(zhǎng)度 |
| trim(str) | 去掉字符串頭部和尾部的空格 |
| substring(str, start, len) | 返回從字符串str從start位置起的len個(gè)長(zhǎng)度的字符串 |
eg:用于業(yè)務(wù)需求變更,企業(yè)員工的工號(hào),統(tǒng)一為5位數(shù),目前不足5位數(shù)的全部在前面補(bǔ)0,比如:1號(hào)員工的工號(hào)應(yīng)該為00001.
update emp set workno = lpad(workno, 5, '0');數(shù)值函數(shù)
常見的數(shù)值函數(shù)如下:
| ceil(x) | 向上取整 |
| floor(x) | 向下取整 |
| mod(x) | 返回x/y的模 |
| rand() | 返回0~1內(nèi)的隨機(jī)數(shù) |
| round(x, y) | 求參數(shù)x的四舍五入的值,保留y位小數(shù) |
eg:# 通過數(shù)據(jù)庫(kù)的數(shù)據(jù),生成一個(gè)六位數(shù)的隨機(jī)驗(yàn)證碼
select lpad(round(rand() * 1000000,0), 6, '0');日期函數(shù)
常見的日期函數(shù):
| curdata() | 返回當(dāng)前日期 |
| curtime() | 返回當(dāng)前時(shí)間 |
| now() | 返回當(dāng)前日期和時(shí)間 |
| year(date) | 獲取指定date的年份 |
| month(date) | 獲取指定date的月份 |
| day(date) | 獲取指定date的日期 |
| data_add(date, interval expr type) | 返回一個(gè)日期/時(shí)間值上加上一個(gè)時(shí)間間隔expr后的時(shí)間值 |
| datediff(date1, date2) | 返回起始時(shí)間date1 和結(jié)束時(shí)間date2之間的天數(shù) |
eg:查詢所有員工的入職天數(shù),并根據(jù)入職天數(shù)倒敘排序
select name ,datediff(curdate(), entrydate) as entryday from emp order by entryday desc;流程函數(shù)
流程函數(shù)也是很常見的一類函數(shù),可以在SQL語(yǔ)句中實(shí)現(xiàn)條件篩選,從而提高語(yǔ)句的效率。
| if(value, t, f) | 如果value為true,則返回t,否則返回f |
| ifnull(value1, value2) | 如果value1不為空,返回value1,否則返回value2 |
| case when [val1] then [res1] ……else [default] end | 如果val1為true,返回res1,……否則返回default默認(rèn)值 |
| case [expr] when [val1] then [res1]…… else [default] end | 如果expr的值等于val1,返回res1,……否則返回default默認(rèn)值 |
eg:統(tǒng)計(jì)班級(jí)各個(gè)學(xué)員的成績(jī),展示的規(guī)則如下
- >= 85 展示優(yōu)秀
- >=60 展示及格
- 否則,展示不及格
總結(jié)
-
字符串函數(shù)
concat, lower, upper, lpad, rpad, trim, substring -
數(shù)值函數(shù)
ceil, floor, mod, rand, round -
日期函數(shù)
curtime, curdate, now, year, month, day, date_add, datediff -
流程函數(shù)
if, ifnull, case[...] when ...then ...else...end
約束
概述
概念:約束是作用于表字段上的規(guī)則,用于限制存儲(chǔ)在表中的數(shù)據(jù)。
目的:保證數(shù)據(jù)庫(kù)中數(shù)據(jù)的正確、有效性和完整性。
分類:
| 非空約束 | 限制該字段的數(shù)據(jù)不能為null | not null |
| 唯一約束 | 保證該字段的所有數(shù)據(jù)都是唯一,不重復(fù)的 | unique |
| 主鍵約束 | 主鍵是一行的唯一表示,要求非空且唯一 | primary key |
| 默認(rèn)約束 | 保存數(shù)據(jù)時(shí),如果未指定該字段的值,則采用默認(rèn)值 | default |
| 檢查約束 | 保證字段值滿足某一個(gè)條件 | check |
| 外鍵約束 | 用來讓兩張表的數(shù)據(jù)間之間建立連接,保證數(shù)據(jù)的一致性和完整性 | foreing key |
注意:約束是作用于表中字段上的,可以在創(chuàng)建表/修改表的時(shí)候添加約束。
約束演示
案例:根據(jù)需求,完成表結(jié)構(gòu)的創(chuàng)建
| id | ID唯一標(biāo)識(shí) | int | 主鍵,并且自動(dòng)增長(zhǎng) | primary key,auto_increment |
| name | 姓名 | varchar(10) | 不為空,并且唯一 | not null, unique |
| age | 年齡 | int | 大于0,并且小于等于120 | check |
| status | 狀態(tài) | char(1) | 如果沒有指定該值,默認(rèn)為1 | default |
| gender | 性別 | char(1) | 無 |
外鍵約束
外鍵用來讓兩張表的數(shù)據(jù)之間建立連接,從而保證數(shù)據(jù)的一致性和完整性。
添加外鍵
alter table 表名 add constraint 外鍵名稱 foreign key(外鍵字段名) references 主表(主表列名);eg:添加外鍵
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);刪除外鍵
alter table 表名 drop foreign key 外鍵名稱;eg:刪除外鍵
alter table emp drop foreign key fk_emp_dept_id;刪除/更新行為
| no action | 當(dāng)在父表中刪除/更新對(duì)應(yīng)記錄時(shí),首先檢查該記錄是否有對(duì)應(yīng)外鍵,如果有則不允許刪除/更新。(與restrict一致) |
| restrict | 當(dāng)在父表中刪除/更新對(duì)應(yīng)記錄時(shí),首先檢查該記錄是否有對(duì)應(yīng)外鍵,如果有則不允許刪除/更新。(與no action一致) |
| cascade | 當(dāng)在父表中刪除/更新對(duì)應(yīng)記錄時(shí),首先檢查該記錄是否有對(duì)應(yīng)外鍵,如果有,則也刪除/更新外鍵在子表中的記錄。 |
| set null | 當(dāng)在父表中刪除對(duì)應(yīng)記錄時(shí),首先檢查該記錄是否有對(duì)應(yīng)外鍵,如果有則設(shè)置子表中該外鍵值為null(這就要求該外鍵允許取null) |
| set default | 父表有變更時(shí),子表將外鍵列設(shè)置成一個(gè)默認(rèn)的值(lnnodb不支持) |
eg:外鍵的刪除和更新行為——級(jí)聯(lián)更新
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;eg2:
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null;多表查詢
多表關(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ì)多
案例:部門 與 員工的關(guān)系
關(guān)系:一個(gè)部門對(duì)應(yīng)多個(gè)員工,一個(gè)員工對(duì)應(yīng)一個(gè)部門
實(shí)現(xiàn):在多的一方建立外鍵,指向一的方的主鍵
# 多對(duì)多 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, '黛綺絲', '2000100101'), (null, '謝遜', '2000100102'), (null, '殷天正', '2000100103'), (null, '韋一笑', '2000100104');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, 'Hadoop');create table student_course(id int auto_increment primary key comment '主鍵',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 student(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); -
多對(duì)多
-
一對(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(50) 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 '用戶教育信息表';insert into tb_user(id, name, age, gender, phone) VALUES (null, '黃渤', 45, '1', '18800001111'),(null, '冰冰', 35, '2', '18800001111'),(null, '馬云', 55, '1', '18800008888'),(null, '李彥宏', 50, '1', '18800009999');insert into tb_user_edu(id, degree, major, primaryschool, middleschool, university, userid) VALUES (null, '本科', '舞蹈', '靜安區(qū)第一小學(xué)', '靜安區(qū)第一中學(xué)', '北京舞蹈學(xué)院', 1), (null, '碩士', '表演', '朝陽(yáng)區(qū)第一小學(xué)', '朝陽(yáng)區(qū)第一中學(xué)', '北京電影學(xué)院', 2), (null, '本科', '英語(yǔ)', '杭州市第一小學(xué)', '杭州市第一中學(xué)', '杭州師范大學(xué)', 3), (null, '本科', '應(yīng)用數(shù)學(xué)', '陽(yáng)泉第一小學(xué)', '陽(yáng)泉第一中學(xué)', '清華大學(xué)', 4);
多表查詢概念
概述:指從多張表中查詢數(shù)據(jù)
笛卡爾積:笛卡爾乘積是指在數(shù)學(xué)中,兩個(gè)集合A集合 和 B集合的所有組合情況。(在查詢多表時(shí),需要消除無效的笛卡爾積)
數(shù)據(jù)準(zhǔn)備:
# 如果表存在,則先刪除外鍵后再重建 alter table emp drop foreign key fk_emp_dept_id; # 刪除dept表 drop table if exists dept; # 創(chuàng)建dept表 create table dept (id int auto_increment comment 'ID' primary key,name varchar(50) not null comment '部門名稱' ) comment '部門表'; insert into dept (id, name) values (1, '研發(fā)部'),(2, '市場(chǎng)部'),(3, '財(cái)務(wù)部'),(4, '銷售部'),(5, '總經(jīng)辦'),(6, '人事部');drop table if exists emp; # 創(chuàng)建emp表 create table emp (id int auto_increment comment 'ID' primary key,name varchar(50) not null comment '姓名',age int comment '年齡',job varchar(20) comment '職位',salary int comment '薪資',entrydate date comment '入職時(shí)間',managerid int comment '直屬領(lǐng)導(dǎo)ID',dept_id int comment '部門ID',-- 添加外鍵constraint fk_emp_dept_id foreign key (dept_id) references dept (id) ) comment '員工表'; # 向emp中插入數(shù)據(jù) insert into emp (id, name, age, job, salary, entrydate, managerid, dept_id) values (1, '金庸', 66, '總裁', 20000, '2000-01-01', null, 5),(2, '張無忌', 20, '項(xiàng)目經(jīng)理', 12500, '2005-12-05', 1, 1),(3, '楊逍', 33, '開發(fā)', 8400, '2000-11-03', 2, 1),(4, '韋一笑', 48, '開發(fā)', 11000, '2002-02-05', 2, 1),(5, '常遇春', 43, '開發(fā)', 10500, '2004-09-07', 3, 1),(6, '小昭', 19, '程序員鼓勵(lì)師', 6600, '2004-10-12', 2, 1),(7, '滅絕', 60, '財(cái)務(wù)總監(jiān)', 8500, '2002-09-12', 1, 3),(8, '周芷若', 19, '會(huì)計(jì)', 48000, '2006-06-02', 7, 3),(9, '丁敏君', 23, '出納', 5250, '2009-05-13', 7, 3),(10, '趙敏', 20, '市場(chǎng)部總監(jiān)', 12500, '2004-10-12', 1, 2),(11, '鹿杖客', 56, '職員', 3750, '2006-10-03', 10, 2),(12, '鶴筆翁', 19, '職員', 3750, '2007-05-09', 10, 2),(13, '方東白', 19, '職員', 5500, '2009-02-12', 10, 2),(14, '張三豐', 88, '銷售總監(jiān)', 14000, '2004-10-12', 1, 4),(15, '俞蓮舟', 38, '銷售', 4600, '2004-10-12', 14, 4),(16, '宋遠(yuǎn)橋', 40, '銷售', 4600, '2004-10-12', 14, 4),(17, '陳友諒', 42, null, 2000, '2011-10-12', 1, null);結(jié)果演示:
select * from emp, dept; # 笛卡爾積 select * from emp, dept where emp.dept_id = dept.id;內(nèi)連接
內(nèi)連接查詢語(yǔ)法:
-
隱式內(nèi)連接
select 字段列表 from 表1,表2 where 條件……; -
顯式內(nèi)連接
select 字段列表 from 表1 [inner] join 表2 on 連接條件……;
內(nèi)連接查詢的是兩張表交集的部分
eg:查詢每一個(gè)員工姓名,及關(guān)聯(lián)的部門的名稱
# 查詢每一個(gè)員工的姓名,及關(guān)聯(lián)的部門的名稱(隱式內(nèi)連接實(shí)現(xiàn)) select emp.name, dept.name from emp, dept where emp.dept_id = dept.id;# 查詢每一個(gè)員工的姓名,及關(guān)聯(lián)的部門的名稱(顯式內(nèi)連接實(shí)現(xiàn)) select emp.name, dept.name from emp inner join dept where emp.dept_id = dept.id; # 正常寫法 select emp.name, dept.name from emp join dept where emp.dept_id = dept.id; # 省略inner select e.name, d.name from emp e join dept d where e.dept_id = d.id; # 起別名外連接
外連接查詢語(yǔ)法:
-
左外連接
select 字段列表 from 表1 left [outer] join 表2 on 條件……;相當(dāng)于查詢字段1(左表)的所有數(shù)據(jù)包含表1和表2交集部分的數(shù)據(jù)
-
右外連接
select 字段列表 from 表1 right [outer] join 表2 on 條件……;相當(dāng)于查詢表2(右表)的所有數(shù)據(jù)包含表1和表2交集部分?jǐn)?shù)據(jù)
eg:查詢emp表的所有數(shù)據(jù),和對(duì)應(yīng)的部門信息(左外連接)
select emp.*, dept.name from emp left outer join dept on emp.dept_id = dept.id; select emp.*, dept.name from emp left join dept on emp.dept_id = dept.id;eg:查詢dept表的所有數(shù)據(jù),和對(duì)應(yīng)的員工信息(右外連接)
select dept.*, emp.* from emp right outer join dept on emp.dept_id = dept.id; select * from emp e right join dept d on e.dept_id = d.id;自連接
自連接查詢語(yǔ)法:
select 字段列表 from 表A 別名A join 表名A 別名B on 條件……;自連接查詢,可以是內(nèi)連接,也可以是外連接查詢。一定要起別名
eg:查詢 員工 及其 所屬領(lǐng)導(dǎo)的名字
select a.name '員工', b.name '領(lǐng)導(dǎo)' from emp a join emp b on a.managerid = b.id;eg:查詢所有員工 emp 及其領(lǐng)導(dǎo)的名字 emp, 如果員工沒有領(lǐng)導(dǎo),也需要查詢出來
select a.name '員工', b.name '領(lǐng)導(dǎo)' from emp a left join emp b on a.managerid = b.id;聯(lián)合查詢 - union,union all(集合查詢)
對(duì)于union查詢,就是把多次查詢的結(jié)果合并起來,形成一個(gè)新的查詢結(jié)果集。
select 字段列表 from 表A …… union [all] select 字段列表 from 表B ……;eg:將工資低于 5000 的員工, 和 年齡大于50歲的員工全部查詢出來
select * from emp where salary < 5000 union all select * from emp where age > 50; # 結(jié)果重復(fù) select * from emp where salary < 5000 union select * from emp where age > 50; # 結(jié)果無重復(fù)對(duì)于聯(lián)合查詢的多張表的列數(shù)必須保持一致,字段類型也需要保持一致。
union all會(huì)將全部的數(shù)據(jù)直接合并在一起,union會(huì)對(duì)合并之后的數(shù)據(jù)去重
子查詢
-
概念:SQL語(yǔ)句中嵌套select語(yǔ)句,稱為嵌套語(yǔ)句,又稱子查詢。
select * from t1 where column1 = (select column1 from t2);子查詢外部的語(yǔ)句可以使insert / update / delete / select 的任何一個(gè)。
-
根據(jù)子查詢結(jié)果不同,分為:
- 標(biāo)量子查詢(子查詢結(jié)果為單個(gè)值)
- 列子查詢(子查詢結(jié)果為一列)
- 行子查詢(子查詢結(jié)果為一列)
- 表子查詢(子查詢結(jié)果為多行多列)
-
根據(jù)子查詢位置,分為: where之后、from之后、select之后。
標(biāo)量子查詢
子查詢返回的結(jié)果是單個(gè)值(數(shù)字、字符串、日期等),最簡(jiǎn)單地形式,這種子查詢稱為標(biāo)量子查詢
常用的操作符:= <> > >= < <=
eg:查詢銷售部的所有員工信息
# a. 查詢”銷售部“部門ID select id from dept where name = '銷售部';# b. 根據(jù)銷售部門ID,查詢員工信息 select * from emp where dept_id = 4; select * from emp where dept_id = (select id from dept where name = '銷售部');eg:查詢?cè)?方東白 入職之后的員工信息
# 插入 方東白 的入職日期 select entrydate from emp where name = '方東白';# 查詢指定入職日期之后入職的員工信息 select * from emp where entrydate > (select entrydate from emp where name = '方東白');列子查詢
子查詢返回的結(jié)果是一列(可以是多行),這種查詢稱為列子查詢
常用的操作符: in、 not in、 any 、some 、all
| in | 在指定集合范圍內(nèi),多旋一 |
| not in | 不在指定的集合范圍之內(nèi) |
| any | 子查詢返回列表中,有任何一個(gè)滿足即可 |
| some | 與any等同,使用some的地方都可以使用any |
| all | 子查詢返回列表的所有值都必須滿足 |
eg;查詢 銷售部 和 市場(chǎng)部的所有員工信息
# 查詢 銷售部 和 市場(chǎng)部 的部門ID select id from dept where name = '銷售部' or name = '市場(chǎng)部'; # 根據(jù)部門ID,查詢員工信息 select * from emp where dept_id in (select id from dept where name = '市場(chǎng)部' or name = '銷售部');eg:查詢比 財(cái)務(wù)部 所有人工資都高的員工信息
# 查詢所有 財(cái)務(wù)部 人員工資 select id from dept where name = '財(cái)務(wù)部';select salary from emp where dept_id = (select id from dept where name = '財(cái)務(wù)部'); # b 比 財(cái)務(wù)部 所有人工資都高的員工 select * from emp where salary > all(select salary from emp where dept_id = (select id from dept where name = '財(cái)務(wù)部'));eg :查詢比研發(fā)部其中任意一人員工工資高的員工信息
# 查詢研發(fā)部門所有人工資 select salary from emp where dept_id = (select id from dept where name = '研發(fā)部');# 比研發(fā)部其中任意一人工資都高的員工信息 select * from emp where salary > any(select salary from emp where dept_id = (select id from dept where name = '研發(fā)部'));行子查詢
子查詢返回的結(jié)果是一行(可以是多列),這種子查詢稱為行子查詢。
常用的操作符:= 、 <> 、 in、 not in
eg:查詢與 張無忌 的薪資及直屬領(lǐng)導(dǎo)相同的員工信息
# 行子查詢 # 查詢 張無忌 的薪資及直屬領(lǐng)導(dǎo)相同的員工信息 select salary, managerid from emp where name = '張無忌';# 查詢與 張無忌 的薪資及直屬領(lǐng)導(dǎo)相同的員工信息 select * from emp where (salary, managerid) = (select salary, managerid from emp where name = '張無忌');表子查詢
子查詢返回的結(jié)果是多行多列,這種子查詢稱為表子查詢。
常用的操作符:in
eg:查詢與 鹿杖客、宋遠(yuǎn)橋 的職位和薪資相同的員工信息
# 表子查詢 # 查詢 鹿杖客、宋遠(yuǎn)橋 的職位和薪資 select job, salary from emp where name = '鹿杖客' or name = '宋遠(yuǎn)橋';# 查詢與 鹿杖客、宋遠(yuǎn)橋 的職位和薪資相同的員工信息 select * from emp where (job, salary) in (select job, salary from emp where name = '鹿杖客' or name = '宋遠(yuǎn)橋');eg:查詢?nèi)肼毴掌谑?2006-01-01 之后的員工信息,及其部門信息
# 表子查詢 # 入職日期是 2006-01-01 之后的員工信息 select * from emp where entrydate > '2006-01-01';# 查詢這部分員工,對(duì)應(yīng)的部門信息 select e.*, d.* from (select * from emp where entrydate > '2006-01-01') e left join dept d on e.dept_id = d.id;多表查詢案例
數(shù)據(jù)準(zhǔn)備:
# 多表查詢 create table salgrade(grade int,losal int,hisal int )comment '薪資等級(jí)表';insert into salgrade values (1, 0, 3000),(2, 3001, 5000),(3, 5001, 8000),(4, 8001, 10000),(5, 10001, 15000),(6, 15001, 20000),(7, 20001, 25000),(8, 25001, 30000);案例
eg:查詢員工的姓名、年齡、職位、部門信息(隱式內(nèi)連接)
# 連接條件:emp.dept_id = dept.id select emp.name, age, job, dept.name from emp ,dept where emp.dept_id = dept.id;eg:查詢年齡小于30歲的員工的姓名、年齡、職位、部門信息(顯示內(nèi)連接)
# 連接條件:emp.dept_id = dept.id select e.name, e.age, e.job, d.name from emp e inner join dept d on e.dept_id = d.id where e.age < 30 ;eg:查詢擁有員工的部門ID、部門名稱
# 連接條件:emp.dept_id = dept.id select distinct d.id, d.name from emp e, dept d where e.dept_id = d.id;>
eg:查詢所有年齡大于40歲的員工,及其歸屬的部門名稱;如果員工沒有分配部門,也需要顯示出來
# 連接條件:emp.dept_id = dept.id # 外連接 select e.*, d.name from emp e left join dept d on e.dept_id = d.id where age > 40;eg:查詢所有員工的工資等級(jí)
# 連接條件:emp.salary >= salgrade.losal and emp.salary <= salgrade.hisal select e.*, s.grade from emp e, salgrade s where e.salary >= s.losal and e.salary <= s.hisal;eg:查詢研發(fā)部所有員工的信息工資等級(jí)
-- 查詢 研發(fā)部 所有員工的信息及工資等級(jí) -- emp dept salgrade -- 鏈接條件:emp.dept_id = dept.id, emp.salary > losal and emp.salary < hisal select e.*, d.name, s.grade from emp e,dept d,salgrade s where e.dept_id = d.idand e.salary > s.losaland e.salary < s.hisaland d.name = '研發(fā)部';eg:查詢研發(fā)部員工的平均工資
-- 查詢 研發(fā)部 員工的平均工資 -- 鏈接條件: emp.dept_id = dept.id; select avg(e.salary) from emp e, dept d where e.dept_id = d.id and d.name = '研發(fā)部';eg:查詢工資比滅絕高的員工信息
-- 查詢工資比 滅絕 高的員工信息 -- 查詢 滅絕 的薪資 select salary from emp where name = '滅絕'; -- 查詢比 滅絕 工資高的員工信息 select * from emp where salary > (select salary from emp where name = '滅絕');eg:查詢比平均薪資高的員工
-- 查詢比平均薪資高的員工信息 -- 查詢平均工資 select avg(salary) from emp; -- 查詢比平均薪資高的員工 select *,(select avg(salary) from emp) '平均工資' from emp where salary > (select avg(salary) from emp);eg:查詢低于本部門平均工資的員工信息
-- 查詢低于本部門平均工資的員工信息 -- 查詢指定部門的平均工資 select avg(salary) from emp e1 where e1.dept_id = 1; select avg(salary) from emp e1 where e1.dept_id = 2; -- 查詢低于本部門的平均工資的員工信息 select e2.*, d.name from emp e2,dept d where e2.salary < (select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept_id)and e2.dept_id = d.id;eg:查詢所有的部門信息,并統(tǒng)計(jì)部門的員工人數(shù)
-- 查詢所有的部門信息,并統(tǒng)計(jì)部門的員工人數(shù) -- 鏈接條件:emp.dept_id = dept.id; select *, (select count(*) from emp where emp.dept_id = dept.id) '人數(shù)' from dept;eg:查詢所有學(xué)生的選課情況,展示出學(xué)生名稱,學(xué)號(hào),課程名稱
-- 查詢所有學(xué)生的選課情況,展示出學(xué)生名稱、學(xué)號(hào)、課程名稱 -- 表 student、course、student_course -- 鏈接條件 : student.id = student_course.studentid , course.id = student_course.courseid select s.*, c.name from student s, course c, student_course sc where s.id = sc.studentid and c.id = sc.courseid;總結(jié)
以上是生活随笔為你收集整理的【MySQL】黑马教程MySQL数据库 MySQL基础(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20万奖补|成都两化融合管理贯标项目拟支
- 下一篇: Navicat Premium 导入SQ