天天看點

JavaWeb

Junit單元測試

       測試分類

              1. 黑盒測試:不需要寫代碼,給輸入值,看程式是否能夠輸出期望的值。

              2. 白盒測試:需要寫代碼的。關注程式具體的執行流程。

       Junit使用:白盒測試

              * 步驟:

                     1. 定義一個測試類(測試用例)

                            * 建議:

                                   * 測試類名:被測試的類名Test       CalculatorTest

                                   * 包名:xxx.xxx.xx.test        cn.itcast.test

                     2. 定義測試方法:可以獨立運作

                                   * 方法名:test測試的方法名           testAdd() 

                                   * 傳回值:void

                                   * 參數清單:空參

                     3. 給方法加@Test

                     4. 導入junit依賴環境

              * 判定結果:

                     * 紅色:失敗

                     * 綠色:成功

                     * 一般我們會使用斷言操作來處理結果

                            * Assert.assertEquals(期望的結果,運算的結果);

              * 補充:

                     * @Before:

                            * 修飾的方法會在測試方法之前被自動執行

                     * @After:

                            * 修飾的方法會在測試方法執行之後自動被執行

 反射:架構設計的靈魂

       * 架構:半成品軟體。可以在架構的基礎上進行軟體開發,簡化編碼

       * 反射:将類的各個組成部分封裝為其他對象,這就是反射機制

              * 好處:

                     1. 可以在程式運作過程中,操作這些對象。

                     2. 可以解耦,提高程式的可擴充性。

       * 擷取Class對象的方式:

              1. Class.forName("全類名"):将位元組碼檔案加載進記憶體,傳回Class對象

                     * 多用于配置檔案,将類名定義在配置檔案中。讀取檔案,加載類

              2. 類名.class:通過類名的屬性class擷取

                     * 多用于參數的傳遞

              3. 對象.getClass():getClass()方法在Object類中定義着。

                     * 多用于對象的擷取位元組碼的方式

              * 結論:

                     同一個位元組碼檔案(*.class)在一次程式運作過程中,隻會被加載一次,不論通過哪一種方式擷取的Class對象都是同一個。

       * Class對象功能:

              * 擷取功能:               

JavaWeb
JavaWeb
1 Field[] getFields() :擷取所有public修飾的成員變量
2 
3 Field getField(String name)   擷取指定名稱的 public修飾的成員變量
4 
5  Field[] getDeclaredFields()  擷取所有的成員變量,不考慮修飾符
6 
7 Field getDeclaredField(String name)       

1.擷取成員變量們                       

JavaWeb
JavaWeb
1 Constructor<?>[] getConstructors() 
2 
3 Constructor<T> getConstructor(類<?>... parameterTypes) 
4 
5 Constructor<T> getDeclaredConstructor(類<?>... parameterTypes) 
6 
7 Constructor<?>[] getDeclaredConstructors()       

2.擷取構造方法們                  

JavaWeb
JavaWeb
1 Method[] getMethods() 
2 
3 Method getMethod(String name, 類<?>... parameterTypes) 
4 
5 Method[] getDeclaredMethods() 
6 
7 Method getDeclaredMethod(String name, 類<?>... parameterTypes) 
8 
9        

3.擷取成員方法們

JavaWeb
JavaWeb
1  String getName()       

4.擷取全類名

       * Field:成員變量

              * 操作:

                     1. 設定值

                            * void set(Object obj, Object value) 

                     2. 擷取值

                            * get(Object obj)

                     3. 忽略通路權限修飾符的安全檢查

                            * setAccessible(true):暴力反射

       * Constructor:構造方法

              * 建立對象:

                     * T newInstance(Object... initargs) 

                     * 如果使用空參數構造方法建立對象,操作可以簡化:Class對象的newInstance方法

       * Method:方法對象

              * 執行方法:

                     * Object invoke(Object obj, Object... args) 

              * 擷取方法名稱:

                     * String getName:擷取方法名  

JavaWeb
JavaWeb
1 * 需求:寫一個"架構",不能改變該類的任何代碼的前提下,可以幫我們建立任意類的對象,并且執行其中任意方法
 2 
 3                      * 實作:
 4 
 5                             1. 配置檔案
 6 
 7                             2. 反射
 8 
 9                      * 步驟:
10 
11                             1. 将需要建立的對象的全類名和需要執行的方法定義在配置檔案中
12 
13                             2. 在程式中加載讀取配置檔案
14 
15                             3. 使用反射技術來加載類檔案進記憶體
16 
17                             4. 建立對象
18 
19                             5. 執行方法      

案例

注解:

       * 概念:說明程式的。給計算機看的

       * 注釋:用文字描述程式的。給程式員看的

       * 定義:注解(Annotation),也叫中繼資料。一種代碼級别的說明。它是JDK1.5及以後版本引入的一個特性,與類、接口、枚舉是在同一個層次。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,注釋。

       * 概念描述:

              * JDK1.5之後的新特性

              * 說明程式的

              * 使用注解:@注解名稱

       * 作用分類:

              ①編寫文檔:通過代碼裡辨別的注解生成文檔【生成文檔doc文檔】

              ②代碼分析:通過代碼裡辨別的注解對代碼進行分析【使用反射】

              ③編譯檢查:通過代碼裡辨別的注解讓編譯器能夠實作基本的編譯檢查【Override】

       * JDK中預定義的一些注解

              * @Override  :檢測被該注解标注的方法是否是繼承自父類(接口)的

              * @Deprecated:該注解标注的内容,表示已過時

              * @SuppressWarnings:壓制警告

                     * 一般傳遞參數all  @SuppressWarnings("all")

       * 自定義注解  

JavaWeb
JavaWeb
1 元注解
2 
3 public @interface 注解名稱{
4 
5        屬性清單;
6 
7 }      

