MySQL 基礎+高級篇- 數據庫 -sql -尚硅谷(基礎篇)


MySQL初級

第一章.為什么要學習數據庫

 實現數據持久化

使用完整的管理系統統一管理,易於查詢

 

第二章.數據庫相關概念

DBMS:Database Management System。數據庫時通過DBMS創建和操作的容器

DB:Database,存儲數據的倉庫。保存了一系列有組織有格式規范的數據

SQL:Structure Query Language。專門與數據庫管理系統通信的語言

SQL優點:

 

第三章.數據庫存儲數據的特點

1.數據放到表里,表放到庫里

2.一個數據庫里可以有多張表,每個表有自己的名字,名字唯一

3.表具有特性,定義了數據在表中如何存儲。表類似類

4.表由一個或多個列組成,叫做字段。列類似屬性

5.表中數據按行存儲。行類似對象

 

第四章.初識MySQL

MySQL產品介紹

DBMS:分兩類,基於共享文件系統的和基於C/S架構的

MySQL基於客戶端服務端架構

 

MySQL產品安裝

安裝好后要配置

 

MySQL產品卸載

控制面板里卸載,安裝路徑里刪除,ProgramData里刪除,刪除注冊表(預防配置影響新安裝的軟件),刪除Application Data里的MySQL

 

配置文件:my.ini

 

MySQL服務的啟動和和停止

是個daemon,各個系統里找啟動/停止服務的辦法

windows:net stop 服務名。star啟動

 

MySQL服務的登錄和登出

mysql -h 地址 -P 端口號 -u 用戶 -p 密碼。選型和參數之間可以沒有空格

exit退出

 

配置環境變量:

把安裝路徑bin加入Path環境變量

 

MySQL的常見命令和語法規范

show databases(;或者\g):顯示數據庫

use 數據庫名;:使用進入數據庫

show tables;:顯示當前數據庫里的表名

show tables from 數據庫:顯示某個數據庫里的表名

select database();:顯示當前位於哪個數據庫

desc 表名;:顯示表的schema

 

查看MySQL版本:

select version();

mysql --version

mysql -V

 

MySQL語法規范

1.不區分大小寫,關鍵字大寫,表名,列名小寫

2.每條命令分號結尾

3.每條命令根據需要縮進換行。建議關鍵字一行

4.注釋是#和--空格 來當行注釋,/* */多行

 

圖形界面客戶端:

SQLyog和Navicat

 

第五章.DQL語言的學習

myemployees庫的四張表

1.departments:

2.employees:

3.jobs:

4.locations:

 

基礎查詢

select 查詢列表 from 表名

查詢列表:表中字段,常量,表達式,函數

查詢結果是虛擬表格

 

1.查詢表格中的單個字段

select last_name from employees;

2.查詢表格中的多個字段

select last_name,salary,email from employees;

3.查詢表格中的所有字段

select * from employees;

 

細節補充:

use myemployees;

``着重號代表不轉義,關鍵字也可以在里邊使用

 

查詢常量:

select 100;結果的字段名是100,即常量

 

查詢表達式:

select 100*98;結果的列字段名是“100*98”

 

查詢函數:

select database();結果列的字段名是database()

 

結果列起別名:

方式一:

select 100*98 as result from employees;

好處:1.結果清晰2.別名區分重名字段,比如自連接

 

方式二:

select last_name 姓 from employees;省略as

 

如果別名有空格,用着重號包起來

 

去重:

select distinct departmeng_id from employees;

 

+號的作用:

列合並用contat函數而不是+號

+號只能做數值運算符,不能用在非數值字符上,否則字符被轉換成0;只有+的操作數有一個是null,結果就是null

 

concat作用:

字符連接用concat

select concat(last_name,first_name) as 姓名 from employees;

 

ifnull:

如果是第一個參數是null,返回第二個參數。可以用來在做concat的時候修飾可能是null值的列

 

條件查詢

select 查詢列表 from 表名 where 【篩選條件】;

篩選條件分類:

1.按條件表達式篩選:條件運算符,>  <  =  !=  <> >= <=

select * from from employees where salary > 12000;

2.按邏輯表達式篩選:邏輯運算符,&& || ! and or not,連接條件表達式

