mysql基礎(chǔ)篇

MYSQL客戶端連接:

1.使用MYSQL提供的客戶端命令行工具
2.使用cmd執(zhí)行指令 mysql [-h 127.0.0.1] [-p 3306] -u root -p(注意:使用這種方式進行連接時,需要安裝完配置PATH環(huán)境變量)
  []內(nèi)為可選參數(shù),
  -h  MUSQL服務(wù)所在的主機ip
  -p  MUSQL服務(wù)端口號,默認(rèn)3306
  -u MYSQL數(shù)據(jù)庫用戶名
  -p MYSQL數(shù)據(jù)庫用戶對應(yīng)的密碼

SQL語法

1.SQL語句可以單行或多行書寫,以分號結(jié)尾
2.SQL語句可以使用空格和縮進增強語句的可讀性
3.mysql數(shù)據(jù)庫的SQL語句不區(qū)分大小寫,關(guān)鍵字建議用大寫
4.注釋 單行注釋:-- 注釋 或 # 注釋,多行注釋/* 注釋*/

DDL(Data Definition Language)

  數(shù)據(jù)定義語言,用來定義數(shù)據(jù)庫對象(數(shù)據(jù)庫,表,字段)

DDL數(shù)據(jù)庫操作

show databases 查詢所有的數(shù)據(jù)庫
craete database itcast 創(chuàng)建一個名叫itcast的數(shù)據(jù)庫(注意:create database和create schema都可以創(chuàng)建數(shù)據(jù)庫)
create database if not exists itcast 判斷有沒有itcast數(shù)據(jù)庫如果沒有就創(chuàng)建
create database itheima default charset utf8mb4 創(chuàng)建一個默認(rèn)字集為utf8mb4名叫itheima的數(shù)據(jù)庫(utf8字集存儲長度3個字節(jié),不建議使用,所以使用了utf8mb4,它存儲長度是4個字節(jié))
drop database test 刪除test數(shù)據(jù)庫
use test 使用test數(shù)據(jù)庫
select database()查詢當(dāng)前所處的數(shù)據(jù)庫

DDL表操作

  show tables 查詢當(dāng)前數(shù)據(jù)庫的所有表
  desc test 查看test的表結(jié)構(gòu)
  show create table test 查詢test的建表語句
  create table test(表名)(
    id (字段1) int(字段1類型) comment (注釋),
    age (字段2) int(字段2類型) comment (注釋)
  )comment(表注釋)創(chuàng)建一個test表注意:最后一個字段不需要逗號

mysql數(shù)據(jù)類型

MYSQL數(shù)據(jù)類型主要分為三類:數(shù)值類型,字符串類型,日期時間類型
1.數(shù)值類型
類型 大小 負(fù)數(shù)范圍 正數(shù)范圍(加unsigned) 描述
TINYINT 一個字節(jié)(1bytes) (-128,127) (0,255) 小整數(shù)值
SMALLINT 兩個字節(jié)(2bytes) (-32768,32767) (0,65535) 大整數(shù)值
MEDIUMINT 三個字節(jié)(3bytes) (-8388608,8388607) (0,16777215) 大整數(shù)值
INT/INTEGER 四個字節(jié)(4bytes) (-2147483648,2147483647) (0,429497295) 大整數(shù)值
BIGINT 八個字節(jié)(8bytes) (-263,263-1) (0,2^64-1) 極大整數(shù)值
FLOAT 四個字節(jié)(4bytes) (-3.402823466 E+38,3.402823466351 E+38) 0和(1.1754944351 E-38,3.402823466 E+38) 單精度浮點數(shù)值
DOUBLE 八個字節(jié)(8bytes) (-1.796931348623157 E+308,1.79769313348623157 E+308) 0和(2.2250738585072104 E-308,1.7976931348623157 E+308) 雙精度浮點數(shù)值
DECIMAL 依賴于M(精度)和D(標(biāo)度)的值 依賴于M(精度)和D(標(biāo)度)的值 小數(shù)值(精確定點數(shù))
2.字符串類型
類型 大小 描述
CHAR (0-255bytes) 定長字符串(需要指定長度)
VARCHAR (0-65535bytes) 變長字符串(需要指定長度)
TINYBLOB (0-255bytes) 不超過255個字符的二進制數(shù)據(jù)
TINYTEXT (0-255bytes) 短文本字符串
BLOB (0-65535bytes) 二進制的長文本數(shù)據(jù)
TEXT (0-65535bytes) 長文本數(shù)據(jù)
MEDIUMBLOB (0-16777215bytes) 二進制形式的中等長度文本數(shù)據(jù)
MEDIUMTEXT (0-16777215bytes) 中等長度文本數(shù)據(jù)
LONGBLOB (0-4294967295bytes) 二進制形式的極大文本數(shù)據(jù)
LONGTEXT (0-4294967295bytes) 極大文本數(shù)據(jù)
char與varchar都可以描述字符串,char是定長字符串,指定長度多長,就占用多少個字符,和字段值的長度無關(guān)。
而varchar是變長字符串,指定的長度為最大占用長度。相對來說,char的性能會更高些。
3.字符串類型
類型 大小 范圍 格式 描述
DATE 3 1000-01-01至9999-12-31 YYYY-MM-DD 日期值
TIME 3 -838:59:59至838:59:59 HH:MM:SS 時間值或持續(xù)時間
YEAR 1 1901至2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00至9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 4 1970-01-01 00:00:01至2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 混合日期和時間值,時間戳

