天天看點

mysql 子查詢多個字段_MySql基礎

mysql 子查詢多個字段_MySql基礎

本文章目标

​ 一、為什麼要學習資料庫

​ 二、資料庫的相關概念

​ DBMS、DB、SQL

​ 三、資料庫存儲資料的特點

​ 四、初始MySQL

​ MySQL産品的介紹

​ MySQL産品的安裝 ★

​ MySQL服務的啟動和停止 ★

​ MySQL服務的登入和退出 ★

​ MySQL的常見指令和文法規範

​ 五、DQL語言的學習 ★

​ 基礎查詢 ★

​ 條件查詢 ★

​ 排序查詢 ★

​ 常見函數 ★

​ 分組函數 ★

​ 分組查詢 ★

​ 連接配接查詢 ★

​ 子查詢 √

​ 分頁查詢 ★

​ union聯合查詢 √

六、DML語言的學習 ★

插入語句

修改語句

删除語句

七、DDL語言的學習

庫和表的管理 √

常見資料類型介紹 √

常見限制 √

八、TCL語言的學習

事務和事務處理

九、視圖的講解 √

十、變量

十一、存儲過程和函數

十二、流程控制結構

資料庫的好處

​ 1.持久化資料到本地

​ 2.可以實作結構化查詢,友善管理

資料庫相關概念

​ 1、DB:資料庫,儲存一組有組織的資料的容器

​ 2、DBMS:資料庫管理系統,又稱為資料庫軟體(産品),用于管理DB中的資料

​ 3、SQL:結構化查詢語言,用于和DBMS通信的語言

資料庫存儲資料的特點

​ 1、将資料放到表中,表再放到庫中

​ 2、一個資料庫中可以有多個表,每個表都有一個的名字,用來辨別自己。表名具有唯一性。

​ 3、表具有一些特性,這些特性定義了資料在表中如何存儲,類似java中 “類”的設計。

​ 4、表由列組成,我們也稱為字段。所有表都是由一個或多個列組成的,每一列類似java 中的”屬性”

​ 5、表中的資料是按行存儲的,每一行類似于java中的“對象”。

MySQL産品的介紹和安裝

MySQL服務的啟動和停止

​ 方式一:計算機——右擊管理——服務

​ 方式二:通過管理者身份運作

​ net start 服務名(啟動服務)

​ net stop 服務名(停止服務)

MySQL服務的登入和退出

​ 方式一:通過mysql自帶的用戶端

​ 隻限于root使用者

方式二:通過windows自帶的用戶端
登入:
mysql 【-h主機名 -P端口号 】-u使用者名 -p密碼

退出:
exit或ctrl+C
           

MySQL的常見指令

1.檢視目前所有的資料庫
show databases;
2.打開指定的庫
use 庫名
3.檢視目前庫的所有表
show tables;
4.檢視其它庫的所有表
show tables from 庫名;
5.建立表
create table 表名(

    列名 列類型,
    列名 列類型,
    。。。
);
6.檢視表結構
desc 表名;


7.檢視伺服器的版本
方式一:登入到mysql服務端
select version();
方式二:沒有登入到mysql服務端
mysql --version
或
mysql --V
           

MySQL的文法規範

​ 1.不區分大小寫,但建議關鍵字大寫,表名、列名小寫

​ 2.每條指令最好用分号結尾

​ 3.每條指令根據需要,可以進行縮進 或換行

​ 4.注釋

​ 單行注釋:#注釋文字

​ 單行注釋:– 注釋文字

​ 多行注釋:

SQL的語言分類

​ DQL(Data Query Language):資料查詢語言

​ select

​ DML(Data Manipulate Language):資料操作語言

​ insert 、update、delete

​ DDL(Data Define Languge):資料定義語言

​ create、drop、alter

​ TCL(Transaction Control Language):事務控制語言

​ commit、rollback

SQL的常見指令

show databases; 檢視所有的資料庫
use 庫名; 打開指定 的庫
show tables ; 顯示庫中的所有表
show tables from 庫名;顯示指定庫中的所有表
create table 表名(
    字段名 字段類型,    
    字段名 字段類型
); 建立表

desc 表名; 檢視指定表的結構
select * from 表名;顯示表中的所有資料
           

DQL語言的學習

進階1:基礎查詢

​ 文法:

​ SELECT 要查詢的東西

​ 【FROM 表名】;