格式

              * 本質:注解本質上就是一個接口,該接口預設繼承Annotation接口

                     * public interface MyAnno extends java.lang.annotation.Annotation {}

              * 屬性:接口中的抽象方法

                     * 要求:

                            1. 屬性的傳回值類型有下列取值

                                   * 基本資料類型

                                   * String

                                   * 枚舉

                                   * 注解

                                   * 以上類型的數組

                            2. 定義了屬性,在使用時需要給屬性指派

                                   1. 如果定義屬性時,使用default關鍵字給屬性預設初始化值,則使用注解時,可以不進行屬性的指派。

                                   2. 如果隻有一個屬性需要指派,并且屬性的名稱是value,則value可以省略,直接定義值即可。

                                   3. 數組指派時,值使用{}包裹。如果數組中隻有一個值,則{}可以省略

              * 元注解:用于描述注解的注解

                     * @Target:描述注解能夠作用的位置

                            * ElementType取值:

                                   * TYPE:可以作用于類上

                                   * METHOD:可以作用于方法上

                                   * FIELD:可以作用于成員變量上

                     * @Retention:描述注解被保留的階段

                            * @Retention(RetentionPolicy.RUNTIME):目前被描述的注解,會保留到class位元組碼檔案中,并被JVM讀取到

                     * @Documented:描述注解是否被抽取到api文檔中

                     * @Inherited:描述注解是否被子類繼承

       * 在程式使用(解析)注解:擷取注解中定義的屬性值

              1. 擷取注解定義的位置的對象  (Class,Method,Field)

              2. 擷取指定的注解

                     * getAnnotation(Class)

                     //其實就是在記憶體中生成了一個該注解接口的子類實作對象

JavaWeb
JavaWeb
1 public class ProImpl implements Pro{
 2 
 3                               public String className(){
 4 
 5                                   return "cn.itcast.annotation.Demo1";
 6 
 7                               }
 8 
 9                               public String methodName(){
10 
11                                   return "show";
12 
13                               }
14 
15                           }      

View Code

              3. 調用注解中的抽象方法擷取配置的屬性值

資料庫的基本概念

       1. 資料庫的英文單詞: DataBase 簡稱 : DB

       2. 什麼資料庫?

              * 用于存儲和管理資料的倉庫。

       3. 資料庫的特點:

              1. 持久化存儲資料的。其實資料庫就是一個檔案系統

              2. 友善存儲和管理資料

              3. 使用了統一的方式操作資料庫 -- SQL

MySQL資料庫軟體

       1. 安裝

              * 參見《MySQL基礎.pdf》

       2. 解除安裝

              1. 去mysql的安裝目錄找到my.ini檔案

                     * 複制 datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"

              2. 解除安裝MySQL

              3. 删除C:/ProgramData目錄下的MySQL檔案夾。

       3. 配置

              * MySQL服務啟動

                     1. 手動。

                     2. cmd--> services.msc 打開服務的視窗

                     3. 使用管理者打開cmd

                            * net start mysql : 啟動mysql的服務

                            * net stop mysql:關閉mysql服務

              * MySQL登入

                     1. mysql -uroot -p密碼

                     2. mysql -hip -uroot -p連接配接目标的密碼

                     3. mysql --host=ip --user=root --password=連接配接目标的密碼

              * MySQL退出

                     1. exit

                     2. quit

              * MySQL目錄結構

                     1. MySQL安裝目錄:basedir="D:/develop/MySQL/"

                            * 配置檔案 my.ini

                     2. MySQL資料目錄:datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"

                            * 幾個概念

                                   * 資料庫:檔案夾

                                   * 表:檔案

                                   * 資料:資料

SQL

       1.什麼是SQL?

              Structured Query Language:結構化查詢語言

              其實就是定義了操作所有關系型資料庫的規則。每一種資料庫操作的方式存在不一樣的地方,稱為“方言”。

       2.SQL通用文法

              1. SQL 語句可以單行或多行書寫,以分号結尾。

              2. 可使用空格和縮進來增強語句的可讀性。

              3. MySQL 資料庫的 SQL 語句不區分大小寫,關鍵字建議使用大寫。

              4. 3 種注釋

                     * 單行注釋: -- 注釋内容 或 # 注釋内容(mysql 特有)

                     * 多行注釋: /* 注釋 */

       3. SQL分類

              1) DDL(Data Definition Language)資料定義語言

                     用來定義資料庫對象:資料庫,表,列等。關鍵字:create, drop,alter 等

              2) DML(Data Manipulation Language)資料操作語言

                     用來對資料庫中表的資料進行增删改。關鍵字:insert, delete, update 等

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

                     用來查詢資料庫中表的記錄(資料)。關鍵字:select, where 等

              4) DCL(Data Control Language)資料控制語言(了解)

                     用來定義資料庫的通路權限和安全級别,及建立使用者。關鍵字:GRANT, REVOKE 等

 DDL:操作資料庫、表

       1. 操作資料庫:CRUD

              1. C(Create):建立

                     * 建立資料庫:

                            * create database 資料庫名稱;

                     * 建立資料庫,判斷不存在,再建立:

                            * create database if not exists 資料庫名稱;

                     * 建立資料庫,并指定字元集

                            * create database 資料庫名稱 character set 字元集名;

                     * 練習: 建立db4資料庫,判斷是否存在,并制定字元集為gbk

                            * create database if not exists db4 character set gbk;

              2. R(Retrieve):查詢

                     * 查詢所有資料庫的名稱:

                            * show databases;

                     * 查詢某個資料庫的字元集:查詢某個資料庫的建立語句

                            * show create database 資料庫名稱;

              3. U(Update):修改

                     * 修改資料庫的字元集

                            * alter database 資料庫名稱 character set 字元集名稱;

              4. D(Delete):删除

                     * 删除資料庫

                            * drop database 資料庫名稱;

                     * 判斷資料庫存在,存在再删除

                            * drop database if exists 資料庫名稱;

              5. 使用資料庫

                     * 查詢目前正在使用的資料庫名稱

                            * select database();

                     * 使用資料庫

                            * use 資料庫名稱;

       2. 操作表

                     1. 文法:

                            create table 表名(

                                   列名1 資料類型1,

                                   列名2 資料類型2,

                                   ....

                                   列名n 資料類型n

                            );

                            * 注意:最後一列,不需要加逗号(,)

                            * 資料庫類型:

                                   1. int:整數類型

                                          * age int,

                                   2. double:小數類型

                                          * score double(5,2)

                                   3. date:日期,隻包含年月日,yyyy-MM-dd

                                   4. datetime:日期,包含年月日時分秒      yyyy-MM-dd HH:mm:ss

                                   5. timestamp:時間錯類型    包含年月日時分秒      yyyy-MM-dd HH:mm:ss    

                                          * 如果将來不給這個字段指派,或指派為null,則預設使用目前的系統時間,來自動指派

                                   6. varchar:字元串

                                          * name varchar(20):姓名最大20個字元

                                          * zhangsan 8個字元  張三 2個字元

                     * 建立表

                            create table student(

                                   id int,

                                   name varchar(32),

                                   age int ,

                                   score double(4,1),

                                   birthday date,

                                   insert_time timestamp

                     * 複制表:

                            * create table 表名 like 被複制的表名;       

                     * 查詢某個資料庫中所有的表名稱

                            * show tables;

                     * 查詢表結構

                            * desc 表名;

                     1. 修改表名

                            alter table 表名 rename to 新的表名;

                     2. 修改表的字元集

                            alter table 表名 character set 字元集名稱;

                     3. 添加一列

                            alter table 表名 add 列名 資料類型;

                     4. 修改列名稱 類型

                            alter table 表名 change 列名 新列别 新資料類型;

                            alter table 表名 modify 列名 新資料類型;

                     5. 删除列

                            alter table 表名 drop 列名;

                     * drop table 表名;

                     * drop table  if exists 表名 ;

* 用戶端圖形化工具:SQLYog

  DML:增删改表中資料

       1. 添加資料:

              * 文法:

                     * insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);

              * 注意:

                     1. 列名和值要一一對應。

                     2. 如果表名後,不定義列名,則預設給所有列添加值

                            insert into 表名 values(值1,值2,...值n);

                     3. 除了數字類型,其他類型需要使用引号(單雙都可以)引起來

       2. 删除資料:

                     * delete from 表名 [where 條件]

                     1. 如果不加條件,則删除表中所有記錄。

                     2. 如果要删除所有記錄

                            1. delete from 表名; -- 不推薦使用。有多少條記錄就會執行多少次删除操作

                            2. TRUNCATE TABLE 表名; -- 推薦使用,效率更高 先删除表,然後再建立一張一樣的表。

       3. 修改資料:

                     * update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 條件];

                     1. 如果不加任何條件,則會将表中所有記錄全部修改。

 DQL:查詢表中的記錄

       * select * from 表名;

       1. 文法:

              select

                     字段清單

              from

                     表名清單

              where

                     條件清單

              group by

                     分組字段

              having

                     分組之後的條件

              order by

                     排序

              limit

                     分頁限定

       2. 基礎查詢

              1. 多個字段的查詢

                     select 字段名1,字段名2... from 表名;

                     * 注意:

                            * 如果查詢所有字段,則可以使用*來替代字段清單。

              2. 去除重複:

                     * distinct

              3. 計算列

                     * 一般可以使用四則運算計算一些列的值。(一般隻會進行數值型的計算)

                     * ifnull(表達式1,表達式2):null參與的運算,計算結果都為null

                            * 表達式1:哪個字段需要判斷是否為null

                            * 如果該字段為null後的替換值。

              4. 起别名:

                     * as:as也可以省略

       3. 條件查詢

              1. where子句後跟條件

              2. 運算符

                     * > 、< 、<= 、>= 、= 、<>

                     * BETWEEN...AND 

                     * IN( 集合)

                     * LIKE:模糊查詢

                            * 占位符:

                                   * _:單個任意字元

                                   * %:多個任意字元

                     * IS NULL 

                     * and  或 &&

                     * or  或 ||

                     * not  或 !       