DDL表操作-修改

ALTER TABLE 表名 ADD 字段名 類型(長度)【comment 注釋】【約束】表(添加字段)
例:ALTER TABLE test nickname varchar(20) COMMENT ‘昵稱’;(向test表里添加nickname字段)
ALTER TABLE 表名MODIFY 字段名 新數(shù)據(jù)類型(長度)修改數(shù)據(jù)類型
ALTER TABLE   表名 CHANGE 舊字段名 新字段名 類型(長度)【comment 注釋】【約束】修改字段名和字段類型
例:ALTER TABLE test CHANGE nickname name char(20)將test里的nickname字段修改為name字段,類型改為char,長度為20
ALTER TABLE 表名 DROP 字段名 (刪除字段)
例:ALTER TABLE test DROP nickname 刪除test表里的nickname字段
ALTER TABLE 表名 RENAME TO 新表名(修改表名)
例:ALTER TABLE test RENAME TO test1 (將test表名修改為test1)
DROP TABLE [【IF EXISTS】表名(表存在時刪除表,不存在則不執(zhí)行)
 TRUNCATE TABLE 表名(刪除指定表并重新創(chuàng)建表)

DML(Data Manipulation Language)

數(shù)據(jù)操作語言,用來對數(shù)據(jù)庫中表的數(shù)據(jù)記錄進行增、刪、改操作
1.給指定字段添加數(shù)據(jù)
INSERT INTO 表名 (字段名1,字段名2)VALUES (值1,值2)給指定字段添加數(shù)據(jù)
INSERT INTO  表名 VALUES(值1,值2)給全部字段添加數(shù)據(jù)
INSERT INTO 表名 (字段名1,字段名2) VALUES(值1,值2),(值1,值2),(值1,值2)批量給指定字段添加數(shù)據(jù)
INSERT INTO 表名 VALUES(值1,值2),(值1,值2),(值1,值2)批量給全部字段添加數(shù)據(jù)  

  注意:
      1.插入數(shù)據(jù)時,指定的字段順序需要跟值的順序是一一對應(yīng)的
      2.字符串和日期類型要用引號包裹住
      3.插入的數(shù)據(jù)大小,不能超過字段的規(guī)定范圍
2.修改數(shù)據(jù)
UPDATE 表名 set 字段名1=值1,字段名2=值2,字段名3=值3【W(wǎng)HERE 條件】

注意:修改語句的條件不是必須,如果沒有條件會修改整張表的所有數(shù)據(jù)
3.刪除數(shù)據(jù)
DELETE FROM 表名【W(wǎng)HERE 條件】

注意:
    1.DELETE語句的條件不是必須的,如果沒有條件會刪除整張表的所有數(shù)據(jù)
    2.DELETE語句不能刪除某一個字段的值(想要刪除某一個字段的值可以使用UPDATE將該字段置為NULL)
    3.當(dāng)進行全部數(shù)據(jù)刪除操作時,datagrip會提示我們,是否確認(rèn)刪除

DQL(Data Query Language)

數(shù)據(jù)查詢語言用來查詢數(shù)據(jù)庫中的記錄

DQL查詢語句

SELECT 字段列表
FROM 表名列表
WHERE 條件列表
GROUP BY 分組字段列表
HAVING 分組后條件列表
ORDER 排序字段列表
LIMIT 分頁參數(shù)
查詢多個字段
SELECT 字段1,字段2,字段3, FROM 表名
SELECT * FROM 表名
字段設(shè)置別名
SELECT 字段1【AS 別名1】,字段2【AS 別名2】FROM 表名(as可以省略)
例:SELECT workaddress AS ‘工作地址’ FROM test(查詢所有員工的工作地址,起別名)
去除重復(fù)記錄
SELECT DISTINCT 字段列表 FROM 表名
例:SELECT DISTINCT workaddress ‘工作地址’ FROM test(查詢公司員工的工作地址有哪些不要重復(fù))
條件查詢
SELECT 字段列表 FROM 表名 WHERE 條件列表

條件 :
> 大于,
>= 大于等于,
< 小于,
<= 小于等于,
= 等于,
<>或!= 不等于,
BETWEEN ... ADD... 在某個范圍之內(nèi)含最大值、最小值,
IN(..,)在in之后的列表的值,多選一,
LIKE占位符 模糊匹配(——匹配單個字符,%匹配任意個字符)
IS NULL  是null
ADD或&& 并且
OR或|| 或者
NOT或!不是、非

例:

  SELECT * FROM test WHERE age=88 查詢test表里年齡等于88的員工
  SELECT * FROM test WHERE idcard IS NULL 查詢test表里沒有身份證號的員工信息
  SELECT * FROM test WHERE idcard ID NOT NULL 查詢test表里有身份證號的員工信息
  SELECT * FROM test WHERE age BETWEEN 15 AND 20 
  SELECT *FROM test WHERE age>=15 AND age<=20 查詢test表里年齡15(包含)到20(包含)之間的員工信息
  SELECT * FROM test WHERE name LIKE ‘__’  查詢test表里姓名為兩個字的員工信息
  SELECT * FROM test WHERE idcard LIKE '%X' 
  SELECT * FROM test WHERE idcard LIKE '_________________X'查詢test表里身份證號最后一位是x的員工信息
聚合函數(shù)
將一列數(shù)據(jù)作為一個整體,進行縱向計算
常見的聚合函數(shù)
  count 統(tǒng)計數(shù)量
  max 最大值
  min 最小值
  avg 平均值
  sum 求和
  使用:SELECT 聚合函數(shù)(字段列表)FROM 表名
  注意:null值不參與所有聚合函數(shù)運算

例:

SELECT COUNT (idcard)FROM test 統(tǒng)計test表里idcard不為null的記錄數(shù)
SELECT max(age)FROM test 統(tǒng)計test里age最大的
SELECT avg(age)FROM test 統(tǒng)計test里的平均age值
SELECT min(age)FROM test 統(tǒng)計test里age最小的
SELECT sun(age)FROM test 統(tǒng)計test里age的和
分組查詢
SELECT 字段列表 FROM 表名 【W(wǎng)HERE 條件】GROUP BY 分組字段名 【HAVING 分組后過濾條件】
WHERE與HAVING區(qū)別
  1.執(zhí)行時機不同:WHERE 是分組之前進行過濾,不滿足WHERE條件,不參與分組,而HAVING是分組之后對結(jié)構(gòu)進行過濾
  2.判斷條件不同:WHERE不能對聚合函數(shù)進行判斷,而HAVING可以
注意事項:
  1.分組之后,查詢的字段一般為聚合函數(shù)和分組字段,查詢其他字段無任何意義
  2.執(zhí)行順序:WHERE > 聚合函數(shù)  > HAVING
  3.支持多字段分組,具體語法為:GROUP BY columnA,columnB

例:

SELECT gender,COUNT(*)FROM test GROUP BY gender 根據(jù)gender分組,統(tǒng)計gender的數(shù)量
SELECT workaddress,COUNT(*)addresss_count FROM test WHERE age<45 GROUP BY workaddress HAVING address_count >=3 查詢age小于45的數(shù)據(jù),并且根據(jù)workaddress分組,獲取address_count大于等于3的workaddress
排序查詢
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2
排序方式:
  1.ASC升序(默認(rèn)值)
  2.DESC降序
注意事項:
  1.升序可以不指定ASC
  2.多字段排序,當(dāng)?shù)谝粋€字段值相同時,才會根據(jù)第二個字段進行排序

