小白終是踏上了這條不歸路-------- mysql基礎總結(終章)

**
小白終是踏上了這條不歸路----小文的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篩選條件

兩種方式的區別
  1. delete 後面可以添加where條件,而truncate不能加
  2. 當刪除整張表時,truncate刪除效率較高
  3. 假如要刪除的表中有自增長列,如果用delete刪除後,再插入數據,自增長列的值從斷點開始,而truncate刪除後,再插入數據,自 增日列的值從1開始.
  4. truncate刪除沒有返回值,delete刪除有返回值
  5. 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) 可以省略,如果是floatdouble則會根據插入的數值的位數來確定位數;
            如果是 DECIMAL M默認是10,D默認是0。
            定點型的精確度較高,如果要求插入數值的精度較高如貨幣運算等就考慮使用.

三、字符型

char、varchar、 binary、 varbinary、 enum、 set、text、blob 等。

較短的文本:charvarchar

類型 範圍 最多字符數
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、binaryvarbinary類型(用於保存較短的二進制)
說明: 類似於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 保存日期+時間(受時區影響)

Timestampdatetime區別:
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語句支持的是insertupdatedelete
設置回滾點:
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 COMMITEDSERIALIZABLE
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 則等號前面必須加上冒號

第二步: 賦值(更新用戶變量的值)兩種方式

	方式一:通過setselect	
		SET  @用戶變量名=;
		SET  @用戶變量名:=;
		SELECT  @用戶變量名:=;
	方式二:通過 SELECT INTO
		SELECT  字段  INTO  變量名
		FROM;

第三步: 使用(查看用戶變量的值)

語法:  SELECT @用戶變量名;

2、局部變量

作用域: 僅僅在定義它的begin end中有效
位置: 只能放在begin end中,而且只能放在第一句

使用: 三步走
第一步: 聲明

語法:	DECLARE 變量名 類型;
		DECLARE 變量名 類型 DEFAULT;(如果要初始化就這麼寫)

注意: 當然這裏初始化的值要和前面設置的類型一致

第二步: 賦值

語法:
	方式一:通過setselect	
		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 中。

特點: 都能實現循環結構

對比: .
①這三種循環都可以省略名稱,但如果循環中添加了循環控制語句( leaveiterate )則必須添加名稱

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. ​​​​
                 ---------------時光會告訴我們,簡單的喜歡最長遠,懂你的人最溫暖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章