JavaWeb
JavaWeb
1   -- 查詢年齡大于20歲
 2 
 3  
 4 
 5                             SELECT * FROM student WHERE age > 20;
 6 
 7                            
 8 
 9                             SELECT * FROM student WHERE age >= 20;
10 
11                            
12 
13                             -- 查詢年齡等于20歲
14 
15                             SELECT * FROM student WHERE age = 20;
16 
17                            
18 
19                             -- 查詢年齡不等于20歲
20 
21                             SELECT * FROM student WHERE age != 20;
22 
23                             SELECT * FROM student WHERE age <> 20;
24 
25                            
26 
27                             -- 查詢年齡大于等于20 小于等于30
28 
29                            
30 
31                             SELECT * FROM student WHERE age >= 20 &&  age <=30;
32 
33                             SELECT * FROM student WHERE age >= 20 AND  age <=30;
34 
35                             SELECT * FROM student WHERE age BETWEEN 20 AND 30;
36 
37                            
38 
39                             -- 查詢年齡22歲,18歲,25歲的資訊
40 
41                             SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25
42 
43                             SELECT * FROM student WHERE age IN (22,18,25);
44 
45                            
46 
47                             -- 查詢英語成績為null
48 
49                             SELECT * FROM student WHERE english = NULL; -- 不對的。null值不能使用 = (!=) 判斷
50 
51                            
52 
53                             SELECT * FROM student WHERE english IS NULL;
54 
55                            
56 
57                             -- 查詢英語成績不為null
58 
59                             SELECT * FROM student WHERE english  IS NOT NULL;
60 
61       
62 
63  
64 
65  
66 
67                             -- 查詢姓馬的有哪些? like
68 
69                             SELECT * FROM student WHERE NAME LIKE '馬%';
70 
71                             -- 查詢姓名第二個字是化的人
72 
73                            
74 
75                             SELECT * FROM student WHERE NAME LIKE "_化%";
76 
77                            
78 
79                             -- 查詢姓名是3個字的人
80 
81                             SELECT * FROM student WHERE NAME LIKE '___';
82 
83                            
84 
85                            
86 
87                             -- 查詢姓名中包含德的人
88 
89                             SELECT * FROM student WHERE NAME LIKE '%德%';      

DQL:查詢語句

       1. 排序查詢

              * 文法:order by 子句

                     * order by 排序字段1 排序方式1 ,  排序字段2 排序方式2...

              * 排序方式:

                     * ASC:升序,預設的。

                     * DESC:降序。

                     * 如果有多個排序條件,則目前邊的條件值一樣時,才會判斷第二條件。

       2. 聚合函數:将一列資料作為一個整體,進行縱向的計算。

              1. count:計算個數

                     1. 一般選擇非空的列:主鍵

                     2. count(*)

              2. max:計算最大值

              3. min:計算最小值

              4. sum:計算和

              5. avg:計算平均值

              * 注意:聚合函數的計算,排除null值。

                     解決方案:

                            1. 選擇不包含非空的列進行計算

                            2. IFNULL函數

       3. 分組查詢:

              1. 文法:group by 分組字段;

              2. 注意:

                     1. 分組之後查詢的字段:分組字段、聚合函數

                     2. where 和 having 的差別?

                            1. where 在分組之前進行限定,如果不滿足條件,則不參與分組。having在分組之後進行限定,如果不滿足結果,則不會被查詢出來

                            2. where 後不可以跟聚合函數,having可以進行聚合函數的判斷。