例:

SELECT * FROM test ORDER BY age ASC 根據(jù)age 對test里的數(shù)據(jù)進行升序排序查詢
SELECT * FROM test ORDER BY age DESC 根據(jù)age 對test里的數(shù)據(jù)進行降序排序查詢
分頁查詢
SELECT * FROM test LIMIT 起始索引,查詢記錄數(shù)
注意事項:
  1.起始索引從0開始,起始索引=(查詢頁碼-1)*每頁顯示記錄數(shù)
  2.分頁查詢不同數(shù)據(jù)庫的實現(xiàn)不同,MYSQL中是LIMIT
  3.如果查詢的是第一頁數(shù)據(jù),起始索引可以省略,直接簡寫為 LIMIT 10

例:

SELECT * FROM test LIMIT 0 10 查詢test里第一頁數(shù)據(jù),每一頁顯示10條
執(zhí)行順序

FROM --》 WHERE --》GROUP BY --》HAVING --》SELECT --》ORDER BY --》LIMIT

DCL(Data Control Language)

數(shù)據(jù)控制語言,用來管理數(shù)據(jù)庫用戶,控制數(shù)據(jù)庫的訪問權(quán)限

管理用戶

SELECT * FROM mysql.user 查詢用戶
1657960330132.png

其中HOST代表的是當(dāng)前用戶訪問的主機,如果為localhost,僅代表只能夠在當(dāng)前本機訪問,是不可以遠(yuǎn)程訪問的。USER代表的是訪問該數(shù)據(jù)庫的用戶名,在MYSQL中需要通過HOST和USER來唯一標(biāo)識一個用戶

CREATE USER '用戶名'@‘主機名’ IDENTIFIED BY '密碼' 創(chuàng)建用戶
ALTER USER  '用戶名'@‘主機名’ IDENTFIED WITN mysql_native_password BY ‘新密碼’ 修改用戶密碼
DROP USER '用戶名'@‘主機名’ 刪除用戶
注意事項:
  1.在MYSQL中需要通用戶名@主機名的方式,來唯一標(biāo)識一個用戶
  2.主機名可以使用%通配
例:

CREATE user ‘itcast’@‘localhost’ identified by ‘123456’ 創(chuàng)建用戶itcast,只能夠在當(dāng)前主機localhost訪問,密碼123456
CREATE user ‘heima’@‘%’ identified by ‘123456’ 創(chuàng)建用戶heima,可以在任意主機訪問該數(shù)據(jù)庫,密碼123456

權(quán)限控制

MYSQL常用的權(quán)限:
  ALL,ALL PRIVILEGES 所有權(quán)限
  SELECT 查詢數(shù)據(jù)
  INSERT 插入數(shù)據(jù)
  UPDATE 修改數(shù)據(jù)
  DELETE 刪除數(shù)據(jù)
  ALTER 修改表
  DROP 刪除數(shù)據(jù)庫、表、視圖
  CREATE 創(chuàng)建數(shù)據(jù)庫、表

