#在千鋒“逆戰”學習第41天#周總結+綜合練習

周總結

本週主要學習了數據庫以及JDBC方面的知識

查詢是數據庫的重點
SELECT 列名 FROM 表名 WHERE 條件 GROUP BY 分組 HAVING 過濾條件 ORDER BY 排序列 LIMIT 起始行,總條數
執行順序
1.執行 FROM : 指定數據來源表
2.執行WHERE : 對查詢的數據做第一次過濾
3.執行GROUP BY :分組
4.執行HAVING : 對分組後的數據做第二次過濾
5.執行SELECT : 查詢各個字段的值
6.執行ORDER BY : 排序
7.執行LIMIT : 限定查詢結果

查詢指定列
SELECT 列名 FROM 表名
列名可寫多個用逗號隔開
查詢所有列
SELECT * FROM 表名

對列中的數據進行運算
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY * 12 FROM t_employees;
查詢結果爲員工月薪乘以12
+列與列之間做加法運算
-列與列之間做減法運算
*列與列之間做乘法運算
/列與列之間做除法運算
注意: % 在數據庫中,代表的是佔位符,而並非取餘運算符

列的別名
SELECT EMPLOYEE_ID AS ‘員工編號’ FROM t_employees;
列名變爲員工編號,對原表的列名沒有影響

查詢結果去重
SELECT DISTINCT EMPLOYEE_ID FROM t_employees;
對員工ID去重

排序查詢
SELECT 列名 FROM 表名 ORDER BY 排序列名 排序規則
ASC 做升序排序
DESC 做降序排序
經驗:當進行升序排序時,排序規則可以不顯示聲明。默認爲升序排序規則

依據單列進行排序
查詢員工的編號,名字,薪資,按照工資進行升序排序
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees ORDER BY salary ASC;

依據多列進行排序
查詢員工編號,名字,薪資,按照工資進行升序排序,如果工資相等,按照編號降序排序
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees
ORDER BY SALARY ASC,EMPLOYEE_ID DESC

條件查詢
SELECT 列名 FROM 表名 WHERE 條件
WHERE 在查詢結果中,篩選符合條件的查詢結果,條件爲布爾表達式

查詢工資爲2500的員工信息
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees WHERE salary = 2500;
注意:與Java不同(==),MySQL中等值判斷用 =

不等值判斷(>、<、>=、<=、!=、<>)
注意:!=和<>都爲不等於的意思

邏輯判斷(and、or、not)
查詢員工工資在6000~10000的員工信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE salary>=6000 AND salary<=10000;
查詢工資是10000的或者是9000的員工信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE salary =10000 OR salary = 9000;
查詢除了工資是10000的員工信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE NOT salary =10000;

區間判斷(between and)

區間判斷 包含區間邊界的兩個值
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE salary BETWEEN 6000 AND 10000;
注意:between and要遵循 between 小值 and 大值

NULL值判斷(IS NULL、IS NOT NULL)

列名 IS NULL
列名 IS NOT NULL

查詢出 沒有經理編號的員工 IS NULL
SELECT EMPLOYEE_ID,FIRST_NAME,MANAGER_ID FROM t_employees
WHERE MANAGER_ID IS NULL

查詢出 沒有經理編號以外的員工信息(此處NOT爲取反。兩個結果)
SELECT EMPLOYEE_ID,FIRST_NAME,MANAGER_ID FROM t_employees
WHERE NOT MANAGER_ID IS NULL

枚舉查詢(IN (值1,值2,值n…))
查詢部門編號爲70,80,90的員工信息
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,DEPARTMENT_ID FROM t_employees
WHERE DEPARTMENT_ID IN(70,80,90);

模糊查詢(_、%)
LIKE (單個任意字符)(下劃線爲幾個字符則後面所跟字符長度與之相等)
列名 LIKE 'S

LIKE %(任意長度的任意字符 0~n個)
列名 LIKE ‘S%’

分支結構查詢
CASE
WHEN 條件1 THEN 結果1
WHEN 條件2 THEN 結果2
WHEN 條件3 THEN 結果3
WHEN 條件4 THEN 結果4
ELSE 結果
END