JavaWeb
JavaWeb
1 -- 按照性别分組。分别查詢男、女同學的平均分
 2 
 3  
 4 
 5                      SELECT sex , AVG(math) FROM student GROUP BY sex;
 6 
 7                     
 8 
 9                      -- 按照性别分組。分别查詢男、女同學的平均分,人數
10 
11                     
12 
13                      SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;
14 
15                     
16 
17                      --  按照性别分組。分别查詢男、女同學的平均分,人數 要求:分數低于70分的人,不參與分組
18 
19                      SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;
20 
21                     
22 
23                      --  按照性别分組。分别查詢男、女同學的平均分,人數 要求:分數低于70分的人,不參與分組,分組之後。人數要大于2個人
24 
25                      SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
26 
27                     
28 
29                      SELECT sex , AVG(math),COUNT(id) 人數 FROM student WHERE math > 70 GROUP BY sex HAVING 人數 > 2;      

View Code       

       4. 分頁查詢

              1. 文法:limit 開始的索引,每頁查詢的條數;

              2. 公式:開始的索引 = (目前的頁碼 - 1) * 每頁顯示的條數

JavaWeb
JavaWeb
1  -- 每頁顯示3條記錄
 2 
 3  
 4 
 5                      SELECT * FROM student LIMIT 0,3; -- 第1頁
 6 
 7                     
 8 
 9                      SELECT * FROM student LIMIT 3,3; -- 第2頁
10 
11                     
12 
13                      SELECT * FROM student LIMIT 6,3; -- 第3頁      

              3. limit 是一個MySQL"方言"

限制

       * 概念: 對表中的資料進行限定,保證資料的正确性、有效性和完整性。    

       * 分類:

              1. 主鍵限制:primary key

              2. 非空限制:not null

              3. 唯一限制:unique

              4. 外鍵限制:foreign key

       * 非空限制:not null,某一列的值不能為null

              1. 建立表時添加限制

                     CREATE TABLE stu(

                            id INT,

                            NAME VARCHAR(20) NOT NULL -- name為非空

                     );

              2. 建立表完後,添加非空限制

                     ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

              3. 删除name的非空限制

                     ALTER TABLE stu MODIFY NAME VARCHAR(20);

       * 唯一限制:unique,某一列的值不能重複

              1. 注意:

                     * 唯一限制可以有NULL值,但是隻能有一條記錄為null

              2. 在建立表時,添加唯一限制

                            phone_number VARCHAR(20) UNIQUE -- 手機号

              3. 删除唯一限制

                     ALTER TABLE stu DROP INDEX phone_number;

              4. 在表建立完後,添加唯一限制

                     ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

       * 主鍵限制:primary key。

                     1. 含義:非空且唯一

                     2. 一張表隻能有一個字段為主鍵

                     3. 主鍵就是表中記錄的唯一辨別

              2. 在建立表時,添加主鍵限制

                     create table stu(

                            id int primary key,-- 給id添加主鍵限制

                            name varchar(20)

              3. 删除主鍵

                     -- 錯誤 alter table stu modify id int ;

                     ALTER TABLE stu DROP PRIMARY KEY;

              4. 建立完表後,添加主鍵

                     ALTER TABLE stu MODIFY id INT PRIMARY KEY;

              5. 自動增長:

                     1.  概念:如果某一列是數值類型的,使用 auto_increment 可以來完成值得自動增長

                     2. 在建立表時,添加主鍵限制,并且完成主鍵自增長

                            id int primary key auto_increment,-- 給id添加主鍵限制

                     3. 删除自動增長

                     ALTER TABLE stu MODIFY id INT;

                     4. 添加自動增長

                     ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

       * 外鍵限制:foreign key,讓表于表産生關系,進而保證資料的正确性。

              1. 在建立表時,可以添加外鍵

                     * 文法:

                                   外鍵列

                                   constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表列名稱)

              2. 删除外鍵

                     ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;

              3. 建立表之後,添加外鍵

                     ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱);

              4. 級聯操作

                     1. 添加級聯操作

                            文法:ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱

                                          FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱) ON UPDATE CASCADE ON DELETE CASCADE  ;

                     2. 分類:

                            1. 級聯更新:ON UPDATE CASCADE

                            2. 級聯删除:ON DELETE CASCADE

資料庫的設計

       1. 多表之間的關系

              1. 分類:

                     1. 一對一(了解):

                            * 如:人和身份證

                            * 分析:一個人隻有一個身份證,一個身份證隻能對應一個人

                     2. 一對多(多對一):

                            * 如:部門和員工

                            * 分析:一個部門有多個員工,一個員工隻能對應一個部門

                     3. 多對多:

                            * 如:學生和課程

                            * 分析:一個學生可以選擇很多門課程,一個課程也可以被很多學生選擇

              2. 實作關系:

                     1. 一對多(多對一):

                            * 實作方式:在多的一方建立外鍵,指向一的一方的主鍵。

                     2. 多對多:

                            * 實作方式:多對多關系實作需要借助第三張中間表。中間表至少包含兩個字段,這兩個字段作為第三張表的外鍵,分别指向兩張表的主鍵

                     3. 一對一(了解):

                            * 實作方式:一對一關系實作,可以在任意一方添加唯一外鍵指向另一方的主鍵。

              3. 案例

JavaWeb
JavaWeb
1                      -- 建立旅遊線路分類表 tab_category
  2 
  3                      -- cid 旅遊線路分類主鍵,自動增長
  4 
  5                      -- cname 旅遊線路分類名稱非空,唯一,字元串 100
  6 
  7                      CREATE TABLE tab_category (
  8 
  9                             cid INT PRIMARY KEY AUTO_INCREMENT,
 10 
 11                             cname VARCHAR(100) NOT NULL UNIQUE
 12 
 13                      );
 14 
 15                     
 16 
 17                      -- 建立旅遊線路表 tab_route
 18 
 19                      /*
 20 
 21                      rid 旅遊線路主鍵,自動增長
 22 
 23                      rname 旅遊線路名稱非空,唯一,字元串 100
 24 
 25                      price 價格
 26 
 27                      rdate 上架時間,日期類型
 28 
 29                      cid 外鍵,所屬分類
 30 
 31                      */
 32 
 33                      CREATE TABLE tab_route(
 34 
 35                             rid INT PRIMARY KEY AUTO_INCREMENT,
 36 
 37                             rname VARCHAR(100) NOT NULL UNIQUE,
 38 
 39                             price DOUBLE,
 40 
 41                             rdate DATE,
 42 
 43                             cid INT,
 44 
 45                             FOREIGN KEY (cid) REFERENCES tab_category(cid)
 46 
 47                      );
 48 
 49                     
 50 
 51                      /*建立使用者表 tab_user
 52 
 53                      uid 使用者主鍵,自增長
 54 
 55                      username 使用者名長度 100,唯一,非空
 56 
 57                      password 密碼長度 30,非空
 58 
 59                      name 真實姓名長度 100
 60 
 61                      birthday 生日
 62 
 63                      sex 性别,定長字元串 1
 64 
 65                      telephone 手機号,字元串 11
 66 
 67                      email 郵箱,字元串長度 100
 68 
 69                      */
 70 
 71                      CREATE TABLE tab_user (
 72 
 73                             uid INT PRIMARY KEY AUTO_INCREMENT,
 74 
 75                             username VARCHAR(100) UNIQUE NOT NULL,
 76 
 77                             PASSWORD VARCHAR(30) NOT NULL,
 78 
 79                             NAME VARCHAR(100),
 80 
 81                             birthday DATE,
 82 
 83                             sex CHAR(1) DEFAULT '男',
 84 
 85                             telephone VARCHAR(11),
 86 
 87                             email VARCHAR(100)
 88 
 89                      );
 90 
 91                     
 92 
 93                      /*
 94 
 95                      建立收藏表 tab_favorite
 96 
 97                      rid 旅遊線路 id,外鍵
 98 
 99                      date 收藏時間
100 
101                      uid 使用者 id,外鍵
102 
103                      rid 和 uid 不能重複,設定複合主鍵,同一個使用者不能收藏同一個線路兩次
104 
105                      */
106 
107                      CREATE TABLE tab_favorite (
108 
109                             rid INT, -- 線路id
110 
111                             DATE DATETIME,
112 
113                             uid INT, -- 使用者id
114 
115                             -- 建立複合主鍵
116 
117                             PRIMARY KEY(rid,uid), -- 聯合主鍵
118 
119                             FOREIGN KEY (rid) REFERENCES tab_route(rid),
120 
121                             FOREIGN KEY(uid) REFERENCES tab_user(uid)
122 
123                      );      

       2. 資料庫設計的範式

              * 概念:設計資料庫時,需要遵循的一些規範。要遵循後邊的範式要求,必須先遵循前邊的所有範式要求

                     設計關系資料庫時,遵從不同的規範要求,設計出合理的關系型資料庫,這些不同的規範要求被稱為不同的範式,各種範式呈遞次規範,越高的範式資料庫備援越小。

                     目前關系資料庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。

              * 分類:

                     1. 第一範式(1NF):每一列都是不可分割的原子資料項

                     2. 第二範式(2NF):在1NF的基礎上,非碼屬性必須完全依賴于碼(在1NF基礎上消除非主屬性對主碼的部分函數依賴)

                            * 幾個概念:

                                   1. 函數依賴:A-->B,如果通過A屬性(屬性組)的值,可以确定唯一B屬性的值。則稱B依賴于A

                                          例如:學号-->姓名。  (學号,課程名稱) --> 分數

                                   2. 完全函數依賴:A-->B, 如果A是一個屬性組,則B屬性值得确定需要依賴于A屬性組中所有的屬性值。

                                          例如:(學号,課程名稱) --> 分數

                                   3. 部分函數依賴:A-->B, 如果A是一個屬性組,則B屬性值得确定隻需要依賴于A屬性組中某一些值即可。

                                          例如:(學号,課程名稱) -- > 姓名

                                   4. 傳遞函數依賴:A-->B, B -- >C . 如果通過A屬性(屬性組)的值,可以确定唯一B屬性的值,在通過B屬性(屬性組)的值可以确定唯一C屬性的值,則稱 C 傳遞函數依賴于A

                                          例如:學号-->系名,系名-->系主任

                                   5. 碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性組)為該表的碼

                                          例如:該表中碼為:(學号,課程名稱)

                                          * 主屬性:碼屬性組中的所有屬性

                                          * 非主屬性:除過碼屬性組的屬性

                     3. 第三範式(3NF):在2NF基礎上,任何非主屬性不依賴于其它非主屬性(在2NF基礎上消除傳遞依賴)

  資料庫的備份和還原

       1. 指令行:

                     * 備份: mysqldump -u使用者名 -p密碼 資料庫名稱 > 儲存的路徑

                     * 還原:

                            1. 登入資料庫

                            2. 建立資料庫

                            3. 使用資料庫

                            4. 執行檔案。source 檔案路徑 

多表查詢:

       * 查詢文法:

                     列名清單

              where....

       * 準備sql

JavaWeb
JavaWeb
1               # 建立部門表
 2 
 3               CREATE TABLE dept(
 4 
 5                      id INT PRIMARY KEY AUTO_INCREMENT,
 6 
 7                      NAME VARCHAR(20)
 8 
 9               );