查詢權(quán)限:SHOW GRANTS FOR  '用戶名'@‘主機名’
授予權(quán)限: GRANT 權(quán)限列表 ON 數(shù)據(jù)庫名.表名 TO '用戶名'@‘主機名’
撤銷權(quán)限:REVOKE 權(quán)限列表 ON 數(shù)據(jù)庫名.表名 FROM '用戶名'@‘主機名
注意事項:多個權(quán)限之間使用逗號分割
授權(quán)時數(shù)據(jù)庫名和表名可以使用*進行通配。代表所有

函數(shù)

分為以下四類函數(shù):字符串函數(shù),數(shù)值函數(shù),日期函數(shù),流程函數(shù)

字符串函數(shù)

CONCAT(s1,s2,s3)字符串拼接
例:SELECT CONCAT  (‘hello’,‘MYSQL’)
LOWER(str)將字符串str全部轉(zhuǎn)為小寫
例:SELECT LOWER(‘hello’)
UPPER(str)將字符串str全部轉(zhuǎn)為大寫
例:SELECT UPPER(HELLO)
LPAD(str,n,pad)左填充,用字符串pad對str的左邊進行填充,達(dá)到n個字符串長度
例:SELECT LPAD(‘01’,5,‘-’)
RPAD(str,n,pad)右填充,永字符串pad對str的右邊進行填充,達(dá)到n個字符串長度
例:SELECT RPAD(‘01’,5,‘-’)
TRIM(str)去掉字符串頭部跟尾部的空格
例:SELECT TRIM(‘  HELLO MYSQL  ’)
SUBSTRING(str,start,len)返回字符串str從start位置起的len個長度的字符串
例:SELECT SUBSTRING(‘HELLOMYSQL’,1,5)

業(yè)務(wù)案例:

員工的工號統(tǒng)一為五位數(shù),不足五位的在前面補0
UPDATE test SET workno=LPAD(workno,5,‘0’)

數(shù)值函數(shù)