查詢員工信息(編號、名字、薪資、薪資級別<條件表達式>
SELECT EMPLOYEE_ID,FIRST_NAME,salary,
CASE
WHEN salary >=10000 THEN ‘A’
WHEN salary >=8000 AND salary<10000 THEN ‘B’
WHEN salary >=6000 AND salary<8000 THEN ‘C’
WHEN salary >=4000 AND salary <6000 THEN ‘D’
ELSE ‘E’
END AS ‘薪資級別’
FROM t_employees;

注意:通過使用CASE END進行條件判斷,每條數據對應生成一個值
case分支結構產生一個新的列
經驗:類似Java中的分支結構

時間查詢
語法: SELECT 時間函數(參數列表)
經驗:執行時間函數查詢,會生成一張虛擬表(一行一列)

SYSDATE()當前系統時間(年、月、日、時、分、秒) |
CURDATE() 獲得當前日期
CURTIME() 獲得當前時間
WEEK(DATE) 獲得指定日期是一年中第幾周
YEAR(DATE) 獲得指定日期的年份
MONTH(DATE) 獲得指定日期的月份
DAY(DATE) 獲得指定日期的天
HOUR(DATE) 獲得指定時間的小時值
MINUTE(DATE) 獲得指定時間的分鐘值
SECOND(DATE) 獲得指定日期的秒值
DATEDIFF(DATE1,DATE2) 獲得DATE1和DATE2之間相隔的天數
ADDDATE(DATE,N) 在指定日期加上N天后的日期

字符串查詢
語法:SELECT 字符串函數(參數列表)
經驗:執行字符串函數,產生一張虛擬表,一行一列

CONCAT(str1,str2,str3…) 將多個字符串進行拼接
INSERT(str,pos,len,newStr) 將str中指定pos位置開始len長度的內容替換爲newStr
LOWER(str) 將指定字符串轉換爲小寫
UPPER(str) 將指定字符串轉換爲大寫
SUBSTRING(str,pos,len) 將str字符串指定pos位置開始截取len個內容

聚合函數
語法:SELECT 聚合函數(列名)FROM 表名
經驗:聚合函數式對多條數據的單列進行統計,返回統計後的一行結果

COUNT() 求總行數
SUM() 求單列中所有行的總和
AVG() 求單列中所有行的平均值
MAX() 求單列中所有行的最大值
MIN() 求單列中所有行的最小值

分組查詢
語法: SELECT 列名 FROM 表名 WHERE 條件 GROUP BY 分組依據(列名)
GROUP BY 分組依據。如果有WHERE,在WHERE之後生效
注意:分組查詢中,select顯示的列只能是分組依據的列或者是聚合函數列,不能出現其他列

分組過濾查詢
語法: SELECT 列名 FROM 表名 WHERE 條件 GROUP BY 分組依據(列名) HAVING 過濾規則
HAVING 過濾規則是對分組後的數據進行過濾

限定查詢
語法:SELECT 列名 FROM 表名 LIMIT 起始行,查詢行
經驗:在分頁的應用場景中,起始行是跟隨頁數變化的,但是一頁顯示的條數是不變得

子查詢(作爲條件判斷)
語法:SELECT 列名 FROM 表名 WHERE 條件(子查詢結果)
查詢工資大於Bruce的員工信息
SELECT * FROM t_employees WHERE salary >(SELECT SALARY FROM t_employees WHERE first_name = ‘Bruce’);
注意:將子查詢"一行一列"的結果作爲外部查詢的條件。做第二次查詢
子查詢得到的是一行一列的結果才能作爲外部條件的等值或不等值判斷條件

子查詢(作爲枚舉查詢的條件)
語法:SELECT 列名 FROM 表名 WHERE 列名 IN(子查詢結果)

查詢與King同一部門員工信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary
FROM t_employees
WHERE DEPARTMENT_ID
IN
(SELECT DEPARTMENT_ID FROM t_employees WHERE last_name=‘King’)
經驗:將子查詢得到的"多行一列"的結果作爲外部查詢的枚舉查詢條件,做第二次查詢

注意:當子查詢結果集爲多行單列時,也可以使用ALL匹配所有或者ANY匹配部分
ALL爲當列所有,ANY爲當列種任意一個

子查詢(作爲一張表)
SELECT 列名 FROM (子查詢結果集) WHERE 條件;
經驗:將子查詢得到的"多行多列"的結果作爲外部查詢的一張臨時表,做第二次查詢

合併查詢(瞭解)
SELECT 列名 FROM 表名 1 UNION SELECT 列名 FROM 表名2(縱向合併合併兩張表並去除重複記錄)
SELECT 列名 FROM 表名 1 UNION ALL SELECT 列名 FROM 表名2(縱向合併兩張表不去除重複記錄)
注意:合併的兩個結果集,列數必須相同,列類型、列名可以不同

表連接查詢
SELECT 列名 FROM 表1 連接方式 表2 ON 連接條件;
連接方式包括:

一、內連接查詢(INNER JOIN ON)
1.兩張表連接查詢,要有關聯條件。但是關聯條件的列重複了。需要明確查詢的是哪個表的列
2.表名比較長,表名多次重複出現。容易混淆.可以給別名

二、左外連接查詢(LEFT JOIN ON)
1.左外連接,是以左表爲主表,依次向右表匹配,匹配到,則返回正確結果
2.匹配不到,則返回NULL值,填充顯示

三、右外連接查詢(RIGHT JOIN ON)
1.右外連接,是以右表爲主表,依次向左匹配,匹配到,返回正確結果
2.匹配不到,則返回NULL填充

DML操作(增、刪、改)

新增(INSERT)
INSERT INTO 表名 (列1,列2,列3…) VALUES(值1,值2,值3…)
多行添加,在值列表外邊追加,再寫一個值列表
注意:表名後的列名列表以及VALUES裏的值列表要一一對應(個數、順序、類型)

修改(UPDATE)
UPDATE 表名 SET 列名1=新值1,列名2 = 新值2… WHERE 條件
注意:SET後跟着多個列 = 值,絕大多數情況下,都要加WHERE條件,指定修改的目標,否則爲整表更新

刪除(DELETE)
DELETE FROM 表名 WHERE 條件
注意:刪除時,如若不加WHERE條件,刪除的是整張表的數據。結構不變

清空(TRUNCATE)
TRUNCATE TABLE 表名;

注意:TRUNCATE與DELETE不加WHERE刪除整張表數據不同
DELETE僅僅刪除數據,結構不變。
TRUNCATE是把整張表銷燬,再按照原表的格式、結構創建一張新表

庫表操作

數據庫創建(CREATE)
CREATE DATABASE 庫名

修改數據庫(ALTER)
ALTER DATABASE 庫名 操作
修改數據庫的字符集
ALTER DATABASE MYDB1 CHARACTER SET GBK;

刪除數據庫
DROP DATABASE 庫名

數據類型

類型 大小 範圍(有符號) 範圍(無符號) 用途
INT 4字節 (-2147483648,2147483647) (0,4294967295) 整數值
DOUBLE 8字節 (-1.797E+308,-2.22E-308) (0,2.22E-308,1.797E+308) 雙精度浮點值
DOUBLE(M,D) 8字節,M表示長度,D表示小數位數 同上,受M和D的約束。DOUBLE(5,2)-999.99-999.99 同上,受M和D的約束 雙精度浮點值
DECIMAL(M,D) 保存精確值 依賴M和D。 依賴M和D 小數值

日期類型

類型 大小 範圍 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 時間值
YEAR 1 1901/2155 YYYY 年分值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM–DD HH:MM:SS 混合日期時間值

字符串類型

類型 大小 用途
CHAR 0-255字符 定長字符串 CHAR(10) 10個字符
VARCHAR 0-65535 可變長字符串 VARCHAR(10) 10個字符
BLOB(binary large object) 0-65535 二進制形式的長文本數據
TEXT 0-65535 長文本

數據表的創建(CREATE)
CREATE TABLE 表名

列名 數據類型 [約束],

列名 數據類型 [約束],

​ …

列名 數據類型 [約束] //最後一列的創建,末尾不需要加逗號

)[charset=utf8]; //根據需要指定表的字符編碼集