10 
11               INSERT INTO dept (NAME) VALUES ('開發部'),('市場部'),('财務部');
12 
13               # 建立員工表
14 
15               CREATE TABLE emp (
16 
17                      id INT PRIMARY KEY AUTO_INCREMENT,
18 
19                      NAME VARCHAR(10),
20 
21                      gender CHAR(1), -- 性别
22 
23                      salary DOUBLE, -- 工資
24 
25                      join_date DATE, -- 入職日期
26 
27                      dept_id INT,
28 
29                      FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外鍵,關聯部門表(部門表的主鍵)
30 
31               );
32 
33               INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孫悟空','男',7200,'2013-02-24',1);
34 
35               INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('豬八戒','男',3600,'2010-12-02',2);
36 
37               INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
38 
39               INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
40 
41               INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);      

       * 笛卡爾積:

              * 有兩個集合A,B .取這兩個集合的所有組成情況。

              * 要完成多表查詢,需要消除無用的資料

       * 多表查詢的分類:

              1. 内連接配接查詢:

                     1. 隐式内連接配接:使用where條件消除無用資料

                            * 例子:

                            -- 查詢所有員工資訊和對應的部門資訊

                            SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;

                            -- 查詢員工表的名稱,性别。部門表的名稱

                            SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`;

                            SELECT

                                   t1.name, -- 員工表的姓名

                                   t1.gender,-- 員工表的性别

                                   t2.name -- 部門表的名稱

                            FROM

                                   emp t1,

                                   dept t2

                            WHERE

                                   t1.`dept_id` = t2.`id`;

                     2. 顯式内連接配接:

                            * 文法: select 字段清單 from 表名1 [inner] join 表名2 on 條件

                            * 例如:

                                   * SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;      

                                   * SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;  

                     3. 内連接配接查詢:

                            1. 從哪些表中查詢資料

                            2. 條件是什麼

                            3. 查詢哪些字段

              2. 外連結查詢:

                     1. 左外連接配接:

                            * 文法:select 字段清單 from 表1 left [outer] join 表2 on 條件;

                            * 查詢的是左表所有資料以及其交集部分。

                                   -- 查詢所有員工資訊,如果員工有部門,則查詢部門名稱,沒有部門,則不顯示部門名稱

                                   SELECT t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;

                     2. 右外連接配接:

                            * 文法:select 字段清單 from 表1 right [outer] join 表2 on 條件;

                            * 查詢的是右表所有資料以及其交集部分。

                                   SELECT * FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;

              3. 子查詢:

                     * 概念:查詢中嵌套查詢,稱嵌套查詢為子查詢。

                            -- 查詢工資最高的員工資訊

                            -- 1 查詢最高的工資是多少 9000

                            SELECT MAX(salary) FROM emp;

                            -- 2 查詢員工資訊,并且工資等于9000的

                            SELECT * FROM emp WHERE emp.`salary` = 9000;

                            -- 一條sql就完成這個操作。子查詢

                            SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);

                     * 子查詢不同情況

                            1. 子查詢的結果是單行單列的:

                                   * 子查詢可以作為條件,使用運算符去判斷。 運算符: > >= < <= =

                                   *

                                   -- 查詢員工工資小于平均工資的人

                                   SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);

                            2. 子查詢的結果是多行單列的:

                                   * 子查詢可以作為條件,使用運算符in來判斷

                                   -- 查詢'财務部'和'市場部'所有的員工資訊

                                   SELECT id FROM dept WHERE NAME = '财務部' OR NAME = '市場部';

                                   SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2;

                                   -- 子查詢

                                   SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '财務部' OR NAME = '市場部');

                            3. 子查詢的結果是多行多列的:

                                   * 子查詢可以作為一張虛拟表參與查詢

                                   -- 查詢員工入職日期是2011-11-11日之後的員工資訊和部門資訊

                                   SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2

                                   WHERE t1.id = t2.dept_id;

                                   -- 普通内連接配接

                                   SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` >  '2011-11-11'

JavaWeb
JavaWeb
1  
  2 
  3                             -- 部門表
  4 
  5                             CREATE TABLE dept (
  6 
  7                               id INT PRIMARY KEY PRIMARY KEY, -- 部門id
  8 
  9                               dname VARCHAR(50), -- 部門名稱
 10 
 11                               loc VARCHAR(50) -- 部門所在地
 12 
 13                             );
 14 
 15                            
 16 
 17                             -- 添加4個部門
 18 
 19                             INSERT INTO dept(id,dname,loc) VALUES
 20 
 21                             (10,'教研部','北京'),
 22 
 23                             (20,'學工部','上海'),
 24 
 25                             (30,'銷售部','廣州'),
 26 
 27                             (40,'财務部','深圳');
 28 
 29                            
 30 
 31                            
 32 
 33                            
 34 
 35                             -- 職務表,職務名稱,職務描述
 36 
 37                             CREATE TABLE job (
 38 
 39                               id INT PRIMARY KEY,
 40 
 41                               jname VARCHAR(20),
 42 
 43                               description VARCHAR(50)
 44 
 45                             );
 46 
 47                            
 48 
 49                             -- 添加4個職務
 50 
 51                             INSERT INTO job (id, jname, description) VALUES
 52 
 53                             (1, '董事長', '管理整個公司,接單'),
 54 
 55                             (2, '經理', '管理部門員工'),
 56 
 57                             (3, '銷售員', '向客人推銷産品'),
 58 
 59                             (4, '文員', '使用辦公軟體');
 60 
 61                            
 62 
 63                            
 64 
 65                            
 66 
 67                             -- 員工表
 68 
 69                             CREATE TABLE emp (
 70 
 71                               id INT PRIMARY KEY, -- 員工id
 72 
 73                               ename VARCHAR(50), -- 員工姓名
 74 
 75                               job_id INT, -- 職務id
 76 
 77                               mgr INT , -- 上級上司
 78 
 79                               joindate DATE, -- 入職日期
 80 
 81                               salary DECIMAL(7,2), -- 工資
 82 
 83                               bonus DECIMAL(7,2), -- 獎金
 84 
 85                               dept_id INT, -- 所在部門編号
 86 
 87                               CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
 88 
 89                               CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
 90 
 91                             );
 92 
 93                            
 94 
 95                             -- 添加員工
 96 
 97                             INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
 98 
 99                             (1001,'孫悟空',4,1004,'2000-12-17','8000.00',NULL,20),
100 
101                             (1002,'盧俊義',3,1006,'2001-02-20','16000.00','3000.00',30),
102 
103                             (1003,'林沖',3,1006,'2001-02-22','12500.00','5000.00',30),
104 
105                             (1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20),
106 
107                             (1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30),
108 
109                             (1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30),
110 
111                             (1007,'劉備',2,1009,'2001-09-01','24500.00',NULL,10),
112 
113                             (1008,'豬八戒',4,1004,'2007-04-19','30000.00',NULL,20),
114 
115                             (1009,'羅貫中',1,NULL,'2001-11-17','50000.00',NULL,10),
116 
117                             (1010,'吳用',3,1006,'2001-09-08','15000.00','0.00',30),
118 
119                             (1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),
120 
121                             (1012,'李逵',4,1006,'2001-12-03','9500.00',NULL,30),
122 
123                             (1013,'小白龍',4,1004,'2001-12-03','30000.00',NULL,20),
124 
125                             (1014,'關羽',4,1007,'2002-01-23','13000.00',NULL,10);
126 
127                            
128 
129                            
130 
131                            
132 
133                             -- 工資等級表
134 
135                             CREATE TABLE salarygrade (
136 
137                               grade INT PRIMARY KEY,   -- 級别
138 
139                               losalary INT,  -- 最低工資
140 
141                               hisalary INT -- 最高工資
142 
143                             );
144 
145                            
146 
147                             -- 添加5個工資等級
148 
149                             INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
150 
151                             (1,7000,12000),
152 
153                             (2,12010,14000),
154 
155                             (3,14010,20000),
156 
157                             (4,20010,30000),
158 
159                             (5,30010,99990);
160 
161                            
162 
163                             -- 需求:
164 
165                            
166 
167                             -- 1.查詢所有員工資訊。查詢員工編号,員工姓名,工資,職務名稱,職務描述
168 
169                             /*
170 
171                                    分析:
172 
173                                           1.員工編号,員工姓名,工資,需要查詢emp表  職務名稱,職務描述 需要查詢job表
174 
175                                           2.查詢條件 emp.job_id = job.id
176 
177                            
178 
179                             */
180 
181                             SELECT
182 
183                                    t1.`id`, -- 員工編号
184 
185                                    t1.`ename`, -- 員工姓名
186 
187                                    t1.`salary`,-- 工資
188 
189                                    t2.`jname`, -- 職務名稱
190 
191                                    t2.`description` -- 職務描述
192 
193                             FROM
194 
195                                    emp t1, job t2
196 
197                             WHERE
198 
199                                    t1.`job_id` = t2.`id`;
200 
201                            
202 
203                            
204 
205                            
206 
207                             -- 2.查詢員工編号,員工姓名,工資,職務名稱,職務描述,部門名稱,部門位置
208 
209                             /*
210 
211                                    分析:
212 
213                                           1. 員工編号,員工姓名,工資 emp  職務名稱,職務描述 job  部門名稱,部門位置 dept
214 
215                                           2. 條件: emp.job_id = job.id and emp.dept_id = dept.id
216 
217                             */
218 
219                            
220 
221                             SELECT
222 
223                                    t1.`id`, -- 員工編号
224 
225                                    t1.`ename`, -- 員工姓名
226 
227                                    t1.`salary`,-- 工資
228 
229                                    t2.`jname`, -- 職務名稱
230 
231                                    t2.`description`, -- 職務描述
232 
233                                    t3.`dname`, -- 部門名稱
234 
235                                    t3.`loc` -- 部門位置
236 
237                             FROM
238 
239                                    emp t1, job t2,dept t3
240 
241                             WHERE
242 
243                                    t1.`job_id` = t2.`id` AND t1.`dept_id` = t3.`id`;
244 
245                               
246 
247                             -- 3.查詢員工姓名,工資,工資等級
248 
249                             /*
250 
251                                    分析:
252 
253                                           1.員工姓名,工資 emp  工資等級 salarygrade
254 
255                                           2.條件 emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalary
256 
257                                                  emp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary
258 
259                             */
260 
261                             SELECT
262 
263                                    t1.ename ,
264 
265                                    t1.`salary`,
266 
267                                    t2.*
268 
269                             FROM emp t1, salarygrade t2
270 
271                             WHERE t1.`salary` BETWEEN t2.`losalary` AND t2.`hisalary`;
272 
273                            
274 
275                            
276 
277                            
278 
279                             -- 4.查詢員工姓名,工資,職務名稱,職務描述,部門名稱,部門位置,工資等級
280 
281                             /*
282 
283                                    分析:
284 
285                                           1. 員工姓名,工資 emp , 職務名稱,職務描述 job 部門名稱,部門位置,dept  工資等級 salarygrade
286 
287                                           2. 條件: emp.job_id = job.id and emp.dept_id = dept.id and emp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary
288 
289                                                 
290 
291                             */
292 
293                             SELECT
294 
295                                    t1.`ename`,
296 
297                                    t1.`salary`,
298 
299                                    t2.`jname`,
300 
301                                    t2.`description`,
302 
303                                    t3.`dname`,
304 
305                                    t3.`loc`,
306 
307                                    t4.`grade`
308 
309                             FROM
310 
311                                    emp t1,job t2,dept t3,salarygrade t4
312 
313                             WHERE
314 
315                                    t1.`job_id` = t2.`id`
316 
317                                    AND t1.`dept_id` = t3.`id`
318 
319                                    AND t1.`salary` BETWEEN t4.`losalary` AND t4.`hisalary`;
320 
321                            
322 
323                            
324 
325                            
326 
327                             -- 5.查詢出部門編号、部門名稱、部門位置、部門人數
328 
329                            
330 
331                             /*
332 
333                                    分析:
334 
335                                           1.部門編号、部門名稱、部門位置 dept 表。 部門人數 emp表
336 
337                                           2.使用分組查詢。按照emp.dept_id完成分組,查詢count(id)
338 
339                                           3.使用子查詢将第2步的查詢結果和dept表進行關聯查詢
340 
341                                          
342 
343                             */
344 
345                             SELECT
346 
347                                    t1.`id`,t1.`dname`,t1.`loc` , t2.total
348 
349                             FROM
350 
351                                    dept t1,
352 
353                                    (SELECT
354 
355                                           dept_id,COUNT(id) total
356 
357                                    FROM
358 
359                                           emp
360 
361                                    GROUP BY dept_id) t2
362 
363                             WHERE t1.`id` = t2.dept_id;
364 
365                            
366 
367                            
368 
369                             -- 6.查詢所有員工的姓名及其直接上級的姓名,沒有上司的員工也需要查詢
370 
371                            
372 
373                             /*
374 
375                                    分析:
376 
377                                           1.姓名 emp, 直接上級的姓名 emp
378 
379                                                  * emp表的id 和 mgr 是自關聯
380 
381                                           2.條件 emp.id = emp.mgr
382 
383                                           3.查詢左表的所有資料,和 交集資料
384 
385                                                  * 使用左外連接配接查詢
386 
387                                   
388 
389                             */
390 
391                             /*
392 
393                             select
394 
395                                    t1.ename,
396 
397                                    t1.mgr,
398 
399                                    t2.`id`,
400 
401                                    t2.ename
402 
403                             from emp t1, emp t2
404 
405                             where t1.mgr = t2.`id`;
406 
407                            
408 
409                             */
410 
411                            
412 
413                             SELECT
414 
415                                    t1.ename,
416 
417                                    t1.mgr,
418 
419                                    t2.`id`,
420 
421                                    t2.`ename`
422 
423                             FROM emp t1
424 
425                             LEFT JOIN emp t2
426 
427                             ON t1.`mgr` = t2.`id`;      