select last_name, salary from employees where salary > 1000 && salary <= 20000;

3.模糊查詢:like, between and,in,is null

like:不是完全匹配,包含部分字符

select * from employees where last_name like '%a%';通配符用%

一般和通配符搭配使用。

%:任意多個字符,可以是0個

_:任意單個字符

\為轉義

'_$_' escape '$'表明轉義字符為💲,也可以是任意字符

 

between and:在某個范圍內,閉區間,提高語句簡潔度。兩邊的值不滿足交換律

select * from employees where saly between 10000 and 150000

 

in:值在一個散列集合里。提高語句簡潔度。集合里的值類型要統一或者兼容。不支持通配符

select * from employees where job_id in ('IT_PROT', 'AD_VP')

 

is (not)null:判斷null值。等號和不等號不能判斷null值,這個不能判斷列值是否是普通類型數值

select last_name, commission_pct from employees where commission_pct is null;

 

安全等於:<=>,可以判斷null值,普通類型的值也可以

 

排序查詢

order by 排序列表 acc | desc,排序列表可以用逗號分隔

select * from employees order by salary desc

 

常見函數

調用:select 函數名() from 表

分類:

單行函數:每一行處理,一對一映射

分組函數:多行統計,多對一

 

單行函數分類:

字符函數:

length:字符串字節長度

concat:拼接字符串

upper:換成大寫

lower:換成小寫

substring,substr:截取字符串,索引從1開始

instr:子串在字符串里的索引

trim:去前后空格,trim("a" from "aaaaBBBBBaaaaBBBBaaa")則結果為 BBBBBaaaaBBBB

lpad:左邊填充字符,最后字符長度為第二個參數指定,可能裁剪

rpad:右填充

replace:替換字符,全部替換

 

數學函數:

round:四舍五入;兩個參數取小數點位數

ceil:向上取整

floor:向下取整

truncate:截斷,取小數點后位數

mod:取余數,和%一樣

 

日期函數:

now:當前時間日期

curdate:當前日期

curtime:當前時間

獲取指定的部分,比如年月日:year,month,monthname

str_to_date:將字符串轉為日期

date_format:將日期轉為字符

datediff:算日期差距

 

其他函數:

verson:數據庫管理軟件版本

database:當前數據庫

user:當前用戶

 

流程控制函數:

if:參數類似三元運算符

case:

使用1:

case 表達式

when 常量1 then

when 常量2 then

else

end

使用2:多重if

case

when 條件1 then

when 條件2 then

else

end

 

分組函數

sum

avg

max

min

count

參數類型:sum,avg處理數值型數據,max,min,count處理任何類型;忽略null值

 

和distinct搭配:sum(distinct 列名),去重后相加,主要給count用

 

count函數:可用四個參數

參數為*:任何列,只要有非空的,就被統計進去

count(1):每一行加個值為1的列

*一般效率最高

 

和分組函數一同查詢的字段有限制:

要求是groupby的字段。否則普通字段的話返回的是一組值里的一個,沒意義

 

分組查詢

 1.介紹

select column(不能是隨便的一列), group_func(column)

from table

where condition

group by (分組條件一般是column)

將相同column值的行聚合在一起,可以應用聚合函數,多對一,column相當於一個key帶着一個數組

 

2.篩選

分組前篩選:針對每一行篩選,where條件指定

分組后篩選:針對聚合結果篩選,having條件指定

篩選總結:篩選數據源不同,原始表或者分組后結果集。分組函數做條件放having字句里,為了性能盡量用分組前篩選

 

按函數分組:group by后接函數/表達式,這是對每一行算一下添加一個新列(單行函數)

 

按多個字段分組:多個字段可以組成聯合主鍵唯一標識一個特性,可以一起select出更清楚。即是多個列都一樣的行才能分成一個組內

 

分組查詢順序:order by后加聚合條件的列名

 

總結:group by支持按照單個字段分組,也支持按照多個字段分組,也支持表達式/函數分組

 

連接查詢

多表查詢

1.笛卡爾積

from a,b:默認就是笛卡爾乘積,沒有加任何連接條件。兩個表每一行一一匹配

通過where子句,設置連接條件,篩選里邊的行

 