類似于Java中 :System.out.println(要列印的東西);
特點:
①通過select查詢完的結果 ,是一個虛拟的表格,不是真實存在
② 要查詢的東西 可以是常量值、可以是表達式、可以是字段、可以是函數
           

進階2:條件查詢

​ 條件查詢:根據條件過濾原始表的資料,查詢到想要的資料

​ 文法:

​ select

​ 要查詢的字段|表達式|常量值|函數

​ from

​ 表

​ where

​ 條件 ;

分類:
一、條件表達式
    示例:salary>10000
    條件運算符:
    > < >= <= = != <>

二、邏輯表達式
示例:salary>10000 && salary<20000

邏輯運算符:

    and(&&):兩個條件如果同時成立,結果為true,否則為false
    or(||):兩個條件隻要有一個成立,結果為true,否則為false
    not(!):如果條件成立,則not後為false,否則為true

三、模糊查詢
示例:last_name like 'a%'
           

進階3:排序查詢

文法:
select
    要查詢的東西
from
    表
where 
    條件

order by 排序的字段|表達式|函數|别名 【asc|desc】
           

進階4:常見函數

一、單行函數

1、字元函數
    concat拼接
    substr截取子串
    upper轉換成大寫
    lower轉換成小寫
    trim去前後指定的空格和字元
    ltrim去左邊空格
    rtrim去右邊空格
    replace替換
    lpad左填充
    rpad右填充
    instr傳回子串第一次出現的索引
    length 擷取位元組個數

2、數學函數
    round 四舍五入
    rand 随機數
    floor向下取整
    ceil向上取整
    mod取餘
    truncate截斷
3、日期函數
    now目前系統日期+時間
    curdate目前系統日期
    curtime目前系統時間
    str_to_date 将字元轉換成日期
    date_format将日期轉換成字元
4、流程控制函數
    if 處理雙分支
    case語句 處理多分支
        情況1:處理等值判斷
        情況2:處理條件判斷

5、其他函數
    version版本
    database目前庫
    user目前連接配接使用者
           

二、分組函數

sum 求和
    max 最大值
    min 最小值
    avg 平均值
    count 計數

    特點:
    1、以上五個分組函數都忽略null值,除了count(*)
    2、sum和avg一般用于處理數值型
        max、min、count可以處理任何資料類型
    3、都可以搭配distinct使用,用于統計去重後的結果
    4、count的參數可以支援:
        字段、*、常量值,一般放1

       建議使用 count(*)
           

進階5:分組查詢

​ 文法:

​ select 查詢的字段,分組函數

​ from 表

​ group by 分組的字段

特點:
1、可以按單個字段分組
2、和分組函數一同查詢的字段最好是分組後的字段
3、分組篩選
        針對的表    位置            關鍵字
分組前篩選:    原始表        group by的前面        where
分組後篩選:    分組後的結果集    group by的後面        having

4、可以按多個字段分組,字段之間用逗号隔開
5、可以支援排序
6、having後可以支援别名
           

進階6:多表連接配接查詢

笛卡爾乘積:如果連接配接條件省略或無效則會出現
解決辦法:添加上連接配接條件
           

一、傳統模式下的連接配接 :等值連接配接——非等值連接配接

1.等值連接配接的結果 = 多個表的交集
2.n表連接配接,至少需要n-1個連接配接條件
3.多個表不分主次,沒有順序要求
4.一般為表起别名,提高閱讀性和性能
           

二、sql99文法:通過join關鍵字實作連接配接

含義:1999年推出的sql文法
支援:
等值連接配接、非等值連接配接 (内連接配接)
外連接配接
交叉連接配接

文法:

select 字段,...
from 表1
【inner|left outer|right outer|cross】join 表2 on  連接配接條件
【inner|left outer|right outer|cross】join 表3 on  連接配接條件
【where 篩選條件】
【group by 分組字段】
【having 分組後的篩選條件】
【order by 排序的字段或表達式】

好處:語句上,連接配接條件和篩選條件實作了分離,簡潔明了!
           

三、自連接配接

案例:查詢員工名和直接上級的名稱

sql99

SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.`manager_id`=m.`employee_id`;
           

sql92

SELECT e.last_name,m.last_name
FROM employees e,employees m 
WHERE e.`manager_id`=m.`employee_id`;
           

進階7:子查詢

含義:

一條查詢語句中又嵌套了另一條完整的select語句,其中被嵌套的select語句,稱為子查詢或内查詢
在外面的查詢語句,稱為主查詢或外查詢
           

特點:

1、子查詢都放在小括号内
2、子查詢可以放在from後面、select後面、where後面、having後面,但一般放在條件的右側
3、子查詢優先于主查詢執行,主查詢使用了子查詢的執行結果
4、子查詢根據查詢結果的行數不同分為以下兩類:
① 單行子查詢
    結果集隻有一行
    一般搭配單行操作符使用:> < = <> >= <= 
    非法使用子查詢的情況:
    a、子查詢的結果為一組值
    b、子查詢的結果為空

② 多行子查詢
    結果集有多行
    一般搭配多行操作符使用:any、all、in、not in
    in: 屬于子查詢結果中的任意一個就行
    any和all往往可以用其他查詢代替
           

進階8:分頁查詢

應用場景:

實際的web項目中需要根據使用者的需求送出對應的分頁查詢的sql語句
           

文法:

select 字段|表達式,...
from 表
【where 條件】
【group by 分組字段】
【having 條件】
【order by 排序的字段】
limit 【起始的條目索引,】條目數;
           

特點:

1.起始條目索引從0開始

2.limit子句放在查詢語句的最後

3.公式:select * from  表 limit (page-1)*sizePerPage,sizePerPage
假如:
每頁顯示條目數sizePerPage
要顯示的頁數 page
           

進階9:聯合查詢

引入:

union 聯合、合并

文法:

select 字段|常量|表達式|函數 【from 表】 【where 條件】 union 【all】
select 字段|常量|表達式|函數 【from 表】 【where 條件】 union 【all】
select 字段|常量|表達式|函數 【from 表】 【where 條件】 union  【all】
.....
select 字段|常量|表達式|函數 【from 表】 【where 條件】
           

特點:

1、多條查詢語句的查詢的列數必須是一緻的
2、多條查詢語句的查詢的列的類型幾乎相同
3、union代表去重,union all代表不去重
           

DML語言

插入

文法:

insert into 表名(字段名,…)

values(值1,…);

特點:

1、字段類型和值類型一緻或相容,而且一一對應
2、可以為空的字段,可以不用插入值,或用null填充
3、不可以為空的字段,必須插入值
4、字段個數和值的個數必須一緻
5、字段可以省略,但預設所有字段,并且順序和表中的存儲順序一緻
           

修改

修改單表文法:

update 表名 set 字段=新值,字段=新值
【where 條件】
           

修改多表文法:

update 表1 别名1,表2 别名2
set 字段=新值,字段=新值
where 連接配接條件
and 篩選條件
           

删除

方式1:delete語句

單表的删除: ★

delete from 表名 【where 篩選條件】

多表的删除:

delete 别名1,别名2

from 表1 别名1,表2 别名2

where 連接配接條件

and 篩選條件;

方式2:truncate語句

truncate table 表名
           

兩種方式的差別【面試題】

#1.truncate不能加where條件,而delete可以加where條件

#2.truncate的效率高一丢丢

#3.truncate 删除帶自增長的列的表後,如果再插入資料,資料從1開始
#delete 删除帶自增長列的表後,如果再插入資料,資料從上一次的斷點處開始

#4.truncate删除不能復原,delete删除可以復原
           

DDL語句

庫和表的管理

庫的管理:

一、建立庫
create database 庫名
二、删除庫
drop database 庫名
           

表的管理:

​ #1.建立表

CREATE TABLE IF NOT EXISTS stuinfo(
    stuId INT,
    stuName VARCHAR(20),
    gender CHAR,
    bornDate DATETIME
);

DESC studentinfo;
#2.修改表 alter
文法:ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 字段名 【字段類型】;

#①修改字段名
ALTER TABLE studentinfo CHANGE  COLUMN sex gender CHAR;

#②修改表名
ALTER TABLE stuinfo RENAME [TO]  studentinfo;
#③修改字段類型和列級限制
ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ;

#④添加字段

ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20) first;
#⑤删除字段
ALTER TABLE studentinfo DROP COLUMN email;

#3.删除表

DROP TABLE [IF EXISTS] studentinfo;
           

常見類型

整型:

小數:
    浮點型
    定點型
字元型:
日期型:
Blob類型:
           

常見限制

NOT NULL
DEFAULT
UNIQUE
CHECK
PRIMARY KEY
FOREIGN KEY
           

##資料庫事務

###含義

通過一組邏輯操作單元(一組DML——sql語句),将資料從一種狀态切換到另外一種狀态

###特點

(ACID)

原子性:要麼都執行,要麼都復原