約束

實體完整性約束
表中一行數據代表一個實體(entity),實體完整性約束是標識每一行數據不重複、實體唯一。

主鍵約束
PRIMARY KEY 唯一,標識表中的一行數據,此列的值不可重複,且不能爲NULL

唯一約束
UNIQUE 唯一,標識表中的一行數據,不可重複,可以爲NULL

自動增長列
AUTO_INCREMENT自動增長,給主鍵數值列添加自動增長。從1開始,每次加1。不能單獨使用,和主鍵搭配

域完整性約束
限制列的每一個單元格的數據正確性

非空約束
NOT NULL 非空,約束此列的每一個單元格不允許有NULL
默認值約束
DEFAULT爲列賦予默認值,當新增的數據不指定值時,可以書寫DEFAULT,以定義好的默認值進行填充

引用完整性約束
語法:CONSTRAINT 引用名 FOREIGN KEY (列名) REFERENCES 被引用表名(列名)
FOREIGN KEY 引用外部表的某個列的值,新增數據時,約束此列的值必須是被引用表中存在的值

注意:兩張表存在引用關係時,執行刪除操作需要注意,先刪除從表(引用表、外鍵表),再刪除主表(被引用表、主鍵表)

數據表的修改(ALTER)
語法:ALTERTABLE 表名 修改操作