CEIL  (x)向上取整
FLOOR(x)向下取整
MOD(x,y)返回x/y的隨機數(shù)
RAND()返回0~1之間的隨機數(shù)
ROUND(x,y)求參數(shù)x的四舍五入的值,保留y位小數(shù)
例:SELECT  LPAD(ROUND(RAND()*1000000,0),6,'0)

日期函數(shù)

CURDATE()返回當(dāng)前日期
CURTIME()返回當(dāng)前時間
NOW()返回當(dāng)前日期和時間
YEAR(date)獲取指定date的年份
MONTH(date)獲取指定date的月份
DAY(date)獲取指定date的日期
DATE_ADD(date,INTEVAL EXPRTYPE )返回一個日期/時間值加上一個時間間隔expr后的時間值
DATEDIFF(date1,date2)返回起始時間和結(jié)束時間date2之間的天數(shù)

案例:查詢所有員工的入職天數(shù),并根據(jù)入職天數(shù)倒序排序(entrydate入職日期,name員工)
SELECT name,DATEDIFF(CURDATE()-entrydate)as ‘entrydays’ FROM test ORDER BY entrydays DESC

流程函數(shù)

IF(value,t,f)如果value為true則返回t,否則返回f
IFNULL(value1,value2)如果value1不為空,返回value1,否則返回value2
CASE WHEN【vall】THEN【res1】ELSE【default】END 如果vall為true,返回res1,否則則返回default值
CASE 【expr】WHEN【vall】THEN【res1】ELSE【default】END 如果expr的值等于vall  ,返回res1,否則返回default值

約束

約束作用域表中字段上的規(guī)則,用來限制存儲在表里的數(shù)據(jù)(目的:保證數(shù)據(jù)庫中數(shù)據(jù)的正確,有效性和完整性)

  NOT NULL  限制該字段的數(shù)據(jù)不能為null
  UNIQUE 保證該字段的所有數(shù)據(jù)都是唯一、不重復(fù)的
  PRIMARY KEY 主鍵是一行數(shù)據(jù)的唯一標(biāo)識,要求非空且唯一
  DEFAULT 保存數(shù)據(jù)時未指定該字段的值,則采用默認(rèn)值
  CHECK 保證字段值滿足某一個條件
  FOREING KEY 用來讓兩張表的數(shù)據(jù)之間建立連接,保證數(shù)據(jù)的一致性和完整性

  #添加外鍵
  CREATE TABLE 表名(
    字段名 數(shù)據(jù)類型
  【CONSTRAINT】【外鍵名稱】FOREING KEY (外鍵字段名) REFERENCES   主表 (主表別名))    
  ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREING KEY (外鍵字段名)REFERENCES 主表(主表列名)
例:ALTER TABLE test ADD CONSTRAINT fk_test_dept_id FOREIGN KEY (dept_id) REFERENCES dept (id) 為test表里的dept的字段添加外鍵約束,關(guān)聯(lián)dept表的主鍵id
(添加了外鍵約束之后,到dept表里刪除或更新記錄,會報錯:不能刪除或更新父表記錄,因為存在外鍵約束)
  #刪除外鍵
  ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱

刪除/更新行為

添加了外鍵之后,再刪除父表數(shù)據(jù)時產(chǎn)生的約束行為,我們就稱為刪除/更新行為,具體的有以下幾種

NO ACTION 當(dāng)父表中刪除/更新對應(yīng)記錄時,首先檢查是否有對應(yīng)外鍵,如果有則不允許刪除/更新(與RESTRICT一致)默認(rèn)行為
RESTRICT 當(dāng)父表中刪除/更新對應(yīng)記錄時,首先檢查是否有對應(yīng)外鍵,如果有則不允許刪除/更新(與NO ACTION一致)默認(rèn)行為
CASCADE 當(dāng)父表中刪除/更新對應(yīng)記錄時,首先檢查是否有對應(yīng)外鍵,如果有則也刪除/更新外鍵在子表里的記錄
SET NULL 當(dāng)父表中刪除對應(yīng)記錄時,首先檢查該記錄是否有對應(yīng)外鍵,如果有則設(shè)置子表中外鍵值為null(要求該外鍵允許取null)
SEL DETAULT 父表有變更時,子表將外鍵設(shè)置成一個默認(rèn)的值(innodb不支持)

ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段)REFERENCES 主表名(主表字段名)ON UPDATE CASCADE ON DELETE CASEADE

多表查詢

例:學(xué)生與課程的關(guān)系,一個學(xué)生可以選擇多門課程,一門課程也可被多個學(xué)生選擇
實現(xiàn),建立第三張中間表,中間表包含兩個外鍵,分別關(guān)聯(lián)兩個主鍵
笛卡爾積: 笛卡爾乘積是指在數(shù)學(xué)中,兩個集合A集合 和 B集合的所有組合情況。
在SQL語句中,如何來去除無效的笛卡爾積呢? 我們可以給多表查詢加上連接查詢的條件即可。
select * from emp , dept where emp.dept_id = dept.id;

連接查詢分類

內(nèi)連接:相當(dāng)于查詢A、B交集部分?jǐn)?shù)據(jù)
外連接:
左外連接:查詢左表所有數(shù)據(jù),以及兩張表交集部分?jǐn)?shù)據(jù)
右外連接:查詢右表所有數(shù)據(jù),以及兩張表交集部分?jǐn)?shù)據(jù)
自連接:當(dāng)前表與自身的連接查詢,自連接必須使用表別名
內(nèi)連接查詢的是兩張表交集部分的數(shù)
據(jù)。(也就是綠色部分的數(shù)據(jù))
內(nèi)連接的語法分為兩種: 隱式內(nèi)連接、顯式內(nèi)連接。

隱式內(nèi)連接: SELECT 字段列表 FROM 表1,表2 WHERE 條件
顯式內(nèi)連接:SELECT 字段列表 表1【INNER】JOIN 表2 ON 連接條件

外連接:外連接分為兩種,分別是左外連接和右外連接