2.連接查詢分類

按年代分類:

  • sql92標准
  • sql99標准

 

按功能分類:

內連接

  •   等值連接
  •   非等值連接
  •   自連接

外連接

  •   左外連接
  •   右外連接
  •   全外連接

交叉連接

 

3.等值連接

where指定兩個表的列表達式對比條件,列名有重復的要加表前綴

from子句中用as為表起別名(或者不加as)。起過表別名后,不能再使用原表名

結果是兩個表的交集,相應列在兩個表里都要有

有篩選的查詢:用AND附加在where條件后

 

多表查詢就是幾個表,找相應列符合條件,條件可以是多個表達式邏輯組合;換句話說就是幾個表挑列

n表連接,至少n-1個連接條件

 

4.非等值連接

where子句里用非等於號,因為兩個表里的數據不能用等於判斷,可能需要是范圍值

 

5.自連接

相當於等值連接,但只有一個表,一個表分飾兩個角色

 

sql99語法

1.介紹

select 列名

from 表1

【連接類型】join 表2

on 連接條件

 

內連接:inner

左外:left 【outer】

右外:right 【outer】

全外:full 【outer】

 

交叉連接:cross

 

2.等值連接

與之前類似,叫了on, join結構更清楚

 

3.非等值連接

與之前類似,叫了on, join結構更清楚

 

4.自連接

與之前類似,叫了on, join結構更清楚

 

5.左右外連接

查詢a表內容不在b表里的行,即一個表中有另一個表中沒有的記錄

一種主從結構,左外連接以左邊的表為主表,右外連接以右邊的表為主表

結果集為內連接結果+主表中有從表中沒有的

判斷在不在一般用主鍵

 

6.全外連接

MySQL不支持,用聯合查詢代替

是把交集部分查出來+左表有右表沒有+右表有左表沒有

 

7.交叉連接

 笛卡爾乘積

select 列名

from 表1

cross join 表2

 

總結:join可以有七種,分別查交集,表1+交集,表2+交集,表1,表2,全部,全部-交集

 

子查詢

1.介紹

出現在其他語句中的select語句,叫做子查詢或者內查詢

外部查詢語句是主查詢或者內查詢

 

分類:

按結果集的行數不同

標量子查詢:一行一列

列子查詢:一列多行

行子查詢:一行多列

表子查詢:多行多列

 

2.where

子查詢結果當作條件參數

特點:

1.子查詢放在小括號內

2.子查詢放在條件的右側

3.標量子查詢配合單行操作符使用,>,<等;列子查詢配合多行操作符使用,in 、not in、any、some、all

4.子查詢優先於主查詢先執行,主查詢的條件用到了子查詢結果

 

非法使用子查詢:數目不對的話,會報錯;空的子查詢結果集結果是空

 

1.標量

子查詢結果是一個標量,一行一列

 

2.列

子查詢結果是一個列多行

 

3.行

一行多列或者多行多列

where條件里向量化,where (列1,列2) = (子查詢(每個列可以是一個函數,得到一行))

 

3.select

僅僅支持標量子查詢

子查詢結果當作結果集中的一列

可以把當前行相應的列值,送到子查詢里當參數,返回的是一個標量,匹配主查詢里一行,當作結果集

一般可以用表連接替代

 

4.from

支持表子查詢

子查詢結果當作中間表

子查詢的結果集當成一個表來連接。要用as起個別名方便后面引用

 

5.exists

相關子查詢,僅僅支持表子查詢

子查詢結果當作條件結果

exists(子查詢)

一個子查詢里有沒有值,有返回1,沒有返回0

用在where里,先執行主查詢,再執行子查詢,過濾,判斷是否在在行。where的本質是返回的值為1,該行保留

 

分頁查詢

limit子句

limt offset, size

offset從0開始

offset公式是(page-1)* size

 

union聯合查詢

並集

將多條查詢語句結果,合並為一個結果集(行數相加)

把or這個大的條件,拆成多個,結果集去重

可以實現全連接,但是沒辦法兩個表橫着拼接,只能豎着拼

查詢多個表,多個表沒有關系,但是查詢信息一致

要求:

1.兩個表列數一致

2.列的順序要一致,不然歧義