向現有表中添加列
ADD 新列名 數據類型 約束

修改表中的列
MODIFY 列名 數據類型 約束

刪除表中的列
DROP 列名

改變列名
CHANGE 舊列名 新列明 新列數據類型 新列約束

修改表名
RENAME 新表名

刪除表
DROP TABLE 表名

事務

事務的概念
事務是一個原子操作。是一個最小執行單元。可以由一個或多個SQL語句組成,在同一個事務中,所有的SQL語句都成功執行時,整個事務成功。有一個SQL語句執行失敗,整個事務都執行失敗。

事務的邊界
開始:連接到數據庫,執行一條DML語句。 上一個事務結束後,又輸入了一條DML語句,即事務的開始

結束:
提交:
顯示提交:COMMIT;
隱式提交:一條DML語句。正常退出(客戶端退出鏈接)
回滾:
顯示回滾:ROLLBACK;
隱式回滾:非正常退出(斷電、死機),執行了創建、刪除的語句,但是失敗了!會爲這個無效的SQL語句執行回滾。

事務的原理
數據庫會爲每一個客戶端都維護一個空間獨立的緩存區(回滾段),一個事務中所有的增刪改語句的執行結果都會緩存在回滾段中,只有當事務中所有的SQL語句均正常結束(COMMIT),纔會將回滾段中的數據同步到數據庫。否則無論因爲任何原因失敗了,則整個事務回滾(ROLLBACK)

事務的特性

Atomicity(原子性)
表示的是一個事務內的所有操作是一個整體,要麼全部成功,要麼全部失敗。
Consistency(一致性)
表示一個事務內有一個操作失敗時,所有的更改過得數據都必須回滾到修改前狀態。
Isolation(隔離性)
事務查看數據操作時數據所處的狀態,要麼是另一個併發事務修改數據之前的狀態,要麼是另一個併發事務修改它之後的狀態。事務不會查看中間狀態的數據
Durability(持久性)
事務完成之後,對於數據庫的影響是永久性的。

事務的應用
應用環境:基於增刪改語句的操作結果(均返回操作後受影響的行數),可通過程序邏輯手動控制事務的提交或回滾
注意:開啓事務後,在當前事務內執行的語句均屬於當前事務,成功再執行COMMIT,失敗要進行ROLLBACK

權限管理

創建用戶
CREATE USER 用戶名 IDENTIFIED BY 密碼

授權
GRANT ALL ON 數據庫.表名 TO用戶名;

撤銷權限
REVOKE ALL ON數據庫.表名 FROM用戶名

刪除用戶
DROP USER 用戶名

視圖

視圖,虛擬表,從一個表中或多個表中查詢出來的結果表,作用和真實表一樣,包含一系列的帶有行和列的數據。視圖中,可以使用SELECT語句查詢數據,也可以使用INSERT、UPDATE、DELETE修改記錄,視圖可以使用戶操作方便,並保障了數據庫系統安全。

視圖特點

優點:
簡單化,數據所見即所得
安全性,只能查詢或修改視圖中所能見到的數據
邏輯獨立性,可以屏蔽真實表結構變化帶來的影響。

缺點:
性能相對較差,簡單的查詢會稍微複雜
修改不方便,當視圖的數據時複雜的聚合視圖時,無法修改。

視圖的創建
語法:CREATE VIEW 視圖名 AS 查詢數據源表的語句

視圖的修改
方式一:CREATE OR REPLACE VIEW 視圖名 AS查詢源表的語句;存在就替換數據,不存在就新建
方式二:ALTER VIEW 視圖名 AS查詢源表的語句;

視圖的刪除
DROP VIEW 視圖名

視圖的注意事項
注意:
視圖不會獨立存儲數據,原表發生改變,視圖的數據也發生改變。沒有優化查詢的性能
如果視圖包含以下結構中的一種,則視圖不可更新
聚合函數的結果
GROUP BY分組後的結果
HAVING篩選過濾後的結果
UNION、UNION ALL聯合後的結果

SQL語言分類

  1. 數據查詢語言DQL (Data Query Language):SELECT、WHERE、ORDER BY 、GROUP BY 、HAVING
  2. 數據定義語言DDL (Data Definition Language): CREATE、ALTER、DROP
  3. 數據操作語言DML(Data Manipulation Language):INSERT、UPDATE、DELETE
  4. 事務處理語言TPL (Transaction Process Language):COMMIT、ROLLBACK
  5. 數據控制語言DCL (Data Control Language):GRANT、REVOKE

——————————————————————————
綜合練習(作業)JDBC的核心六步實現增、刪、改

某網上商城數據庫表結構如下:

# 創建用戶表
create table user(
	 userId int primary key auto_increment,
  	 username varchar(20) not null,
  	 password varchar(18) not null,
     address varchar(100),
     phone varchar(11)
);

#創建分類表
create table category(
  cid varchar(32) PRIMARY KEY ,
  cname varchar(100) not null		#分類名稱
);

# 商品表
CREATE TABLE `products` (
  `pid` varchar(32) PRIMARY KEY,
  `name` VARCHAR(40) ,
  `price` DOUBLE(7,2),
   category_id varchar(32),
   constraint foreign key(category_id) references category(cid)
);

#訂單表
create table `orders`(
  `oid` varchar(32) PRIMARY KEY ,
  `totalprice` double(12,2), #總計
  `userId` int,
   constraint foreign key(userId) references user(userId) #外鍵
);

# 訂單項表
create table orderitem(
  oid varchar(32),	#訂單id
  pid varchar(32),	#商品id
  num int ,         #購買商品數量
  primary key(oid,pid), #主鍵
  foreign key(oid) references orders(oid),
  foreign key(pid) references products(pid)
);

#-----------------------------------------------
#初始化數據

#用戶表添加數據
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('張三','123','北京昌平沙河','13812345678');
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('王五','5678','北京海淀','13812345141');
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('趙六','123','北京朝陽','13812340987');
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('田七','123','北京大興','13812345687');

#給商品表初始化數據
insert into products(pid,name,price,category_id) values('p001','聯想',5000,'c001');
insert into products(pid,name,price,category_id) values('p002','海爾',3000,'c001');
insert into products(pid,name,price,category_id) values('p003','雷神',5000,'c001');
insert into products(pid,name,price,category_id) values('p004','JACK JONES',800,'c002');
insert into products(pid,name,price,category_id) values('p005','真維斯',200,'c002');
insert into products(pid,name,price,category_id) values('p006','花花公子',440,'c002');
insert into products(pid,name,price,category_id) values('p007','勁霸',2000,'c002');
insert into products(pid,name,price,category_id) values('p008','香奈兒',800,'c003');
insert into products(pid,name,price,category_id) values('p009','相宜本草',200,'c003');
insert into products(pid,name,price,category_id) values('p010','梅明子',200,null);


#給分類表初始化數據
insert into category values('c001','電器');
insert into category values('c002','服飾');
insert into category values('c003','化妝品');
insert into category values('c004','書籍');

#添加訂單
insert into orders values('o6100',18000.50,1);
insert into orders values('o6101',7200.35,1);
insert into orders values('o6102',600.00,2);
insert into orders values('o6103',1300.26,4);

#訂單詳情表
insert into orderitem values('o6100','p001',1),('o6100','p002',1),('o6101','p003',1);

15.1 綜合練習1-【多表查詢】

1>查詢所有用戶的訂單
在這裏插入圖片描述

2>查詢用戶id爲 1 的所有訂單詳情
在這裏插入圖片描述

15.2 綜合練習2-【子查詢】

1>查看用戶爲張三的訂單
在這裏插入圖片描述

2>查詢出訂單的價格大於800的所有用戶信息。
在這裏插入圖片描述

15.3 綜合練習3-【分頁查詢】

1>查詢所有訂單信息,每頁顯示5條數據

在這裏插入圖片描述

15.4 綜合練習4-【使用JDBC實現對每張表的增、刪、改】

新增
在這裏插入圖片描述
在這裏插入圖片描述
修改在這裏插入圖片描述
在這裏插入圖片描述

刪除
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

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