左外連接:SELECT 字段列表 FROM 表1 LEFT 【OUTER】JOIN 表2 ON 條件
左外連接相當(dāng)于查詢表1(左表)的所有數(shù)據(jù),當(dāng)然也包含表1和表2交集部分的數(shù)據(jù)。
右外連接:SELECT 字段列表 FROM 表1 RIGHT 【OUTER】JOIN 表2 ON 條件
右外連接相當(dāng)于查詢表2(右表)的所有數(shù)據(jù),當(dāng)然也包含表1和表2交集部分的數(shù)據(jù)

自連接(注意事項:
在自連接查詢中,必須要為表起別名,要不然我們不清楚所指定的條件、返回的字段,到底
是哪一張表的字段。)

SELECT 字段列表 FROM 表a 別名a JOIN 表a 別名b ON 條件
例:SELECT a.name ‘員工’,b.name‘領(lǐng)導(dǎo)’ FROM emp a left JOIN emp b ON a.managerId = b.id(查詢所有員工emp及其領(lǐng)導(dǎo)的名字emp ,如果元沒有領(lǐng)導(dǎo)也要查詢出來,表結(jié)構(gòu):emp a,emp b)

聯(lián)合查詢

對于union查詢,就是把多次查詢的結(jié)果合并起來,形成一個新的查詢結(jié)果集
聯(lián)合查詢的多張表的列數(shù)必須保持一致,字段類型也需要保持一致,union all 會將全部的數(shù)據(jù)直接合并在一起,union 會對合并之后的數(shù)據(jù)去重。

SELECT 字段列表 FROM 表1 UNION 【all】SELECT 字段列表 FROM 表2
例:SELECT * FROM emp  WHERE salary<5000 UNION all SELECT * FROM emp WHERE age > 50
A. 將薪資低于 5000 的員工 , 和 年齡大于 50 歲的員工全部查詢出來.
當(dāng)前對于這個需求,我們可以直接使用多條件查詢,使用邏輯運算符 or 連接即可。 那這里呢,我們
也可以通過union/union all來聯(lián)合查詢
注意:
 union all查詢出來的結(jié)果,僅僅進行簡單的合并,并未去重。union 聯(lián)合查詢,會對查詢出來的結(jié)果進行去重處理。
  如果多條查詢語句查詢出來的結(jié)果,字段數(shù)量不一致,在進行union/union all聯(lián)合查詢時,將會報錯。

子查詢

概念:SQL語句中嵌套SELECT語句,稱為嵌套查詢又稱子查詢
子查詢外部的語句可以是INSERT / UPDATE / DELETE / SELECT 的任何一個。

SELECT * FROM t1 WHERE column1 =(SELECT column1 FROM t2)

分類:
 1.根據(jù)子查詢結(jié)果不同分為:
  標(biāo)量子查詢(子查詢結(jié)果為單個值)
  列子查詢(子查詢結(jié)果為一列)
  行子查詢(子查詢?yōu)橐恍校?br>   表子查詢(子查詢?yōu)槎嘈卸嗔校?br> ?。?根據(jù)子查詢的位置分為:
  WHERE之后
  FROM之后
  SELECT之后

#標(biāo)量子查詢案例:查詢銷售部的所有員工信息
SELECT * FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name=‘銷售部’)

列子查詢的常用操作符:

IN 在指定的集合范圍之內(nèi),多選一
NOT IN 不在指定的集合范圍之內(nèi)
ANT 子查詢返回列表中,有一個滿足即可
SOME 與ANE等同,使用SOME的地方都可以使用ANY
ALL 子查詢返回列表的所有值都必須滿足

列子查詢案例:

#1.查詢銷售部和市場部的所有員工信息
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE name=‘銷售部’ OR name=‘市場部’)
#2.查詢比財務(wù)部所有人工資的高的員工信息
SELECT * FROM emp WHERE salary > all(SELECT salary FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name=‘財務(wù)部’))
#3.查詢比研發(fā)部其中任意一人工資高的員工信息
SELECT * FROM emp WHERE salary > any(SELECT salary FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name=‘研發(fā)部’))

行子查詢案例:

#1.查詢與 "張無忌" 的薪資及直屬領(lǐng)導(dǎo)相同的員工信息
SELECT * FROM emp WHERE (salary,managerId)=(SELECT salary,managerId FROM emp WHERE name=‘張無忌’)

表子查詢案例:

#1.查詢與 "鹿杖客" , "宋遠(yuǎn)橋" 的職位和薪資相同的員工信息
SELECT * FROM emp WHERE(job,salary)IN (SELECT job,salary FROM emp WHERE name=‘鹿杖客’ OR name=‘宋遠(yuǎn)橋’)
#2.查詢?nèi)肼毴掌谑?"2006-01-01" 之后的員工信息 , 及其部門信息
SELECT e.*, d.* FROM (SELECT * FROM emp WHERE entrydate > '2006-01-01') e left JOIN dept d ON e.dept_id = d.id

事務(wù)

事務(wù) 是一組操作的集合,它是一個不可分割的工作單位,事務(wù)會把所有的操作作為一個整體一起向系
統(tǒng)提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。

控制事務(wù)一

查看/設(shè)置事務(wù)提交方式 SELECT @@autocommit;/SET @@autocommit=0
提交事務(wù)  COMMIT;回退事務(wù) ROLLBACK;
注意:上述的這種方式,我們是修改了事務(wù)的自動提交行為, 把默認(rèn)的自動提交修改為了手動提交,
     此時我們執(zhí)行的DML語句都不會提交, 需要手動的執(zhí)行commit進行提交。

控制事務(wù)二

START TRANSACTION 或 BEGIN 開啟事務(wù)
COMMIT 提交事務(wù)
ROLLBACK 回退事務(wù)

轉(zhuǎn)賬案例:

-- 開啟事務(wù) 
start transaction 
-- 1. 查詢張三余額 
select * from account where name = '張三';
-- 2. 張三的余額減少1000 
update account set money = money - 1000 where name = '張三'; 
-- 3. 李四的余額增加1000 
update account set money = money + 1000 where name = '李四'; 
-- 如果正常執(zhí)行完畢, 則提交事務(wù) 
commit; 
-- 如果執(zhí)行過程中報錯, 則回滾事務(wù)
-- rollback;
事務(wù)四大特性
原子性(Atomicity):事務(wù)是不可分割的最小操作單元,要么全部成功,要么全部失敗。
一致性(Consistency):事務(wù)完成時,必須使所有的數(shù)據(jù)都保持一致狀態(tài)。
隔離性(Isolation):數(shù)據(jù)庫系統(tǒng)提供的隔離機制,保證事務(wù)在不受外部并發(fā)操作影響的獨立環(huán)境下運行。
持久性(Durability):事務(wù)一旦提交或回滾,它對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久的。
上述就是事務(wù)的四大特性,簡稱ACID。
并發(fā)事務(wù)問題

1). 贓讀:一個事務(wù)讀到另外一個事務(wù)還沒有提交的數(shù)據(jù)。
2). 不可重復(fù)讀:一個事務(wù)先后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,稱之為不可重復(fù)讀。
3). 幻讀:一個事務(wù)按照條件查詢數(shù)據(jù)時,沒有對應(yīng)的數(shù)據(jù)行,但是在插入數(shù)據(jù)時,又發(fā)現(xiàn)這行數(shù)據(jù)
已經(jīng)存在,好像出現(xiàn)了 "幻影"

事務(wù)隔離級別

為了解決并發(fā)事務(wù)所引發(fā)的問題,在數(shù)據(jù)庫中引入了事務(wù)隔離級別。主要有以下幾種:

隔離級別 臟讀 不可重復(fù)讀 幻讀
Read uncommitted
Read committed ×
Repeatable Read(默認(rèn)) × ×
Serializable × × ×

查看事務(wù)隔離級別 SELECT @@TRANSACTION_ISOLATION
設(shè)置事務(wù)隔離級別 SET 【SESSION | GLOBAL】TRANSACTION ISOLATION {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
注意:事務(wù)隔離級別越高,數(shù)據(jù)越安全,但是性能越低。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容