3.結果集去重,UNION ALL不去重

 

第六章.DML語言的學習

插入語句

insert

表明 列名 新值

第一種插入:

insert into 表名(列名1,……) values(值1,……)

插入的值要與列類型兼容

可以為空的列,不寫就是插入null;或者寫列名,值用null填充;列的順序可以調換

列和值數量要一致

列名可以省略,默認是所有列,順序不能變

 

第二種插入:

insert into 表名 set 列名=值,列名=值

 

對比總結:

方式1支持插入多行

方式1支持子查詢,把子查詢(比如其他表)的結果插入,一個select語句放的都是常量返回的也是一行

 

修改語句

update

 

修改單表:

update 表

set 列=新值,列=新值

where

 

修改多表:

級聯更新

update 表1

連接表2

set 列=值(針對連接后表的列)

where

 

刪除語句

delete

 

第一種刪除:

delete from 表名 where

 

第二章刪除:

truncate table 表名:刪除這個表里的數據

 

truncate刪除后,自增長列重新開始,delete不會

truncate沒有返回值;delete返回影響幾行

truncate不能回滾,delete可以回滾

 

第七章.DLL語言的學習

創建/修改/刪除/查詢庫和表

create

alter

drop

show

庫和表的管理

庫:

create database 數據庫名

create database if not exists 數據庫名,數據庫存在也不會報錯

更改庫的字符集:alter database  庫名 character set  【】

drop database ,刪庫

 

表:

創建:create table 表名(列名 類型 (長度) 約束,)

 

修改:修改列名,類型,約束,添加列,刪除列,修改表名

修改列名:alter table 表名 change column 舊列名 新列名 類型

修改類型:alter table 表名 modify column 列名 類型

添加列:alter table 表名 add column 新列名 類型

刪除列:alter table 表名 drop column 列名

重命名表:alter table 表名 rename to 新表名 

 

刪除:

drop table 表

 

復制:

1.僅僅復制表結構

create table 表名 like 現有表

 

2.復制內容

create table 表名 

select * from 表,用子查詢返回一個臨時表

 

只復制部分列名:子查詢where都是假

 

常見數據類型介紹

  •  數值型
  •   整型
  •   小數
  •     定點數
  •     浮點數
  • 字符型
  •   較短的文本
  •     char
  •     varchar
  •   較長的文本
  •     text
  •     blob
  • 日期型

 

整型:

分類:

Tinyint:1

Smallint:2

Mediumint:3

Int,integer:4

BigInt:8

 

特點:

設置無符號,有符號:

int類型后邊跟unsigned,即為無符號,否則默認為有符號

超出了范圍,會有警告報錯,數值為0或者插不進去

Int (7)設置顯示結果寬度,zerofill可以用0填充顯示位並且int默認是無符號

 

小數:

浮點:

float:4

double:8

定點:

dec(m,d):m+2

decimal(m,d):m+2

特點:m代表整數部位+小數部位,d代表小數部位。如果超過范圍,插入臨界值

默認decimal是10,0;float和double沒有限制

定點型精度較高,如貨幣運算

所選擇的類型越簡單越好

 

字符型:

char(m):最長m個字符,空間固定m個字符,m默認為1

varchar(m):最長m個字符,空間根據實際字符數來取,m不可以省略

bit(m):

binary

varbinary

enum:最多兩個字節,必須是列表中的一個值。enum(“a”, “b”)。不區分大小寫

set:和枚舉類似,可以一次插入列表中的多個。 values(‘a,b,c’)

 

日期型:

date:4

datetime:8

timestamp:4,范圍比datetime小,和實際時區相關,時間會跟着時區變

time:3

year:1

 

常見約束

限制數據,保證數據可靠准確性

六大約束:

not null:非空約束

default:默認約束,有默認值

primary key:主鍵約束,具有唯一性非空

unique:唯一約束,唯一性可為空

check:檢查約束,滿足一定條件才可以,MySQL不支持

foreign key(references):外鍵約束。從表添加該約束

 

show index from 表名:顯示索引。主鍵,外鍵,唯一鍵自動生成索引

 

創建表和修改表時添加約束

 

約束分類:

列級

表級

 

外鍵約束對列級無效

非空和默認約束對表級約束無效

 

添加列級約束:

約束放在類型后面

 

添加表級約束:

列最后加約束,constraint 約束名 約束

 

主鍵和唯一區別:

唯一只可以插一個null

兩個列可以組合成主鍵(定義的時候一起放括號里),唯一鍵,聯合主鍵

 

外鍵特點:

在從表里設置外鍵關系

主表從表里要類型兼容,名稱無所謂

外鍵在主表里要是key(主鍵或者唯一鍵)

插入數據先插入主表,刪除數據時先刪除從表

不同約束可以用空格間隔約束同一個列

 

修改表時添加約束:

修改表時(modify),直接在列后邊加約束

表級約束:用Add加約束

 

修改表時刪除約束:

modify的約束用null替代或者不寫

表級約束:drop 約束類型 約束名

 

主鍵起約束名字也沒有效果

 

外鍵級聯刪除:

最后加on delete cascade

 

外鍵級聯置空:

on delete set null

 

標識列: 

限制某個字段,又叫自增長列

id Int Primary Key auto_increment

 

變量auto_increment_increment auto_increment_offset定義步長與起始值,MySQL里不能設置起始值

起始值可以用第一條數據插入值來設定

 

標識列要和key搭配

一個表中只能有至多一個標識列

標識列只能是數值型

 

修改表時也可以設置標識列

 

第八章.TCL語言的學習

事物和事物處理

介紹:

事物:一組sql語句成為一個執行單元,要不全部執行,要不都不執行。一部失敗則回滾

show engines顯示存儲引擎

acid:

1.原子性:事物不可分割

2.一致性:事物導致數據從一個一致性狀態轉換為另一個一致性狀態

3.隔離性:事物並發不能互相干擾,需要隔離級別來控制

4.持久性:事物一旦提交,對數據改變是永久的

 

事物創建:

1.隱式事物:自動開啟,關閉,比如delete/update/create,變量autocommit可以看

2.顯示事物:先關閉自動提交,具有明顯開始結束標志

set autocommit = 0;

start transaction;

 

commit or rollback,autommit自動開啟

 

事物並發:

事物訪問相同數據,競爭訪問,在事物過程中會有以下問題:

1.臟讀:t1讀取了t2更新但是回滾的數據

2.不可重復讀:t1讀了一次,t2更新了一次,t1再讀不一樣

3.幻讀:t1讀,t2插入,t1再讀,數據數量變了

 

隔離級別是隔離程度,隔離級別越高,並發性越差數據一致性越好

 

MySQL提供四種隔離級別:

1.read uncommitted:臟讀,不可重復讀,幻讀都有

2.read commited:提交后再讀。不可重復讀,幻讀都有。

3.repeatable read:事物里已有數據不能更改。幻讀

4.serializable:沒有問題

 

MySQL默認隔離級別是repeatable read

 

Oracle只有兩個,read commited和serializable

 

查看隔離級別:

變量@@tx_isolation

設置隔離級別:set session transaction isolation level read uncommitted

設置全局隔離級別:set global transaction isolation level read uncommitted

 

回滾點:

savepoint 節點名;

rollback to 節點名

 

delete和truncate在事物中的區別:

truncate不能回滾

 

第九章.視圖的講解

介紹:

虛擬表

臨時性,通過表動態生成,查詢過一次的緩存。視圖是sql語句,而不是查詢結果

適合多次使用,sql比較復雜的情況

視圖一般不帶where之類的語句

重用sql,簡化調用的sql,保護安全

 

創建:

create view 視圖名

as

查詢語句;

 

修改:

create or replace view 視圖名

as

查詢語句;

 

alter view 視圖名

as

查詢語句;

 

刪除:

drop view 視圖名1,視圖名2

 

查看:

desc view1

show create view view1(顯示創建視圖過程)

 

視圖里實現插入:

insert into view1 values()

更改和刪除亦可,但是受到限制

具有以下元素的視圖不能被更新

  • 分組函數,distinct,group by,having,union,union all
  • 常量視圖
  • select包含子查詢
  • join
  • from一個不能更新的視圖
  • where子句的子查詢引用了from子句中的表

不能有中間表

 

視圖和表的區別

create view

create table

表占用物理空間

 

第十章.變量 

分類:

1.系統變量

變量由系統提供的

 

查看所有變量

show global | session variables

 

查看滿足條件的系統變量

show global | session variables like ‘%變量名%’

 

查看指定變量的值

select @@global | session.系統變量名

 

為某個系統變量賦值

set global | session 系統變量名 = 值

set @@global | session.系統變量名 = 值

 

什么也不寫默認會話級別

  1.全局變量

重啟后全局變量修改無效,要改配置文件才行

  2.會話變量

2.自定義變量

使用步驟:

聲明

賦值

使用

  1.用戶變量

會話期有效

set @用戶變量名=值

set @用戶變量名:=值

select @用戶變量名:=值

 

select 字段名 into 變量名 from 表

  2.局部變量

作用域在begin end塊中,且聲明為第一句

聲明:

declare 變量名 類型 default 默認值

 

賦值:

set 用戶變量名=值

set 用戶變量名:=值

select @用戶變量名:=值

 

select 字段名 into 變量名 from 表

 

使用:

select 局部變量名

 

第十一章.存儲過程和函數

提供代碼重用性

簡化操作

 

存儲過程

一組預先編譯好的SQL語句集合,類似批處理語句

可以有預編譯,多條語句只需連接一次數據庫

 

語法:

創建:

create procedure 存儲過程名(參數列表)

begin

方法體

end

參數列表包含三部分:

參數模式 參數名 參數類型

 

參數模式:in out inout

 

存儲過程只有一句話,begin end可以省略

delimiter 結束標志,重新設置存儲過程結尾,默認是分號,但是在客戶端不好用

 

使用:

call 存儲過程名(實參列表)

 

空參列表:

不帶參數,直接調用

 

in模式:

參數不帶返回值

 

out模式:

保存返回值

 

inout模式:

參數既有輸入,也保存返回值

 

存儲過程刪除:

drop procedure 存儲過程名字

一次只能刪除一個

 

存儲過程查看:

show create procedure 存儲過程名

 

函數

和存儲過程區別:

函數有且只能有一個返回(適合處理數據);存儲過程可以有0個或多個 (適合增刪改)

 

創建函數:

create function 函數名(參數列表) returns 類型

begin

  函數體

end

注意事項:

參數列表:參數名,參數類型

函數體:要有return語句

函數體只有一句話,省略begin end

 

調用函數:select 函數名(參數列表)

 

刪除函數:

drop function 函數名

 

查看函數:

show create function 函數名

 

第十二章.流程控制結構

介紹

順序結構

分級結構

循環結構

 

case:

類似switch,等值判斷

case 值

when 值1 then;

when 值2 then;

else ;

end case;

 

類似if,區間判斷

case

when 條件1 then;

when 條件2 then;

else;

end case;

 

既可以作為表達式,也可以做語句

 

if:

if 條件1 then ;

elseif 條件2 then;

else ;

end if;

 

循環:

分類:

while

loop

repeat

 

控制:

iterate 標簽名

leave 標簽名

 

標簽: while 循環條件 do

循環體

end while 標簽;

 

標簽: loop

循環體

end loop 標簽;

模擬死循環

 

標簽:repeat

循環體

until 結束循環條件

end repeat 標簽;

至少執行一次

 

第十三章 觸發器

為某張表綁定好代碼,當表中內容改變時(增刪改),觸發代碼執行

觸發器:事件類型,觸發時間,觸發對象

觸發類型:增刪改

觸發時間:前后

觸發對象:行記錄

 

MySQL高級結構沒有大括號,都是用字符符號代替

 

創建

create trigger 觸發器名 觸發時間 事件類型 on 表名 for each row

begin

 

end;

 

查看

show triggers 【like ‘pattern’】

 

show create trigger 觸發器名字

 

\G:結果顛倒90度

 

觸發器保存到information_schema.triggers表中

 

使用

某種情況發生,自動觸發

 

刪除 

drop tirgger 觸發器名字

 

記錄

每個操作要執行,系統將操作的數據新舊狀態記錄下來

訪問使用old.字段名和new.字段名

 

第十四章 游標

 

第十五章 事件

定時器,時間到了自動執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM