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對象功能:
* 擷取功能:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
1 Field[] getFields() :擷取所有public修飾的成員變量
2
3 Field getField(String name) 擷取指定名稱的 public修飾的成員變量
4
5 Field[] getDeclaredFields() 擷取所有的成員變量,不考慮修飾符
6
7 Field getDeclaredField(String name)
1.擷取成員變量們
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
1 Constructor<?>[] getConstructors()
2
3 Constructor<T> getConstructor(類<?>... parameterTypes)
4
5 Constructor<T> getDeclaredConstructor(類<?>... parameterTypes)
6
7 Constructor<?>[] getDeclaredConstructors()
2.擷取構造方法們
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
1 Method[] getMethods()
2
3 Method getMethod(String name, 類<?>... parameterTypes)
4
5 Method[] getDeclaredMethods()
6
7 Method getDeclaredMethod(String name, 類<?>... parameterTypes)
8
9
3.擷取成員方法們
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
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:擷取方法名
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
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")
* 自定義注解
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
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)
//其實就是在記憶體中生成了一個該注解接口的子類實作對象
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
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 或 !
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
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可以進行聚合函數的判斷。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
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) * 每頁顯示的條數
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
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. 案例
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
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
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
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'
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
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. 例子:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yY2YTMmRGZ4QDZ2UTZ5gjYmRWNkJmYwMTNzgDM2cjYl9CXzIzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.gif)
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. 撤銷權限: