日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

【MySQL】黑马教程MySQL数据库 MySQL基础(二)

發(fā)布時(shí)間:2023/12/20 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【MySQL】黑马教程MySQL数据库 MySQL基础(二) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 【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è)如下:

函數(shù)功能
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)度的字符串
# concat select concat('Hello', ' MySql');# lower select lower('Hello'); # upper select upper('Hello');# lpad select lpad('01', 5, '-'); # rpad select rpad('01', 5, '-');# trim select trim(' Hello MySql ');# substring select substring('Hello MySql', 1, 5);

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ù)如下:

函數(shù)功能
ceil(x)向上取整
floor(x)向下取整
mod(x)返回x/y的模
rand()返回0~1內(nèi)的隨機(jī)數(shù)
round(x, y)求參數(shù)x的四舍五入的值,保留y位小數(shù)
# ceil select ceil(1.1);# floor select floor(1.9);# mod select mod(2,4); select mod(6,4);# rand select rand();# round select round(2.345, 2); select round(2.344, 2);

eg:# 通過數(shù)據(jù)庫(kù)的數(shù)據(jù),生成一個(gè)六位數(shù)的隨機(jī)驗(yàn)證碼

select lpad(round(rand() * 1000000,0), 6, '0');

日期函數(shù)

常見的日期函數(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ù)
# curdate select curdate();# curtime select curtime();# now select now();# year(date) select year(curtime());# month(date) select month(curtime());# day(date) select day(curtime());# data_add(date, interval expr type) select date_add(curtime(), interval 70 year); select date_add(curtime(), interval 70 month); select date_add(curtime(), interval 70 day);# datediff(date1, date2) select datediff('2020-12-01','2020-11-01');

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ǔ)句的效率。

函數(shù)功能
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)值
# if select if(true, 'ok', 'error'); select if(false, 'ok', 'error');# ifnull select ifnull('ok', 'default'); select ifnull('', 'default'); select ifnull(null, 'default');# case when then else end # 查詢emp表的員工姓名和工作地址(北京/上海--->一線城市,其他 ----> 二線城市) selectname,(case workadderss when '北京' then '一線城市' when '上海' then '一線城市' else '二線城市' end) as '工作地址' from emp;

eg:統(tǒng)計(jì)班級(jí)各個(gè)學(xué)員的成績(jī),展示的規(guī)則如下

  • >= 85 展示優(yōu)秀
  • >=60 展示及格
  • 否則,展示不及格
selectname,(case when math >= 85 then '優(yōu)秀' when math >= 60 then '及格' else '不及格' end) as '數(shù)學(xué)',(case when english >= 85 then '優(yōu)秀' when english >= 60 then '及格' else '不及格' end) as'英語(yǔ)',(case when chinese >= 85 then '優(yōu)秀' when chinese >= 60 then '及格' else '不及格' end) as '語(yǔ)文' from score;

總結(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ù)的正確、有效性和完整性。

  • 分類:

    約束描述關(guān)鍵字
    非空約束限制該字段的數(shù)據(jù)不能為nullnot 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)建

    字段名字段含義字段類型約束條件約束關(guān)鍵字
    idID唯一標(biāo)識(shí)int主鍵,并且自動(dòng)增長(zhǎng)primary key,auto_increment
    name姓名varchar(10)不為空,并且唯一not null, unique
    age年齡int大于0,并且小于等于120check
    status狀態(tài)char(1)如果沒有指定該值,默認(rèn)為1default
    gender性別char(1)
    create table user(id int primary key auto_increment comment '主鍵',name varchar(10) not null unique comment '姓名',age int check ( age > 0 and age <= 120 ) comment '年齡',status char(1) default '1' comment '狀態(tài)',gender char(1) comment '性別' )comment '用戶表';insert into user(name, age, status, gender) values ('Tom', 19, '1', '男'), ('Jack', 25, '0', '男'); insert into user(name, age, status, gender) values ('Anson',19, '1', '男'); select * from user;-- insert into user(name, age, status, gender) values (null, 19, '1', '男'); # name不為空 -- insert into user(name, age, status, gender) values ('Anson',19, '1', '男'); # 已經(jīng)存在insert into user(name, age, status, gender) values ('Tom4', 80, '1', '男'); -- insert into user(name, age, status, gender) values ('Tom5', -1, '1', '男'); # check檢查 insert into user(name, age, status, gender) values ('Tom4', 121, '1', '男'); #check檢查insert into user(name, age, gender) values ('Tom5', 80, '男'); # default語(yǔ)句

    外鍵約束

    外鍵用來讓兩張表的數(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不支持)
    alter table 表名 add constraint 外鍵名稱 foreign key (外鍵字段) references 主表名(主表字段名) on update cascade on delete cascade;

    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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。