**
小白終是踏上了這條不歸路----小文的mysql學習筆記(1)
小白終是踏上了這條不歸路----小文的mysql學習筆記(2)----條件查詢
小白終是踏上了這條不歸路----小文的mysql學習筆記(3)----排序詢查
小白終是踏上了這條不歸路----小文的mysql學習筆記(4)----常見的基本函數
小白終是踏上了這條不歸路----小文的mysql學習筆記(5)----分組查詢
…
…
小白終是踏上了這條不歸路----小文的mysql學習筆記(目錄)
**
在學習之後,感覺還不是很熟悉,於是跟着老師複習了一遍,跟着打了一遍總結。下面是mysql基礎部分的所有知識點的總結,希望對自己以及看到這篇文章的人有所幫助。
**
**
當然總結只有主體部分,有些沒明白的可以去目錄看該節內容
一、數據庫與mysql
(一)數據庫的相關概念
一、數據庫的好處
1、可以持久化數據到本地
2、結構化查詢
二、數據庫的常見概念★
1、DB:數據庫,存儲數據的容器
2、DBMS:數據庫管理系統,又稱爲數據庫軟件或數據庫產品,用於創建或管理DB
3、SQL: 結構化查詢語言,用於和數據庫通信的語言,不是某個數據庫軟件特有的,而是幾乎所有的主流數據庫軟件通用的語言
三、數據庫存儲數據的特點
1、數據存放到表中,然後表再放到庫中
2、-個庫中可以有多張表,每張表具有唯一的表名用來標識自己
3、表中有一-個或多個列,列又稱爲“字段”,相當於java中“屬性”
4、表中的每一行數據,相當於java中“對象”
四、常見的題囑屋管理系綱
mysgl、 oracle、 db2、 sqlserver
(二)mysql的相關介紹
一、MySQL的背景
前身屬於瑞典的一家公司, MySQL AB
08年被sun公司收購
09年sun被oracle收購
二、MySQL的優點
1、開源、免費、成本低
2、性能高、移植性也好
3、體積小,便於安裝
三、MySQL服務的啓動和停止
方式一: 通過命令行
net start 服務名
net stop服務名
方式二:計算機一一右擊一-管理一一服務。
四、MySQL服務的登錄和退出
登錄: mysq1 【-h 主機名-P端口號】 -u 用戶名 -p密碼|
Ps:我們目前學習的時候 用的是root 就可以直接mysql -u root -p密碼就好了。
退出: exit或ctr1+C
二、 DQL語言
(一)基礎查詢
一、語法
select 查詢列表
from 表名;
二、特點
1、查詢列表可以是字段、常量、表達式、函數,也可以是多個.
2、查詢結果是一個虛擬表
三、示例
1、查詢單個字段
select 字段名 from 表名;
2、查詢多個字段
select 字段名,字段名 from 表名;
3、查詢所有字段
select * from 表名
4、查詢常量
select 常量值;
注意:字符型和日期型的常量值必須用單引號引起來,數值型不需要
5、查詢函數
select 函數名(參數列表);
6、查詢表達式
select a*b;
ps:支持我們正常的加減乘除以及取模等
7、起別名
①as
②空格
8、去重
select distinct 字段名 from 表名;
ps:distinct用於去重,一般後面只跟單個字段,如果後面跟的是多個字段,只有這多個字段都重複的一行纔會被去重,其他只有部分重複的行是不會被去除的。
9、加號(+)
作用:做加法運算。
select數值+數值;直接運算,將二者相加。
select字符+數值;會先試圖將字符轉換成數值,如果轉換成功,則繼續運算;否則將字符轉換成0,再與之繼續做運算。
select nul1+值; 結果爲null,null和任何值相加都等於null。
10、【補充 】concat拼接函數
select concat(字符1,字符2,字符3…);
功能:拼接字符
ps:可以將幾個字符拼接在一起
11、【補充】 ifnull 函數
ifnull(exper1,exper2)
功能:判斷exper1是否爲null,如果爲null返回exper2,否則返回exper1本身。
12、【補充】 isnull 函數
isnull(xxx);
功能:判斷某字段或表達式是否爲null,如果是,則返回1,否則返回0。
(二)條件查詢
一、 語法
select 查詢列表
from 表名
where 篩選條件
二、篩選條件的分類
1、簡單條件運算符
大於 | > |
---|---|
小於 | < |
等於 | = |
不等於 | <> 或!= |
大於等於 | >= |
小於等於 | <= |
安全等於 | <=> |
ps:<>安全等與,既可以用來判斷普通數值,又可以用來判斷null值。
但是 =和<>不能用來判斷null值
2、邏輯運算符
與 | && 、 and |
---|---|
或 | ll 、or |
非 | !、not |
3、模糊查詢
like
ps:like一般和通配符搭配使用,
通配符: %表示任意多個字符;
_ 表示任意單個字符。
between and
in
is null / is not null ;用於判斷null值。
4、is null 和 安全等與 <=>的區別
二者都可以用於判斷null值,但是is null不能判斷普通類型的數值,而安全等與(<=>)可以判斷普通類型的數值, but 安全等於的可讀性比is null差。
(三)排序查詢
一、語法
select 查詢列表
from 表
where 篩選條件
order by 【asc/desc】
二、特點
1、asc代表的是升序,desc代表的是降序,如果不寫,默認是升序;
2、order by子句中可以支持單個字段、多個字段、表達式、函數、別名。
3、order by 子句一般是放在查詢語句的最後面,limit子句除外。
(四)常見的函數
概念: 類似於java的方法,,將一組邏輯語句封裝在方法體中,對外暴露方法名。
好處: (1) 隱藏了實現細節;
(2) 提高了代碼的重要性.
語法: select 函數名(實參列表)【from 表】
一、單行函數
1、length(str); 獲取參數值的字節個數
2、concat(str1,str2,…); 用於拼接字符串
3、upper(srt);將字符大寫顯示
4、lower(str);將字符小寫顯示
5、substr();用於截取指定的字符串。
ps:substr一共有兩種語法:第一種是 substr(xxx,x);截取從指定索引處至後面的所有字符
第二種是substr(xxx,x,x);截取從指定索引處到指定長度的字符。
6、instr(xxx,xxx);返回子串第一次出現的索引
7、trim(“xx” from “xxaaaaaxx”);用於去掉前後指定的字符及空格。
8、lpad(“xxxx”,長度,str);用指定的字符實現左填充指定的長度
9、rpad(“xxx0,長度,str”);用指定的字符實現右填充指定長度
ps : 有一點注意,lpad 左填充和rpad右填充 ,如果字數多了則會將本身截取到相等的長度,從右邊開始截取。
10、replace();用於替換
replace(“aabbcc”,“aa”,“cc”);表示將aa換成cc
二、數學函數
1、mod();取模
2、round();:四捨五入
3、ceil();向上取整
4、floor();向下取整
5、truncate();截斷
6、rand();獲取隨機數,返回0-1之間的小數,但是不包括端點值
三、日期函數
1、now();返回當前系統日期+時間
2、curdate();返回當前系統日期,不包含時間
3、curtime();返回當前系統時間,不包含日期
4、year();返回年
5、month();返回月
6、day();返回日
7、hour();返回小時
8、minute();返回分鐘
9、cecond();返回秒
10、str_to_date();將字符格式的日期轉換爲指定格式的日期
11、date_format();將其他形式的日期轉換成字符形式的日期
補充:
格式符 | 功能 |
---|---|
%Y | 四位的年份 |
%y | 2位的年份 |
%m | 月份( 01,02…11,12 ) |
%c | 月份( 1,2…11,12 ) |
%d | 日( 01,02,… ) |
%H | 小時( 24小時制) |
%h | 小時( 12小時制) |
%i | 分鐘( 00,01…59 ) |
%s | 秒( 00,01…59 ) |
四、其他函數
Select version(); 查詢版本號;
Select database();查看當前的庫;
select user(); 查看當前用戶;
五、流程控制函數
IF(expr1,expr2,expr3)
若expr1正確,則輸出expr2;若expr1錯誤,則輸出expr3.
case 函數的使用一: switch case 的效果
語法: case 要判斷的字段或表達式
When 常量1 then 要顯示的值1或語句
When 常量2 then 要顯示的值2或語句
………
else 要顯示的值n或語句
end
ps:一般用作等值判斷
case函數的使用二:類似於多重if
語法:case
When 條件1 then 要顯示的值1或語句1
When 條件2 then 要顯示的值2或語句2
……
else 要顯示的值n或語句n
end
ps:一般用於實現區間判斷
六、分組函數
1分類
sum | 求和 |
avg | 平均值 |
max | 最大值 |
min | 最小值 |
count | 計算個數 |
①語法
select 函數名 (字段) from 表名;
②支持的類型
sum和avg一般用於處理數值型
max、min、 count可以處理任何數據類型
③以上分組函數都忽略null
④都可以搭配distinct使用,實現去重的統計
select 函數名(distinct 字段) from 表;
⑤count函數
count (字段) :統計該字段非空值的個數
count (*) :統計結果集的行數
count (1) :統計結果集的行數
效率上:
MyISAM存儲引擎,count ()最高
InnoDB存儲引擎,count ()和count (1)效率>count (字段)
(五)分組查詢
一、語法:
select 分組函數,列(要求出現在group by的後面)
from 表
【where 篩選條件】
Group by 分組的列表
【order by 子句】
特點1: 分組前的篩選條件,數據源是原始表,位置是放在group by前面用where+篩選條件;
分組後的篩選條件,數據源是分組後的結果集,位置是放在group by後面用having+篩選條件。
注:能用分組前篩選條件的,就優先考慮使用分組前篩選的條件。
特點2: group by子句支持單個字段分組、多個字段分組(多個字段之間用逗號隔開沒有順序要求)、表達式或函數(使用較少)
特點3: 也可以添加order by排序(排序放在整個分組查詢的最後)
(六)連接查詢
一、含義
又稱多表查詢,當查詢的字段來自於多個表時,就會用到鏈接查詢。
select
字段1,字段2
from表1,表2,…:
笛卡爾乘積: 當查詢多個表時,沒有添加有效的連接條件,導致多個表所有行實現完全連接
如何解決: 添加有效的連接條件
二、分類
按年代分類:sq192標準:僅僅支持內連接;
sq199標準【推薦】:支持內鏈接+外連接(左外和右外)+交叉鏈接;
按功能分類:
內連接:等值連接;
非等值連接;
自鏈接;
外連接:左外鏈接;
右外連接;
全外連接;
交叉連接;
三、sql92語法
1、等值連接
語法: select查詢列表
from表1別名,表2別名
where表1. key=表2. key
【and篩選條件】
【group by 分組字段】
【having分組後的篩選】
【order by 排序字段】
特點:
①一般爲表起別名
②多表的順序可以調換
③n表連接至少需要n-1個連接條件
④等值連接的結果是多表的交集部分
2、非等值連接
語法: select查詢列表
from表1別名,表2別名
where 非等值的鏈接條件
【and篩選條件】
【group by 分組字段】
【having分組後的篩選】
【order by 排序字段】
個人理解:若鏈接條件不是=,則爲非等值連接
3、自鏈接
語法: select查詢列表
from表 別名1,表 別名2
where 等值的連接條件
【and篩選條件】
【group by 分組字段】
【having分組後的篩選】
【order by 排序字段】
MySQL自連接就是在同一張表上自己連接自己,參與連接的表是同一張表,通過設置表別名虛擬出兩張表。當我們想將表中行與同一表中的其他行組合或運算時,可以使用自連接。要執行自連接操作必須使用表別名來幫助MySQL在查詢中區分連接後的虛擬結果集中的字段。
四、sql99語法
1、內連接
語法: select 查詢列表
From 表1 別名
【 inner】 join 表2 別名
on 鏈接條件;
特點:
①表的順序可以調換
②內連接的結果=多表的交集
③n表連接至少需要n 1個連接條件
④inner可以省略
分類:(1)等值連接;(2)非等值連接;(3)自鏈接
2、外連接
語法: select 查詢列表
表1 別名1
【連接類型】join 表2 別名
on 連接條件
【where篩選條件】
【group by分組】
【having篩選條件】
【order by排序列表】
特點: 1、外連接的查詢結果爲主表中的所有記錄
如果從表中有和它匹配的,則顯示匹配的值
如果從表中沒有和它匹配的,則顯示null
外連接查詢結果=內連接結果+主表中有而從表沒有的記錄。
2、左外連接,left join左邊的是主表
右外連接,right join右邊的是主表
3、左外和右外交換兩個表的順序,可以實現同樣的效果
4、全外連接=內連接的結果+表1中有但表2沒有的+表2中有但表1沒有的,即兩張表取並集。
①查詢的結果主表中所有的行,如果從表和它匹配的將顯示匹配行,如果從表沒有匹配的則顯示nul1
②1eft join 左邊的就是主表,right join 右邊的就是主表
ful1 join 兩邊都是主表
③一般用於查詢除了交集部分的剩餘的不匹配的行
3、交叉連接
語法: select 查詢列表
from 表1 別名.
cross join 表2 別名;
ps:相當於用sq199的標準來實現的笛卡爾乘積
(七)子查詢
一、含義
概念:出現在其他語句內部的select語句,稱爲子查詢或內查詢;
內部嵌套其他select語句的查詢即外部的查詢語句,稱爲外查詢或主.查詢。
二、分類
分類:
按子查詢出現的位置:
select後面: 僅僅支持標量子查詢
from後面: 支持表子查詢
where或having後面:★ 標量子查詢(單行查詢) ★
列子查詢(多行多行查詢) ★
行子查詢
exists後面(相關子查詢) 標量子查詢
列子查詢
行子查詢
表子查詢
按結果集的行列數不同:
標量子查詢 (結果集只有一行一列)
列子查詢 (結果集只有一列多行)
行子查詢 (結果集有一行多列也可是多行多列)
表子查詢 (結果集一般爲多行多列)
注:不論是一行一列還是一列多行,只要是查詢都可以叫做表子查詢,但我們通常所說的表子查詢一般指多行多列。
三、示例
where 和having後面
標量子查詢
案例:查詢最低工資的的員工姓名和工資
SELECT last_name,salary
FROM employees
WHERE salary=(
SELECT MIN(salary)
FROM employees
);
列子查詢
案例:查詢所有是領導的員工姓名
SELECT last_name
FROM employees
WHERE employee_id IN (
SELECT DISTINCT manager_id
FROM employees
);
(八)分頁查詢
當你查詢的數據很多的時候,一頁顯示不全,則需要提交sql分頁顯示,這便用到了我們今天所學的分頁查詢了
limit 【offset,】 size;
一、語法
select查詢列表
from表1
【 join type join表2
on連接條件
where
篩選條件
group by分組字段
having分組後的篩選
order by排序的字段】
limit 【offset,】size;
解釋:
offset:要顯示條目的起始索引(起始索引從0開始)
size:要顯示的條目個數
當你像服務器提交查詢的時候一般,這個起始不會是一個固定的值,這不方便我們查詢會是一個變量,這就需要用到下面的一個公式:select 查詢列表
from 表
limit (page-1) *size , size;
page要顯示的頁數,size每頁的條目數
(九)聯合查詢
一、含義
Union 聯合合併:可以將多條查詢語句的查詢結果合併成一-個結果。
二、語法
語法: 查詢語句1
union 【all】
查詢語句2
union 【all】
。。。。。
查詢語句n
三、意義
1、將一條比較複雜的查詢語句拆分成多條語句
2、當要查詢的結果來自於多個表,且多個表沒有直接的連接關係,但查詢的信息一致時便可以用到聯合查詢。
四、特點
1、要求多條查詢語句的查詢列數必須是一致的!
2、(雖然當幾個查詢語句查詢的列的類型不一樣的時候不會報錯,查詢結果的列名默認以你第一個查詢語句的查詢字段命名。)但是我們要求多條查詢語句中查詢的每一列的類型和順序最好一致。
3、union關鍵字默認去重,如果使用union all 可以包含重複項。
三、DML語言
(一)插入
一、方式一
語法:
insert into 表名(字段名…) values (值…);
特點:
1、 要求值的類型和字段的類型要一致或兼容
2、 字段的個數和順序不一-定 與原始表中的字段個數和順序-致
但必須保證值和字段一 一對應
3、 假如表中有可以爲null的字段,注意可以通過以下兩種方式插入null值
①字段和值都省略
②字段寫上,插入的值寫null
4、 字段和值的個數必須一致
5、 字段名可以省略,默認所有列
二、方式二
語法:
insert into表名
set列名=值,列名=值, …
注意: 1、方式一支持插入多行,方式二不支持
2、方式一可以支持子查詢批量插入數據,而方式二不支持
(二)修改
一、修改單表的記錄★
語法: update 表名
set列=新值,列=新值, …
【where 篩選條件】;
二、修改多表的記錄[補充]
sql99語法: .update 表1 別名
inner / left /right join 表2 別名.
on 連接條件
set 列=值… τ
where 篩選條件;
(三)刪除
方式一:使用delete
1、單表記錄的刪除【★】
delete from 表名 where 篩選條件 【limit 條目數】;
2、(級聯刪除)多表記錄的刪除【補充】
sq199語法: delete 表1的別名,表2的別名
from 表1 別名
inner/left/right join 表2 別名 on 連接條件
【where 篩選條件;
【limit 條目數】
方式二:truncate
語法:
trruncate table 表名;
注意: 該方式直接刪除表的整張數據,不能添加where篩選條件
兩種方式的區別
- delete 後面可以添加where條件,而truncate不能加
- 當刪除整張表時,truncate刪除效率較高
- 假如要刪除的表中有自增長列,如果用delete刪除後,再插入數據,自增長列的值從斷點開始,而truncate刪除後,再插入數據,自 增日列的值從1開始.
- truncate刪除沒有返回值,delete刪除有返回值
- truncate 不可以回滾,delete可以回滾
四、DDL語言
(一)庫的管理
一、創建庫
create database 【if not exists】 庫名 【 character set 字符集名】
二、修改庫
alter database 庫名 【character set 字符集名】;
三、刪除庫
drop database 【if exists】 庫名;
(二)表的管理
一、創建表
語法: create table 【if not exists】表名(
列名 列的類型【(長度)約束】 ,
列名 列的類型【 (長度)約束】,
列名 列的類型【(長度)約束】,
。。。。。
列名 列的類型【(長度)約束】
);
二、修改表
1.添加列
alter table 表名add column 列名 類型【first / after字段名】 ;
2.修改列的類型或約束
alter table 表名modify column 列名 新類型 / 新約束 ;
3.修改列名
alter table 表名 change column 舊列名 新列名 類型;
4.刪除列
alter table 表名drop column 列名;
5.修改表名
alter table 表名 rename to 新表名;
三、刪除表
語法: drop table 【if existis】表名
四、複製表
1、複製表的結構
create table 表名 like 舊錶;
2、複製表的結構+數據
create table 表名
select 查詢列表 from 舊錶 【where 篩選】 ;
(三)常見的數據類型
一、數值型
1、整型
字節 | 整型 | 範圍 |
---|---|---|
1 | Tinyint | 有符號:-128~127;無符號: 0~255 |
2 | Smallint | 有符號:-32768~32767;無符號: 0~65535 |
3 | Mediumint | 有符號: -8388608~8388607;無符號: 0~1677215 |
4 | Int / interger | 有符號: - 2147483648 2147483647 ; &無符號: 0~4294967295 |
5 | Bigint | 有符號:-92233720368547 75808~92233720368547 75807; 無符號: 0~9223372036854775807*2+1 |
注意事項
①如果不設置無符號還是有符號,默認是有符號,如果想設置無符號,需要添加unsigned關鍵字
②如果插入的數值超出了整型的範圍,會報警告(8.0版本sqlyog),無法插入數據
③如果不設置長度,會有默認的長度
二、小數
一共有兩類一類是浮點型,一類是定點型
浮點數類型 | 範圍 | 字節 |
---|---|---|
float | 士1.75494351E 38~士3.402823466E+38 | 4 |
double | 士2.2250738585072014E-308~士1.7976931348623157E+308 | 8 |
定點數類型 | 範圍 | 字節 |
DEC(M,D)/DECIMAL(M,D) | 最大取值範圍與double相同,給定decimal的有效職值範圍由M和D決定 | M+2 |
釋一下M和D的意思:
D代表小數的位數,如果多了便會四捨五入保留D位小數,如果少了不夠D位那麼會自動用0來填充
M代表整數和小數一共加起來的位數,不能超過M(小文的是8.0當你超過M位數時是不會插入臨界值,當然也不會插入數據)
注意: (M,D) 可以省略,如果是float和double則會根據插入的數值的位數來確定位數;
如果是 DECIMAL M默認是10,D默認是0。
定點型的精確度較高,如果要求插入數值的精度較高如貨幣運算等就考慮使用.
三、字符型
char、varchar、 binary、 varbinary、 enum、 set、text、blob 等。
較短的文本:char 和 varchar
類型 | 範圍 | 最多字符數 |
---|---|---|
char(M) | M爲0~ 255之間的整數 | M |
varchar(M) | M爲0~65535之間的整數 | M |
二者的區別:
char(M) 是固定長度的字符,M可以省略默認爲一,雖然比較佔空間,但是效率較高;
varchar(M) 是可變長度的字符,M不可以省略,相比於char 更節省空間,但是效率相對較低。
解釋:
這裏char的固定長度字符的意思就是:加入你設置了char(6);然後你插入的數據只要兩個字符“aa”但是她是固定長度字符,所以系統還是會給你開六個的字符位置 ; 而varchar(M)是可變長度字符,M是它的最大字符數,只要在M內,你插入幾個字符,那系統就給你開幾個字符的位置,
補充:
1、binary和varbinary類型(用於保存較短的二進制)
說明: 類似於char和varchar,不同的是它們包含二進制字符串而不包含非二進制字符串。
2、Enum類型,
說明:又稱爲枚舉類型,要求插入的值必須屬於列表中指定的值之一。(不區分大小寫)
四、日期型
日期和日期類型 | 字節 | 最小值 | 最大值 |
---|---|---|---|
date | 4 | 1000-01-01 | 9999-1231 |
datetime | 8 | 1000-01-01 00:00:00 | 9999-12 -31 23: 59:59 |
timestamp | 4 | 1 9700101 080001 | 2038年的某個時刻 |
time | 3 | -838 :59:59 | 838: 59:59 |
year | 1 | 1901 | 2155 |
date 只保存日期
time 只保存時間
year 只保存年
datetime 保存日期+時間(不受時區影響)
timestamp 保存日期+時間(受時區影響)
Timestamp和datetime區別:
1、Timestamp支 持的時間範圍較小,取值範圍19700101080001- – 2038年的某個時間
Datetime的取值範圍: 1000-1-1 --9999- 12-31
2、timestamp和實際時區有關,更能反映實際的日期
而datetime則只能反映出插入時的當地時區
3、timestamp的 屬性受Mysq|版本和SQLMode的影響很大
(四)常見的約束
一、含義
一種限制,用於限制表中的數據,爲了保證表中的數據的準確和可靠性。
二、六大約束
(1)NOT NULL:非空,用於保證該字段的值不能爲空
比如姓名、學號等
(2)DEFAULT: 默認,用於保證該字段有默認值
比如性別
(3)PRIMARY KEY:主鍵,用於保證該字段的值具有唯一-性,並且非空
比如學號、員工編號等
(4)UNIQUE:唯一鍵,用於保證該字段的值具有唯一-性,可以爲空
比如座位號
(5)CHECK:檢查約束【mysql 中不支持】(意思就是在mysql中你輸入check它不會報錯,但是也不會執行!)
(6)FOREIGN KEY:外鍵,用於限制兩個表的關係,用於保證該字段的值必須來自於主表的關聯列的值.
主鍵和唯一
1、區別:
①、一個表至多有一個主鍵,但可以有多個唯一鍵
②、主鍵不允許爲空,唯一鍵可以爲空
2、相同點
都具有唯一性
都支持組合鍵,但不推薦
外鍵:
1、用於限制兩個表的關係,從表的字段值引用了主表的某字段值
2、外鍵列和主表的被引用列要求類型- -致,意義-樣,名稱無要求
3、主表的被引用列要求是- -個key (- -般就是主鍵)
4、插入數據,先插入主表
刪除數據,先刪除從表。
我們有一下兩種刪除主表和從表記錄的方式,在添加外鍵的時候加上條件
方式一:級聯刪除
ALTER TABLE stuinfo(解釋:表名) ADD CONSTRAINT fk(外鍵名) FOREIGN KEY (majorid) REFERENCES major (id) ON DELETE CASCADE ;
註釋: 就是在添加外鍵的時候在最後添加 ON DELETE CASCADE,
產生的效果就是:當我們刪除從表的數據時,主表與從表相對應的數據也會一起刪除(是直接那一行數據都會被刪除)
方式二:級聯置空
ALTER TABLE stuinfo(解釋:表名) ADD CONSTRAINT fk_ stu major F0REIGN KEY (majorid) REFERENCES major(id) ON DELETE SET NULL;
註釋:就是在添加外鍵的時候在最後添加ON DEKETE SET NULL
產生的效果就是:當我們刪除從表的數據時,主表中與之相對應的字段會被設置爲null
三、創建表時添加約束
語法:
create table 表名(
字段名 字段類型 not null, #非空
字段名 字段類型 primary key, #主鍵
字段名 字段類型 unique, #唯一
字段名 字段類型 default 值,默認
constraint 約束名 foreign key(字段名) references 主表(被引用列)
)
注意:
列級約束不可以起約束名,並且除了外鍵,其他的都可以添加列級約束;
表級約束可以取約束名,但對主鍵無效,並且不支持非空和默認
語法:
添加列級約束:
alter table 表名 modify column 字段名 字段類型 約束條件;
添加表級約束:
alter table 表名 add 【cons’t’raint 約束名】 約束類型(字段名) 【外鍵的引用】
四、修改表時添加或刪除約束
添加語法:
添加列級約束:
alter table 表名 modify column 字段名 字段類型 約束條件;
添加表級約束:
alter table 表名 add 【cons’t’raint 約束名】 約束類型(字段名) 【外鍵的引用】
刪除語法: alter table 表名 drop 約束條件 列名(也可能是你取了別名的約束名);
alter table 表名 modify column 列名 數據類型 null;
alter table 表名 modify column 列名 數據類型 ;
(五)標識列
即自增長列
1、不用手動插入值,可以自動提供序列值,默認從1開始,步長爲1
auto_increment_increment 代表步長值,就是代表自增的個數,可以用set來更改步長值
auto_increment_offset 代表起始值,當然我們也可以用set來更改起始值。
2、一個表至多有一個自增長列
3、自增長列只能支持數值型
4、自增長列必須爲一個key
一、創建表時設置自增長列
create table 表(
字段名 字段類型 約束 auto_ increment .
)
二、修改表時設置自增長列
alter table 表 modify column 字段名 字段類型 約束 auto_ increment
三、刪除自增長列
alter table 表 modify column 字段名 字段類型 約束
五、TCL語言
(一)事務
一、含義
. 是由單獨單元的一個或多個SQL語句組成,在這個單元中,每個MySQL語句是相互依賴的。而整個單獨單元作爲一個不可分割的整體,如果單元中某條SQL語句一旦執行失敗或產生錯誤,整個單元將會回滾。所有受到影響的數據將返回到事物開始以前的狀態;如果單元中的所有SQL語句均執行成功,則事物被順利執行。即這個執行單元要麼全部執行,要麼全部不執行。
二、特點(ACID屬性)
A 原子性 :一個事務是不可再分割的整體,要麼都執行要麼都不執行
C 一致性:一個事務可以使數據從- -個- -致狀態切換到另外-一個- 致的狀態
I 隔離性:一個事務不受其他事務的干擾,多個事務互相隔離的
D持久性:一個事務- -旦提交了,則永久的持久化到本地
三、事務的使用步驟★
首先說一下,事務一共有兩種:
一種是隱式事務,該事務沒有明顯的開啓和結束的標記,比如:insert、update、delete語句都是;
一種是顯示事務,該事務具有明顯的開啓和結束的標記,但有個前提:必須先將系統的自動提交功能關閉(即 set autocommit=0 將其關閉)
注:這裏關閉自動提交功能並不是永久關閉,只對當前會話有效,下次開啓時需要重新
使用顯式事務:
第一步:開啓事務
set autocommit=0;
start tr ansaction; #可以省略
第二步:編寫一組邏輯sql語句
注意: sq1語句支持的是insert、update、 delete
設置回滾點:
savepoint回滾點
第三步:結束事務
提交: comunit;
回滾: rollback;
回滾到指定的地方:rollback to 回滾點名;
四、事務的併發問題
1、事務的併發問題產生的原因
對於同時運行的多個事務,當這些事務訪問數據庫中相同的數據時,如果沒有采取必要的隔離機制,就會導致各種併發問題:
2、併發問題有哪些:
髒讀: 對於兩個事務T1, T2, T1讀取了已經被T2更新但還沒有被提交的字段.
.之後,若T2回滾,T1讀取的內容就是臨時且無效的.
不可重複讀: 對於兩個事務T1, T2,T1讀取了一個字段,然後T2更新了該字段.
之後,T1再次讀取同一個字段,值就不同了.
幻讀: 對於兩個事務T1, T2,T1從一個表中讀取了一個字段,然後T2在該表中插
入了一-些新的行.之後,如果T1再次讀取同一個表,就會多出幾行.
3、如何解決事務的併發問題
可以通過設置隔離級別來解決併發問題
4、4種隔離級別
隔離級別 | 描述 |
---|---|
READ UNCOMMITTED(讀未提交數據) | 允許事務讀取未被其他事物提交的變更.髒讀,不可重複讀和幻讀的問題都會出現 |
READ COMMITED(讀已提交數據) | 只允許事務讀取已經被其它事務提交的變更.可以避免髒讀.但不可重複和幻讀問題仍然可能出現 |
REPEATABLE READ(可重複讀) | 確保事務可以多次從一個字段中讀取相同的值.在這個事務持續期問,禁止其他事物對這個字段進行更新.可以避免髒讀和不可重複讀.但幻讀的問題仍然存在 |
SERIALIZABLE(串行化) | 確保事務可以從一個表中讀取相同的行. 在這個事務持續期間,禁止其他事務對該表執行插入,更新和刪除操作所有併發問題都可以避免,但性能十分低下. |
Oracle支持的2種事務隔離級別: READ COMMITED、SERIALIZABLE。
Oracle 默認的事務隔離級別爲: READ COMMITED
Mysql支持4種事務隔離級別.Mysql默認的事務隔離級別爲: REPEATABLE READ
每啓動一個mysql程序,就會獲得一個單獨的數據庫連接.每.個數據庫連接都有一個全局變量 @@transaction_isolation ,表示當前的事務隔離級別.
查看當前的隔離級別: SELECT @@transaction_isolation;
設置當前mySQL連接的隔離級別:
set transaction isolation level read committed;
設置數據庫系統的全局的隔離級別:.
set global transaction isolation level read committed;
六、視圖
一、含義
mysql5.1版本出現的新特性,本身是一個虛擬表,它的數據來自於表,通過執行時動態生成。
好處:
1、簡化sql 語句
2、提高了sql 的重用性
3、保護基表的數據,提高了安全性
二、創建視圖
語法: create view 視圖名稱
AS
sql查詢語句 ;
三、修改視圖的兩種方式
方式一
語法: create or replace view 視圖名
AS
sql查詢語句
方式二
語法: alter view 視圖名
AS
sql查詢語句
四、刪除視圖
語法: drop view 視圖名,視圖名,…
注意:你必須要有刪除權限才能夠執行刪除,當然該刪除語句既可以只刪除一個視圖,也可以同時刪除多個視圖
五、查看視圖
方式一:
desc 視圖名;
方式二:
SHOW CREATE VIEW 視圖名;
六、視圖的更新
1、插入 insert
2、修改 update
3、刪除 delete
4、查看 select
但是
並不是所有的視圖都是可更新的,視圖是否可更新和視圖查詢的定義有關係,以下類型的視圖都是不可更新的:
1、包含以下關鍵字的SQL語句:
聚合函數(SUM、 MIN、MAX、COUNT等)、 DISTINCT、 GROUP BY、HAVING、UNION或UNION ALL
2、常量視圖
3、select中包含子查詢
4、JOIN(即連接查詢)
5、 FROM一個不能更新的視圖
6、WHERE子句的子查詢引用了FROM子句中的表
7、使用了臨時表
七、變量
一、系統變量
說明: 變量由系統提供的,不用自定義
語法:
①查看系統變量
show 【global / session 】variables like “ ”;如果沒有顯式聲明 global 還是 session,則默認是session會話變量。
②查看指定的系統變量的值
select @@【global / session .】 變量名;如果沒有顯式聲明 global 還是 session,則默認是session會話變量
③爲系統變量賦值
方式一:
set 【global / session 】變量名=值 ;如果沒有顯式聲明global還是session,則默認是session
方式二:
set @@global. 變量名=值;
set @@變量名=值;
1、全局變量
服務器層面上的,必須擁有super權限才能爲系統變量賦值,作用域爲整個服務器,也就是針對於所有連接(會話)有效。
2、會話變量
服務器爲每一個連接 的客戶端都提供了系統變量,作用域爲當前的連接(會話)
二、自定義變量
1、用戶變量
作用域: 針對於當前連接(會話)生效
位置: begin end裏面,也可以放在外面
使用步驟:
聲明
賦值
使用(查看、比較、運算)
第一步: 聲明並初始化(三種方式)
方式一:
SET @用戶變量名=值;
方式二:
SET @用戶變量名:=值;
方式三:
SELECT @用戶變量名:=值;
注意: 如果用set 則兩種寫法都可以;但是如果用selet 則等號前面必須加上冒號
第二步: 賦值(更新用戶變量的值)兩種方式
方式一:通過set或select
SET @用戶變量名=值;
SET @用戶變量名:=值;
SELECT @用戶變量名:=值;
方式二:通過 SELECT INTO
SELECT 字段 INTO 變量名
FROM 表;
第三步: 使用(查看用戶變量的值)
語法: SELECT @用戶變量名;
2、局部變量
作用域: 僅僅在定義它的begin end中有效
位置: 只能放在begin end中,而且只能放在第一句
使用: 三步走
第一步: 聲明
語法: DECLARE 變量名 類型;
DECLARE 變量名 類型 DEFAULT 值;(如果要初始化就這麼寫)
注意: 當然這裏初始化的值要和前面設置的類型一致
第二步: 賦值
語法:
方式一:通過set或select
SET 局部變量名=值;
SET 局部變量名:=值;
SELECT @局部變量名:=值;
方式二:通過 SELECT INTO
SELECT 字段 INTO 局部變量名
FROM 表;
第三步: 使用
語法: SELECT 局部變量名;
八、存儲過程和函數
說明: 都類似於java中的方法,將-組完成特定功能的邏輯語句包裝起來, 對外暴露名字
好處:
1、提高重用性
2、sql 語句簡單
3、減少了和數據庫服務器連接的次數,提高了效率;
(一)存儲過程
一、創建★
創建語法:
CREATE PROCEDURE 存儲過程名(參數列表)
BEGIN
存儲過程體(一組合法有效的sql語句)
END
參數列表一共包括三個部分:參數模式、參數名、參數類型
IN 該參數可以作爲輸入,也就是該參數需要調用方傳入值
OUT 該參數可以作爲輸出值,也就是該參數可以作爲返回值
INOUT 該參數既可以作爲輸入又可以作爲輸出,也就是該參數既需要傳入值,又可以返回值。
注意: 如果存儲過程體僅僅只有一句話,那麼 BEGIN END 可以省略,並且
存儲過程體中的每條 SQL 語句的結尾要求必須加分號。
而這時我們存儲過程的結尾就需要自己來設置
二、調用
語法: call 存儲過程名(實參列表);
舉例:
調用in模式的參數: call 存儲過程名(‘值’) ;
調用out模式的參數: set @name;
call 存儲過程名 (@name) ;
select @name;
調用inout模式的參數: set @name=值;
call 存儲過程名 (@name);
call select @name;
這裏的@name 爲你自己寫的任意變量,你可以寫成其他的,並且我們可以省略前面的set步驟,直接call調用,並select打印
三、查看
語法:show create procedure 存儲過程名
四、刪除
語法:drop procedure 存儲過程名
(二)函數
一、創建★
語法: create function 函數名(參數列表) returns 返回類型
begin
函數體
end
解釋:
參數列表: 一共包含參數名和參數列表兩部分。
函數體: 是我們封裝的所有sql語句,在寫完函數體後,一定要寫上 return 語句 ,不然會報錯。
我們一般是在前面寫函數體,寫完之後在後面寫上return值
二、調用
語法: select 函數名(參數列表)
三、查看
語法: show create function 已創建的函數名稱;
四、刪除
語法: drop function 已創建的函數名。
九、流程控制結構
流程控制結構主要一共有三種:
順序結構: 程序從上往下依次執行
分支結構: 程序從兩條或多條路徑中選擇一條去執行
循環結構: 程序在滿足一定條件的基礎上,重複執行一段代碼
(一)分支結構
一、if函數
功能: 可以實現簡單的雙分支。
語法: IF(表達式1,表達式2,表達式3);
ps:一般和其他的語句如 select、等一起使用
解釋: 如果表達式1成立,則IF函數返回表達式2的值,否則返回表達式3的值
二、case結構
功能: 實現多分支
(1)case 函數的使用一: switch case 的效果類似於java中的switch語句,一般用於實現等值判斷。
語法: case 要判斷的字段或表達式
When 常量1 then 要顯示的值1或語句;
When 常量2 then 要顯示的值2或語句;
………
else 要顯示的值n或語句;
end case;
(2)、case函數的使用二: 類似於多重if。一般用於實現區間判斷
語法:case
When 條件1 then 要顯示的值1或語句1;
When 條件2 then 要顯示的值2或語句2;
……
else 要顯示的值n或語句n;
end case;
位置:
可以放在任何位置,
如果放在begin end外面,作爲表達式結合着其他語句使用
如果放在begin end裏面,-般作爲獨立的語句使用
三、if結構
功能: 可以實現多分支
語法: if 條件1 then 語句1;
elseif 條件2 then 語句2;
… …
【else 語句n】;
end if ;
位置: 只能放在begin end 中。
(二)循環結構
位置: 只能放在begin end 中。
特點: 都能實現循環結構
對比: .
①這三種循環都可以省略名稱,但如果循環中添加了循環控制語句( leave 或 iterate )則必須添加名稱
②
loop :一般用於實現簡單的死循環。
while:先判斷後執行。
repeat:先執行後判斷,無條件至少執行一-次。
一、while
語法:
【別名:】 while 循環條件 do
循環體;
end while 【別名】;
二、loop
語法:
【別名:】loop
循環體;
end loop 【別名】;
三、repeat
語法:
【別名:】 repeat
循環體;
until 結束循環的條件
end repeat 【別名】;
四、循環控制語句
iterate 類似於continue, 繼續,結束本次循環,繼續下一次。
leave 類似於 break,跳出,結束當前所在的循環。
**
不錯哦這麼長的總結你都能看到結尾,嘿嘿嘿,整個贊再走咋樣【滑稽】
**
當然如果有不清楚的地方,直接來 小文的mysql學習筆記目錄
**
Time will tell you the love for the simple things lasts long and the people loving you are the warmest.
---------------時光會告訴我們,簡單的喜歡最長遠,懂你的人最溫暖