一緻性:保證資料的狀态操作前和操作後保持一緻

隔離性:多個事務同時操作相同資料庫的同一個資料時,一個事務的執行不受另外一個事務的幹擾

持久性:一個事務一旦送出,則資料将持久化到本地,除非其他事務對其進行修改

相關步驟:

1、開啟事務
2、編寫事務的一組邏輯操作單元(多條sql語句)
3、送出事務或復原事務
           

###事務的分類:

隐式事務,沒有明顯的開啟和結束事務的标志

比如
insert、update、delete語句本身就是一個事務
           

顯式事務,具有明顯的開啟和結束事務的标志

1、開啟事務
    取消自動送出事務的功能

    2、編寫事務的一組邏輯操作單元(多條sql語句)
    insert
    update
    delete

    3、送出事務或復原事務
           

使用到的關鍵字

set autocommit=0;
start transaction;
commit;
rollback;

savepoint  斷點
commit to 斷點
rollback to 斷點
           

事務的隔離級别:

事務并發問題如何發生?

當多個事務同時操作同一個資料庫的相同資料時
           

事務的并發問題有哪些?

髒讀:一個事務讀取到了另外一個事務未送出的資料
不可重複讀:同一個事務中,多次讀取到的資料不一緻
幻讀:一個事務讀取資料時,另外一個事務進行更新,導緻第一個事務讀取到了沒有更新的資料
           

如何避免事務的并發問題?

通過設定事務的隔離級别
1、READ UNCOMMITTED
2、READ COMMITTED 可以避免髒讀
3、REPEATABLE READ 可以避免髒讀、不可重複讀和一部分幻讀
4、SERIALIZABLE可以避免髒讀、不可重複讀和幻讀
           

設定隔離級别:

set session|global  transaction isolation level 隔離級别名;
           

檢視隔離級别:

select @@tx_isolation;
           

視圖

含義:了解成一張虛拟的表

視圖和表的差別:

使用方式    占用實體空間

視圖    完全相同    不占用,僅僅儲存的是sql邏輯

表    完全相同    占用
           

視圖的好處:

1、sql語句提高重用性,效率高
2、和表實作了分離,提高了安全性
           

視圖的建立

​ 文法:

​ CREATE VIEW 視圖名

​ AS

​ 查詢語句;

視圖的增删改查

​ 1、檢視視圖的資料 ★

SELECT * FROM my_v4;
SELECT * FROM my_v1 WHERE last_name='Partners';

2、插入視圖的資料
INSERT INTO my_v4(last_name,department_id) VALUES('虛竹',90);

3、修改視圖的資料

UPDATE my_v4 SET last_name ='夢姑' WHERE last_name='虛竹';

4、删除視圖的資料

DELETE FROM my_v4;
           

某些視圖不能更新

​ 包含以下關鍵字的sql語句:分組函數、distinct、group by、having、union或者union all

​ 常量視圖

​ Select中包含子查詢

​ join

​ from一個不能更新的視圖

​ where子句的子查詢引用了from子句中的表

視圖邏輯的更新

​#方式一:
​CREATE OR REPLACE VIEW test_v7
​AS
​SELECT last_name FROM employees
WHERE employee_id>100;

#方式二:
ALTER VIEW test_v7
AS
SELECT employee_id FROM employees;

SELECT * FROM test_v7;
           

視圖的删除

​ DROP VIEW test_v1,test_v2,test_v3;

視圖結構的檢視

​ DESC test_v7;

​ SHOW CREATE VIEW test_v7;

存儲過程

含義:一組經過預先編譯的sql語句的集合

好處:

1、提高了sql語句的重用性,減少了開發程式員的壓力
2、提高了效率
3、減少了傳輸次數
           

分類:

1、無傳回無參
2、僅僅帶in類型,無傳回有參
3、僅僅帶out類型,有傳回無參
4、既帶in又帶out,有傳回有參
5、帶inout,有傳回有參
注意:in、out、inout都可以在一個存儲過程中帶多個
           

建立存儲過程

文法:

create procedure 存儲過程名(in|out|inout 參數名  參數類型,...)
begin
    存儲過程體

end
           

類似于方法:

修飾符 傳回類型 方法名(參數類型 參數名,...){

    方法體;
}
           

注意

1、需要設定新的結束标記
delimiter 新的結束标記
示例:
delimiter $

CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數名  參數類型,...)
BEGIN
    sql語句1;
    sql語句2;

END $

2、存儲過程體中可以有多條sql語句,如果僅僅一條sql語句,則可以省略begin end

3、參數前面的符号的意思
in:該參數隻能作為輸入 (該參數不能做傳回值)
out:該參數隻能作為輸出(該參數隻能做傳回值)
inout:既能做輸入又能做輸出
           

調用存儲過程

​ call 存儲過程名(實參清單)

函數

建立函數

學過的函數:LENGTH、SUBSTR、CONCAT等

文法:

CREATE FUNCTION 函數名(參數名 參數類型,...) RETURNS 傳回類型
BEGIN
    函數體

END
           

調用函數

​ SELECT 函數名(實參清單)

函數和存儲過程的差別

關鍵字        調用文法    傳回值            應用場景
函數        FUNCTION    SELECT 函數()    隻能是一個        一般用于查詢結果為一個值并傳回時,當有傳回值而且僅僅一個
存儲過程    PROCEDURE    CALL 存儲過程()    可以有0個或多個        一般用于更新
           

流程控制結構

系統變量

一、全局變量

作用域:針對于所有會話(連接配接)有效,但不能跨重新開機

檢視所有全局變量
SHOW GLOBAL VARIABLES;
檢視滿足條件的部分系統變量
SHOW GLOBAL VARIABLES LIKE '%char%';
檢視指定的系統變量的值
SELECT @@global.autocommit;
為某個系統變量指派
SET @@global.autocommit=0;
SET GLOBAL autocommit=0;
           

二、會話變量

作用域:針對于目前會話(連接配接)有效

檢視所有會話變量
SHOW SESSION VARIABLES;
檢視滿足條件的部分會話變量
SHOW SESSION VARIABLES LIKE '%char%';
檢視指定的會話變量的值
SELECT @@autocommit;
SELECT @@session.tx_isolation;
為某個會話變量指派
SET @@session.tx_isolation='read-uncommitted';
SET SESSION tx_isolation='read-committed';
           

自定義變量

一、使用者變量

聲明并初始化:

SET @變量名=值;
SET @變量名:=值;
SELECT @變量名:=值;
           

指派:

方式一:一般用于賦簡單的值
SET 變量名=值;
SET 變量名:=值;
SELECT 變量名:=值;


方式二:一般用于賦表 中的字段值
SELECT 字段名或表達式 INTO 變量
FROM 表;
           

使用:

select @變量名;
           

二、局部變量

聲明:

declare 變量名 類型 【default 值】;
           

指派:

方式一:一般用于賦簡單的值
SET 變量名=值;
SET 變量名:=值;
SELECT 變量名:=值;


方式二:一般用于賦表 中的字段值
SELECT 字段名或表達式 INTO 變量
FROM 表;
           

使用:

select 變量名
           

二者的差別:

作用域            定義位置        文法
           

使用者變量 目前會話 會話的任何地方 加@符号,不用指定類型

局部變量 定義它的BEGIN END中 BEGIN END的第一句話 一般不用加@,需要指定類型

分支

一、if函數

​ 文法:if(條件,值1,值2)

​ 特點:可以用在任何位置

二、case語句

文法:

情況一:類似于switch
case 表達式
when 值1 then 結果1或語句1(如果是語句,需要加分号) 
when 值2 then 結果2或語句2(如果是語句,需要加分号)
...
else 結果n或語句n(如果是語句,需要加分号)
end 【case】(如果是放在begin end中需要加上case,如果放在select後面不需要)

情況二:類似于多重if
case 
when 條件1 then 結果1或語句1(如果是語句,需要加分号) 
when 條件2 then 結果2或語句2(如果是語句,需要加分号)
...
else 結果n或語句n(如果是語句,需要加分号)
end 【case】(如果是放在begin end中需要加上case,如果放在select後面不需要)
           

特點:

可以用在任何位置

三、if elseif語句

文法:

if 情況1 then 語句1;
elseif 情況2 then 語句2;
...
else 語句n;
end if;
           

特點:

隻能用在begin end中!!!!!!!!!!!!!!!

三者比較:

應用場合

if函數 簡單雙分支

case結構 等值判斷 的多分支

if結構 區間判斷 的多分支

循環

文法:

【标簽:】WHILE 循環條件  DO
    循環體
END WHILE 【标簽】;
           

特點:

隻能放在BEGIN END裡面

如果要搭配leave跳轉語句,需要使用标簽,否則可以不用标簽

leave類似于java中的break語句,跳出所在循環!!!
           

繼續閱讀