多表查詢練習

事務

       1. 事務的基本介紹

              1. 概念:

                     *  如果一個包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗。

              2. 操作:

                     1. 開啟事務: start transaction;

                     2. 復原:rollback;

                     3. 送出:commit;

              3. 例子:

JavaWeb
JavaWeb
1 CREATE TABLE account (
 2 
 3                             id INT PRIMARY KEY AUTO_INCREMENT,
 4 
 5                             NAME VARCHAR(10),
 6 
 7                             balance DOUBLE
 8 
 9                      );
10 
11                      -- 添加資料
12 
13                      INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);
14 
15                     
16 
17                     
18 
19                      SELECT * FROM account;
20 
21                      UPDATE account SET balance = 1000;
22 
23                      -- 張三給李四轉賬 500 元
24 
25                     
26 
27                      -- 0. 開啟事務
28 
29                      START TRANSACTION;
30 
31                      -- 1. 張三賬戶 -500
32 
33                     
34 
35                      UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
36 
37                      -- 2. 李四賬戶 +500
38 
39                      -- 出錯了...
40 
41                      UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';
42 
43                     
44 
45                      -- 發現執行沒有問題,送出事務
46 
47                      COMMIT;
48 
49                      -- 發現出問題了,復原事務
50 
51                      ROLLBACK;      

              4. MySQL資料庫中事務預設自動送出

                     * 事務送出的兩種方式:

                            * 自動送出:

                                   * mysql就是自動送出的

                                   * 一條DML(增删改)語句會自動送出一次事務。

                            * 手動送出:

                                   * Oracle 資料庫預設是手動送出事務

                                   * 需要先開啟事務,再送出

                     * 修改事務的預設送出方式:

                            * 檢視事務的預設送出方式:SELECT @@autocommit; -- 1 代表自動送出  0 代表手動送出

                            * 修改預設送出方式: set @@autocommit = 0;

       2. 事務的四大特征:

              1. 原子性:是不可分割的最小操作機關,要麼同時成功,要麼同時失敗。

              2. 持久性:當事務送出或復原後,資料庫會持久化的儲存資料。

              3. 隔離性:多個事務之間。互相獨立。

              4. 一緻性:事務操作前後,資料總量不變

       3. 事務的隔離級别(了解)

              * 概念:多個事務之間隔離的,互相獨立的。但是如果多個事務操作同一批資料,則會引發一些問題,設定不同的隔離級别就可以解決這些問題。

              * 存在問題:

                     1. 髒讀:一個事務,讀取到另一個事務中沒有送出的資料

                     2. 不可重複讀(虛讀):在同一個事務中,兩次讀取到的資料不一樣。

                     3. 幻讀:一個事務操作(DML)資料表中所有記錄,另一個事務添加了一條資料,則第一個事務查詢不到自己的修改。

              * 隔離級别:

                     1. read uncommitted:讀未送出

                            * 産生的問題:髒讀、不可重複讀、幻讀

                     2. read committed:讀已送出 (Oracle)

                            * 産生的問題:不可重複讀、幻讀

                     3. repeatable read:可重複讀 (MySQL預設)

                            * 産生的問題:幻讀

                     4. serializable:串行化

                            * 可以解決所有的問題

                     * 注意:隔離級别從小到大安全性越來越高,但是效率越來越低

                     * 資料庫查詢隔離級别:

                            * select @@tx_isolation;

                     * 資料庫設定隔離級别:

                            * set global transaction isolation level  級别字元串;

              * 示範:

                     set global transaction isolation level read uncommitted;

                     start transaction;

                     -- 轉賬操作

                     update account set balance = balance - 500 where id = 1;

                     update account set balance = balance + 500 where id = 2;

DCL:

       * SQL分類:

              1. DDL:操作資料庫和表

              2. DML:增删改表中資料

              3. DQL:查詢表中資料

              4. DCL:管理使用者,授權

       * DBA:資料庫管理者

       * DCL:管理使用者,授權

              1. 管理使用者

                     1. 添加使用者:

                            * 文法:CREATE USER '使用者名'@'主機名' IDENTIFIED BY '密碼';

                     2. 删除使用者:

                            * 文法:DROP USER '使用者名'@'主機名';

                     3. 修改使用者密碼:

                            UPDATE USER SET PASSWORD = PASSWORD('新密碼') WHERE USER = '使用者名';

                            UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi';

                            SET PASSWORD FOR '使用者名'@'主機名' = PASSWORD('新密碼');

                            SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');

                            * mysql中忘記了root使用者的密碼?

                                   1. cmd -- > net stop mysql 停止mysql服務

                                          * 需要管理者運作該cmd

                                   2. 使用無驗證方式啟動mysql服務: mysqld --skip-grant-tables

                                   3. 打開新的cmd視窗,直接輸入mysql指令,敲回車。就可以登入成功

                                   4. use mysql;

                                   5. update user set password = password('你的新密碼') where user = 'root';

                                   6. 關閉兩個視窗

                                   7. 打開任務管理器,手動結束mysqld.exe 的程序

                                   8. 啟動mysql服務

                                   9. 使用新密碼登入。

                     4. 查詢使用者:

                            -- 1. 切換到mysql資料庫

                            USE myql;

                            -- 2. 查詢user表

                            SELECT * FROM USER;

                            * 通配符: % 表示可以在任意主機使用使用者登入資料庫

              2. 權限管理:

                     1. 查詢權限:

                            -- 查詢權限

                            SHOW GRANTS FOR '使用者名'@'主機名';

                            SHOW GRANTS FOR 'lisi'@'%';

                     2. 授予權限:

                            -- 授予權限

                            grant 權限清單 on 資料庫名.表名 to '使用者名'@'主機名';

                            -- 給張三使用者授予所有權限,在任意資料庫任意表上

                            GRANT ALL ON *.* TO 'zhangsan'@'localhost';

                     3. 撤銷權限: