前言
小亭子正在努力的學(xué)習(xí)編程,接下來將開啟javaEE的學(xué)習(xí)~~
分享的文章都是學(xué)習(xí)的筆記和感悟,如有不妥之處希望大佬們批評指正~~
同時如果本文對你有幫助的話,煩請點贊關(guān)注支持一波, 感激不盡~~
目錄
前言
數(shù)據(jù)庫基礎(chǔ)知識
數(shù)據(jù),數(shù)據(jù)庫,數(shù)據(jù)庫管理系統(tǒng),數(shù)據(jù)庫系統(tǒng)
數(shù)據(jù)庫的發(fā)展階段
?數(shù)據(jù)庫系統(tǒng)的結(jié)構(gòu)
數(shù)據(jù)模型
一、概念模型
邏輯結(jié)構(gòu)?
關(guān)系模型
關(guān)系代數(shù)
數(shù)據(jù)庫的分類
配置初始化文件
常用的dos代碼
注意:
SQL分類
表設(shè)計
一對一
一對多
多對多
常用數(shù)據(jù)類型
數(shù)值類型
字符串類型
日期類型
?范式
第一范式
第二范式
第三范式
數(shù)據(jù)庫的操作
顯示當(dāng)前數(shù)據(jù)庫
語法:
創(chuàng)建數(shù)據(jù)庫
語法:
說明:
示例:
使用數(shù)據(jù)庫
語法:
刪除數(shù)據(jù)庫
語法:
說明:
示例:
表的操作
使用數(shù)據(jù)庫
查看表結(jié)構(gòu)
創(chuàng)建表
刪除表
表的增刪改查(CRUD)
CRUD
新增數(shù)據(jù)
語法:
示例:
單行數(shù)據(jù) +全列插入
多行數(shù)據(jù)+指定列插入
查詢數(shù)據(jù)
全列查詢
指定列查詢
查詢字段為表達式
設(shè)置別名
去重查詢
排序查詢
where條件查詢
分頁查詢
聚合函數(shù)查詢
GROUP BY子句
HAVING 子句
聯(lián)合查詢
修改數(shù)據(jù)
語法
示例
刪除數(shù)據(jù)
語法
示例
數(shù)據(jù)庫約束
索引
事務(wù)
先來個語法總結(jié)
--顯示當(dāng)前數(shù)據(jù)庫
show databases-- 使用數(shù)據(jù)庫
use xxx;--創(chuàng)建數(shù)據(jù)庫
create database [if not exists] 數(shù)據(jù)庫名?--查詢數(shù)據(jù)庫下表
show tables;-- 顯示表
show table;-- 創(chuàng)建表
create table xxx;-- 刪除表
drop table xxx;--查看表結(jié)構(gòu)
describe xxx; 或 desc xxx;--修改表名
alter table <表名> rename <表名>;--修改表字段信息
alter table 表名?change 字段名???修改后的列名和屬性;--增加表字段信息
alter table 表名 add??字段名及屬性--刪除一個表字段
alter table 表名 drop 字段名;--插入數(shù)據(jù)
insert into 表名 value(根據(jù)表結(jié)構(gòu)插入數(shù)據(jù)內(nèi)容 );--插入數(shù)據(jù),指定屬性
insert into 表名?(列名) value(根據(jù)表結(jié)構(gòu)插入數(shù)據(jù)內(nèi)容 );--修改數(shù)據(jù)
update 表 set 字段1=value1, 字段2=value2... where 條件--刪除數(shù)據(jù)
delete from 表 where 條件?--查看索引
show index from 表名;--創(chuàng)建索引 對于非主鍵、非唯一約束、非外鍵的字段,可以創(chuàng)建普通索引
create index 索引名 on 表名(字段名);--刪除索引
drop index 索引名 on 表名;--事務(wù)
那就讓這里兩個操作要么同時成功,要么同時失敗。這就是事務(wù)的邏輯。
(1)開啟事務(wù):start transaction;
(2)中間執(zhí)行多條SQL語句
(3)回滾或提交:rollback/commit;-- 全列查詢
select * from 表-- 指定列查詢
select 字段1,字段2... from 表-- 查詢表達式字段
select 字段1+100,字段2+字段3 from 表-- 別名
select 字段1 別名1, 字段2 別名2 from 表-- 去重DISTINCT
select distinct 字段 from 表-- 排序ORDER BY
select * from 表 order by 排序字段-- 條件查詢where:
(1)比較運算符 (2)BETWEEN ... AND ... (3)IN (4)IS NULL (5)LIKE (6)AND (7)OR(8)NOT
select * from 表 where 條件
>, >=, <, <=,=,<=>(等于),!=, <>
between a and b,IS NULL,IS NOT NULL
IN (option, ...)?? ?如果是 option 中的任意一個,返回 TRUE(1)
LIKE?? ?模糊匹配。% 表示任意多個(包括 0 個)任意字符;_ 表示任意一個字符
邏輯運算符:and,or,not--分頁查詢limit--從 s 開始,篩選 n 條結(jié)果,比第二種用法更明確,建議使用
select ... from 表名[where...][order by..] limit s offset n;--聚合函數(shù)
COUNT([DISTINCT] expr)(計數(shù)),SUM([DISTINCT] expr),AVG([DISTINCT] expr),MAX([DISTINCT] expr),MIN([DISTINCT] expr)
select role,max(salary),min(salary),avg(salary) from emp group by role;--group by ?分組查詢 having 條件過濾
GROUP BY 子句進行分組以后,需要對分組結(jié)果再進行條件過濾時,不能使用 WHERE 語句,而需要用HAVING
顯示平均工資低于1500的角色和它的平均工資
select role,max(salary),min(salary),avg(salary) from emp group by role
having avg(salary)<1500;--聯(lián)合查詢
--內(nèi)連接
select 字段 from 表1 別名1 [inner] join 表2 別名2 on 連接條件 and 其他條件;
select 字段 from 表1 別名1,表2 別名2 where 連接條件 and 其他條件;-- 左外連接,表1完全顯示
select 字段名 from 表名1 left join 表名2 on 連接條件;-- 右外連接,表2完全顯示
select 字段 from 表名1 right join 表名2 on 連接條件;--自連接,自連接是指在同一張表連接自身進行查詢。
select 字段 from 表1 別名1 join 表1 別名2 on 連接條件??join 表2?別名1 on 條件?join 表12別名2 .......and 其他條件;--子查詢
-- 單行子查詢
select ... from 表1 where 字段1 = (select ... from ...);--多行子查詢
-- [NOT] IN
select ... from 表1 where 字段1 in (select ... from ...);
-- [NOT] EXISTS
select ... from 表1 where exists (select ... from ... where 條件);-- 臨時表:form子句中的子查詢
select ... from 表1, (select ... from ...) as tmp where 條件
在from子句中使用子查詢:子查詢語句出現(xiàn)在from子句中。這里要用到數(shù)據(jù)查詢的技巧,把一個子查詢當(dāng)做一個臨時表使用。----在from子句中使用子查詢:子查詢語句出現(xiàn)在from子句中。這里要用到數(shù)據(jù)查詢的技巧,把一個子查詢當(dāng)做一個臨時表使用。
-- UNION:去除重復(fù)數(shù)據(jù)(操作符用于取得兩個結(jié)果集的并集。當(dāng)使用該操作符時,會自動去掉結(jié)果集中的重復(fù)行。)
select ... from ... where 條件
union
select ... from ... where 條件-- UNION ALL:不去重(該操作符用于取得兩個結(jié)果集的并集。當(dāng)使用該操作符時,不會去掉結(jié)果集中的重復(fù)行)
select ... from ... where 條件
union all
select ... from ... where 條件
使用UNION和UNION ALL時,前后查詢的結(jié)果集中,字段需要一致
--數(shù)據(jù)庫約束
NOT NULL - 指示某列不能為空
UNIQUE - 保證某列的每行必須有唯一,不重復(fù)的。
DEFAULT - 規(guī)定沒有給列賦值時的默認(rèn)值。
PRIMARY KEY - 主鍵約束,與?NOT NULL 和 UNIQUE 的結(jié)合。確保某列(或兩個列多個列的結(jié)合)有唯一標(biāo)識,有助于更容易更快速地找到表中的一個特定的記錄。
FOREIGN KEY - 外鍵約束,保證一個表中的數(shù)據(jù)匹配另一個表中的值的參照完整性。
CHECK - 保證列中的值符合指定的條件。對于MySQL數(shù)據(jù)庫,對CHECK子句進行分析,但是忽略CHECK子句。
數(shù)據(jù)庫基礎(chǔ)知識
數(shù)據(jù),數(shù)據(jù)庫,數(shù)據(jù)庫管理系統(tǒng),數(shù)據(jù)庫系統(tǒng)
數(shù)據(jù)庫的發(fā)展階段
?數(shù)據(jù)庫系統(tǒng)的結(jié)構(gòu)
?三級結(jié)構(gòu)
數(shù)據(jù)庫系統(tǒng)的二級映像
1.外模式/模式映像:保證邏輯獨立性
2.模式/內(nèi)模式映像:保證物理獨立性
?
數(shù)據(jù)模型
一、概念模型
1.相關(guān)術(shù)語
2.實體型之間的聯(lián)系
1.一對一聯(lián)系(1:1)
兩個方向都是 1:1
例:班級和班主任
2.一對多聯(lián)系(1:n)
一個方向是 1:1,另一個方向是 1:n
例:學(xué)生和班主任
3.多對多聯(lián)系(m:n)
兩個方向都是 1:n
例:學(xué)生和課程
3.E-R 圖
矩形表示實體;橢圓表示屬性;菱形表示聯(lián)系;無向邊;聯(lián)系類型
例:①班級和班主任;②學(xué)生和班主任;③學(xué)生和課程
邏輯結(jié)構(gòu)?
1.結(jié)構(gòu)
樹型結(jié)構(gòu)
?2.特點
(1)一個模型有且只有一個節(jié)點沒有雙親節(jié)點,這個節(jié)點稱為根節(jié)點
(2)根節(jié)點以外的其他節(jié)點有且只有一個雙親節(jié)點
(3)父子節(jié)點之間的聯(lián)系是一對多聯(lián)系(1∶ n)
網(wǎng)型結(jié)構(gòu)
?2.特點
(1)允許一個以上的節(jié)點沒有雙親節(jié)點
(2)允許一個節(jié)點有多個雙親節(jié)點
(3)節(jié)點之間存在多種聯(lián)系(m:n)
關(guān)系模型
(一)基本概念
1.關(guān)系:二維表
2.屬性:列、字段;元數(shù)
3.域:值域
4.元組:行、記錄
5.分量:屬性值
如,(01001,趙乾,女,講師,計算機, 6000)中“01001”為一個分量
6.關(guān)系模式:二維表結(jié)構(gòu)
如, T(TNo, TN, Sex, Prof, Dept, Sal)
?(二)關(guān)系的性質(zhì)
1.每一列是同質(zhì)的
2.不同列有不同的名字
3.列的順序可以任意交換
4.行的順序可任意交換
5.不允許出現(xiàn)完全一樣的行
6.不允許出現(xiàn)合并單元格
(三)關(guān)系模型的完整性約束
有 3 類:實體完整性、參照完整性、用戶定義完整性
(一)關(guān)系的碼
?(二)實體完整性
原則:①有主碼(不空)②不同元組的主碼不重復(fù)
(三)參照完整性
原則: R2 表的外鍵 X 的取值,參照 R1 表的主鍵值
(四)用戶自定義完整性
原則:事先定義值域
?
關(guān)系代數(shù)
一) 傳統(tǒng)的集合運算
1.并
2 .差
3.交
?4.廣義笛卡爾積
?
?二) 專門的代數(shù)運算
1.選擇 【根據(jù)條件得到行】
?選擇條件:性別? 女
結(jié)果:
2.投影 【 根據(jù)條件得到列】
投影條件:姓名,系別
投影結(jié)果:
3.連接
連接運算是二目運算, 它從兩個關(guān)系的廣義笛卡兒積中選取滿足連接條件的
元組, 組成新的關(guān)系。
( 1) 等值連接
規(guī)則: ①結(jié)果(字段-兩個關(guān)系的字段和) (記錄-等值屬性值相等, 拼左右)
( 2) 自然連接
規(guī)則: ①兩表有相同的屬性②結(jié)果( 字段-相同屬性列只保留一列) ( 記錄-
相同屬性做等值連接)
4.除
?具體算法可以看這篇http://t.csdn.cn/D4vj3
數(shù)據(jù)庫的分類
數(shù)據(jù)庫分為關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫
關(guān)系型數(shù)據(jù)庫 | 非關(guān)系型數(shù)據(jù)庫 | |
使用SQL | 是 | 不強制要求,一般不基于SQL實現(xiàn) |
事務(wù)支持 | 支持 | 不支持 |
復(fù)雜操作 | 支持 | 不支持 |
海量讀寫操作 | 效率低 | 效率高 |
基本結(jié)構(gòu) | 基于表和列,結(jié)構(gòu)固定 | 靈活性比較高 |
使用場景 | 業(yè)務(wù)方面的OLTP系統(tǒng) | 用于數(shù)據(jù)的緩存、或基于統(tǒng)計分析的OLAP系統(tǒng) |
配置初始化文件
1. 在MySQL根目錄下創(chuàng)建初始化文件my.ini,即D:\Tools\mysql-5.7.27-winx64\my.ini。內(nèi)容
如下:
[mysql]
# 設(shè)置mysql客戶端默認(rèn)字符集
default-character-set=utf8
[mysqld]
#設(shè)置3306端口
port=3306
# 設(shè)置mysql的安裝目錄
basedir=D:/Tools/mysql-5.7.27-winx64
# 設(shè)置mysql數(shù)據(jù)庫的數(shù)據(jù)的存放目錄
datadir=D:/Tools/mysql-5.7.27-winx64/data
# 允許最大連接數(shù)
max_connections=200
# 服務(wù)端使用的字符集默認(rèn)為8比特編碼的latin1字符集
character-set-server=utf8
# 創(chuàng)建新表時將使用的默認(rèn)存儲引擎
default-storage-engine=innodb2. 將以上 basedir 和 datadir 后的內(nèi)容替換成自己的路徑。
3. 注意:需要保存為ANSI編碼。方法一:使用記事本打開,保存/另
法二:使用Notpad++打開,點擊編碼->轉(zhuǎn)為ANSI編碼->保存。
常用的dos代碼
--連接服務(wù)器
mysql -u root -p
要求輸入密碼,沒有設(shè)置密碼則直接回車
進入MySQL命令行以后,可以看到 mysql>
-- 使用mysql數(shù)據(jù)庫
use mysql;
-- 更新用戶表的root賬戶,設(shè)置為任意ip都可以訪問,密碼修改為123456
update user set host="%",authentication_string=password('root') where
user="root";
-- 刷新權(quán)限
flush privileges;
--退出quit;
注意:
- 注釋的寫法 在前面加 --
- sql語句不區(qū)分大小寫,寫大寫和小寫都行
SQL分類
DDL數(shù)據(jù)定義語言,用來維護存儲數(shù)據(jù)的結(jié)構(gòu)
代表指令: create, drop, alter
DML數(shù)據(jù)操縱語言,用來對數(shù)據(jù)進行操作
代表指令: insert,delete,update
DML中又單獨分了一個DQL,數(shù)據(jù)查詢語言,代表指令: select
DCL數(shù)據(jù)控制語言,主要負(fù)責(zé)權(quán)限管理和事務(wù)
代表指令: grant,revoke,commit
?
表設(shè)計
一對一
一對多
多對多
常用數(shù)據(jù)類型
數(shù)值類型
分為整型和浮點型
數(shù)據(jù)類型? | 大小? | 說明? | 對應(yīng)java類型 |
BIT[ (M) ] | M指定位數(shù),默認(rèn)為1 | 二進制數(shù),M范圍從1到64, 存儲數(shù)值范圍從0到2^M-1 |
常用Boolean對應(yīng)BIT,此時默認(rèn)是1位,即只能存0和1 |
TINYINT? | 1字節(jié)? | Byte | |
SMALLINT? | 2字節(jié)? | Short | |
INT? | 4字節(jié)? | Integer | |
BIGINT? | 8字節(jié)? | Long | |
FLOAT(M, D)? | 4字節(jié)? | 單精度,M指定長度,D指定小數(shù)位數(shù)。會發(fā)生精度丟失? | Float |
DOUBLE(M,D) | 8字節(jié)? | Double | |
DECIMAL(M,D) | M/D最大值+2 | 雙精度,M指定長度,D表示小數(shù)點位數(shù)。精確數(shù)值? | BigDecimal |
NUMERIC(M,D) | M/D最大值+2? | 和DECIMAL一樣? | BigDecimal |
補充:
- 數(shù)值類型可以指定為無符號(unsigned),表示不取負(fù)數(shù)
- 1字節(jié)(bytes)= 8bit。
- 對于整型類型的范圍:
1. 有符號范圍:-2^(類型字節(jié)數(shù)*8-1)到2^(類型字節(jié)數(shù)*8-1)-1,如int是4字節(jié),是-2^31到2^31-1
2. 無符號范圍:0到2^(類型字節(jié)數(shù)*8)-1,如int就是2^32-1
盡量不使用unsigned,對于int類型可能存放不下的數(shù)據(jù),int unsigned同樣可能存放不下,與其如此,還不如設(shè)計時,將int類型提升為bigint類型
?
字符串類型
數(shù)據(jù)類型 | 大小 | 說明 | 對應(yīng)java類型 |
VARCHAR (SIZE) | 0-65,535字節(jié) | 可變長度字符串 | String |
TEXT | 0-65,535字節(jié) | 長文本數(shù)據(jù) | String |
MEDIUMTEXT | 0-16 777 215字節(jié) | 中等長度文本數(shù)據(jù) | String |
BLOB | 0-65,535字節(jié) | 二進制形式的長文本數(shù)據(jù) | byte[] |
說明:varchar 可變長度是指? 假設(shè) 設(shè)置了1000個字符的大小,實際占用了100個,那么就只開辟100個空間。不可變長度就是設(shè)置了1000,空間占用就是1000,沒用上的就空著但是還是占用了。
日期類型
數(shù)據(jù)類型 | 大 小 |
說明 | 對應(yīng)java類型 |
DATETIME | 8 字 節(jié) | 范圍從1000到9999年,不會進行時區(qū)的 檢索及轉(zhuǎn)換。 |
java.util.Date、 java.sql.Timestamp |
TIMESTAMP | 4 字 節(jié) | 范圍從1970到2038年,自動檢索當(dāng)前時 區(qū)并進行轉(zhuǎn)換。 |
java.util.Date、 java.sql.Timestamp |
補充:時間戳默認(rèn)1970年1月1日,(時間紀(jì)元)有興趣的自行百度。
?范式
第一范式
第一范式規(guī)定表中的每個列都應(yīng)該是不可分割的最小單元。比如以下表中的 address 字段就不是不可分割的最小單元。(原子不可再分)
不滿足的表:address 還可以拆分為國家和城市
滿足的表?
第二范式
第二范式是在滿足第一范式的基礎(chǔ)上,規(guī)定表中的非主鍵列不存在對主鍵的部分依賴,也就是說每張表只描述一件事情.
以下訂單表就不滿足第二范式,它可以拆分為兩張獨立的表:訂單表和商品表。
滿足的表
第三范式
第三范式是在滿足第一范式和第二范式的基礎(chǔ)上,規(guī)定表中的列不存在對非主鍵列的傳遞依賴。
(保證每列都和主鍵直接相關(guān))
比如以下的訂單表中的顧客名稱就不符合第三范式,因為它存在了對非主鍵顧客編號的依賴
滿足的表
使用數(shù)據(jù)庫三范式的優(yōu)勢是:表的結(jié)構(gòu)更簡單、優(yōu)雅,表的邏輯和條理性更強,并且使用三范式可以很大程度的減少表中的冗余數(shù)據(jù),很好的節(jié)省了數(shù)據(jù)庫的存儲資源。
數(shù)據(jù)庫的操作
顯示當(dāng)前數(shù)據(jù)庫
語法:
show databases
創(chuàng)建數(shù)據(jù)庫
語法:
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,
create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
說明:
- 大寫的表示關(guān)鍵字
- [] 是可選項
- CHARACTER SET: 指定數(shù)據(jù)庫采用的字符集
- COLLATE: 指定數(shù)據(jù)庫字符集的校驗規(guī)則
示例:
1.創(chuàng)建名為db_test1 的數(shù)據(jù)庫
CREATE DATABASE db_test1
2.如果系統(tǒng)沒有 db_test2 的數(shù)據(jù)庫,則創(chuàng)建一個名叫 db_test2 的數(shù)據(jù)庫,如果有則不創(chuàng)建
CREATE DATABASE IF NOT EXISTS db_test2
3.如果系統(tǒng)沒有 db_test 的數(shù)據(jù)庫,則創(chuàng)建一個使用utf8mb4字符集的 db_test 數(shù)據(jù)庫,如果有則不創(chuàng)建
CREATE DATABASE IF NOT EXISTS db_test CHARACTER SET utf8mb4;
?
使用數(shù)據(jù)庫
語法:
use 數(shù)據(jù)庫名
刪除數(shù)據(jù)庫
語法:
DROP DATABASE [IF EXISTS] db_name
說明:
數(shù)據(jù)庫刪除以后,內(nèi)部看不到對應(yīng)的數(shù)據(jù)庫,里邊的表和數(shù)據(jù)全部被刪除
?
示例:
drop database if exists db_test1
drop database if exists db_test2
表的操作
-- 顯示
show table;
-- 創(chuàng)建
create table xxx;
-- 使用
use xxx;
-- 刪除
drop table xxx;--查看表結(jié)構(gòu)
describe xxx; 或 desc xxx;
--查詢數(shù)據(jù)庫下表
show tables;
--修改表名
alter table <表名> rename <表名>;
--修改表字段信息
alter table 表名?change 字段名? ?修改后的列名和屬性;
--增加表字段信息
alter table 表名 add? 字段名及屬性
--刪除一個表字段
alter table 表名 drop 字段名;
使用數(shù)據(jù)庫
操作表之前需要先使用該數(shù)據(jù)庫
user 數(shù)據(jù)庫名
查看表結(jié)構(gòu)
desc? 表名
示例+說明?
創(chuàng)建表
語法
CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype
);
示例
create table stu_test (
id int,
name varchar(20) comment '姓名',
password varchar(50) comment '密碼',
age int,
sex varchar(1),
birthday timestamp,
amout decimal(13,2),
resume text
);
刪除表
語法
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
示例
-- 刪除 stu_test 表
drop table stu_test;
-- 如果存在 stu_test 表,則刪除 stu_test 表
drop table if exists stu_test;
表的增刪改查(CRUD)
CRUD
CRUD 即增加(Create)、查詢(Retrieve)、更新(Update)、刪除(Delete)四個單詞的首字母縮寫
新增數(shù)據(jù)
語法:
INSERT [INTO] table_name
[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value] ...
示例:
-- 創(chuàng)建一張學(xué)生表
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT,
sn INT comment '學(xué)號',
name VARCHAR(20) comment '姓名',
qq_mail VARCHAR(20) comment 'QQ郵箱'
);
單行數(shù)據(jù) +全列插入
-- 插入兩條記錄,value_list 數(shù)量必須和定義表的列的數(shù)量及順序一致
INSERT INTO student VALUES (100, 10000, '唐三藏', NULL);
INSERT INTO student VALUES (101, 10001, '孫悟空', '11111');
多行數(shù)據(jù)+指定列插入
-- 插入兩條記錄,value_list 數(shù)量必須和指定列數(shù)量及順序一致
INSERT INTO student (id, sn, name) VALUES
(102, 20001, '曹孟德'),
(103, 20002, '孫仲謀');
查詢數(shù)據(jù)
語法
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...
全列查詢
--通常情況下 使用 * 進行全列查詢
SELECT * FROM exam_result;
指定列查詢
--指定列的順序不需要按定義表的順序來
SELECT id ,name FROM?? exam_result;
查詢字段為表達式
-- 表達式不包含字段
SELECT id, name, 10 FROM exam_result;
-- 表達式包含一個字段
SELECT id, name, english + 10 FROM exam_result;
-- 表達式包含多個字段
SELECT id, name, chinese + math + english FROM exam_result;
設(shè)置別名
為查詢結(jié)果中的列指定別名,表示返回的結(jié)果集中,以別名作為該列的名稱
SELECT column [AS] alias_name [...] FROM table_name;
示例:
-- 結(jié)果集中,表頭的列名=別名
SELECT id, name, chinese + math + english 總分 FROM exam_result;
去重查詢
使用DISTINCT關(guān)鍵字對某列數(shù)據(jù)進行去重
示例:
SELECT DISTINCT math FROM exam_result;
排序查詢
- ASC 為升序(從小到大)
- ?DESC 為降序(從大到?。?/strong>
- 默認(rèn)為 ASC
- null數(shù)據(jù)在排序中,視為最小的值
- 排序條件可以是表達式或者子查詢
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
示例:
-- 查詢同學(xué)及總分,由高到低
SELECT name, chinese + english + math FROM exam_result
ORDER BY chinese + english + math DESC;
SELECT name, chinese + english + math total FROM exam_result
ORDER BY total DESC;
?
總結(jié)
-- 全列查詢
select * from 表
-- 指定列查詢
select 字段1,字段2... from 表
-- 查詢表達式字段
select 字段1+100,字段2+字段3 from 表
-- 別名
select 字段1 別名1, 字段2 別名2 from 表
-- 去重DISTINCT
select distinct 字段 from 表
-- 排序ORDER BY
select * from 表 order by 排序字段
-- 條件查詢WHERE:
-- (1)比較運算符 (2)BETWEEN ... AND ... (3)IN (4)IS NULL (5)LIKE (6)AND (7)OR
(8)NOT
select * from 表 where 條件
?
where條件查詢
比較運算符
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的結(jié)果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的結(jié)果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a0 AND a1 |
范圍匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, ...) | 如果是 option 中的任意一個,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多個(包括 0 個)任意字符;_ 表示任意一個字 符 |
邏輯運算符
運算符 | 說明 |
AND | 多個條件必須都為 TRUE(1),結(jié)果才是 TRUE(1) |
OR | 任意一個條件為 TRUE(1), 結(jié)果為 TRUE(1) |
NOT | 條件為 TRUE(1),結(jié)果為 FALSE(0) |
注意:
1. WHERE條件可以使用表達式,但不能使用別名。
2. AND的優(yōu)先級高于OR,在同時使用時,需要使用小括號()包裹優(yōu)先執(zhí)行的部分
分頁查詢
用limit關(guān)鍵字
語法:
-- 起始下標(biāo)為 0
-- 從 0 開始,篩選 n 條結(jié)果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 從 s 開始,篩選 n 條結(jié)果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
-- 從 s 開始,篩選 n 條結(jié)果,比第二種用法更明確,建議使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT? s OFFSET n;
示例:
按 id 進行分頁,每頁 3 條記錄,分別顯示 第 1、2、3 頁
--第 1 頁
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3
OFFSET 0;
-- 第 2 頁
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3
OFFSET 3;
-- 第 3 頁,如果結(jié)果不足 3 個,不會有影響
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3
OFFSET 6;
示例:
--統(tǒng)計數(shù)學(xué)成績總分
ELECT SUM(math) FROM exam_result;
-- 不及格 < 60 的總分,沒有結(jié)果,返回 NULL
SELECT SUM(math) FROM exam_result WHERE math < 60;
聚合函數(shù)查詢
聚合函數(shù)
常見的統(tǒng)計總數(shù)、計算平局值等操作,可以使用聚合函數(shù)來實現(xiàn),常見的聚合函數(shù)有
函數(shù) | 說明 |
COUNT([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 數(shù)量 |
SUM([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 總和,不是數(shù)字沒有意義 |
AVG([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 平均值,不是數(shù)字沒有意義 |
MAX([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 最大值,不是數(shù)字沒有意義 |
MIN([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 最小值,不是數(shù)字沒有意義 |
GROUP BY子句
SELECT 中使用 GROUP BY 子句可以對指定列進行分組查詢。需要滿足:
使用 GROUP BY 進行分組查詢時,SELECT 指定的字段必須是“分組依據(jù)字段”,其他字段若想出現(xiàn)在SELECT 中則必須包含在聚合函數(shù)中
select column1, sum(column2), .. from table group by column1,column3;
示例:
準(zhǔn)備測試的素材
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
role varchar(20) not null,
salary numeric(11,2)
);
insert into emp(name, role, salary) values
('馬云','服務(wù)員', 1000.20),
('馬化騰','游戲陪玩', 2000.99),
('孫悟空','游戲角色', 999.11),
('豬無能','游戲角色', 333.5),
('沙和尚','游戲角色', 700.33),
('隔壁老王','董事長', 12000.66);查詢示例
查詢每個角色的最高工資、最低工資和平均工資
select role,max(salary),min(salary),avg(salary) from emp group by role;
HAVING 子句
GROUP BY 子句進行分組以后,需要對分組結(jié)果再進行條件過濾時,不能使用 WHERE 語句,而需要用HAVING
示例:
顯示平均工資低于1500的角色和它的平均工資
select role,max(salary),min(salary),avg(salary) from emp group by role
having avg(salary)<1500;
聯(lián)合查詢
實際開發(fā)中往往數(shù)據(jù)來自不同的表,所以需要多表聯(lián)合查詢。多表查詢是對多張表的數(shù)據(jù)取笛卡爾積
準(zhǔn)備的測試數(shù)據(jù)
insert into classes(name, `desc`) values
('計算機系2019級1班', '學(xué)習(xí)了計算機原理、C和Java語言、數(shù)據(jù)結(jié)構(gòu)和算法'),
('中文系2019級3班','學(xué)習(xí)了中國傳統(tǒng)文學(xué)'),
('自動化2019級5班','學(xué)習(xí)了機械自動化');
insert into student(sn, name, qq_mail, classes_id) values
('09982','黑旋風(fēng)李逵','xuanfeng@qq.com',1),
('00835','菩提老祖',null,1),
('00391','白素貞',null,1),
('00031','許仙','xuxian@qq.com',1),
('00054','不想畢業(yè)',null,1),
('51234','好好說話','say@qq.com',2),
('83223','tellme',null,2),
('09527','老外學(xué)中文','foreigner@qq.com',2);
insert into course(name) values
('Java'),('中國傳統(tǒng)文化'),('計算機原理'),('語文'),('高階數(shù)學(xué)'),('英文');
insert into score(score, student_id, course_id) values
-- 黑旋風(fēng)李逵
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
-- 菩提老祖
(60, 2, 1),(59.5, 2, 5),
-- 白素貞
(33, 3, 1),(68, 3, 3),(99, 3, 5),
-- 許仙
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
-- 不想畢業(yè)
(81, 5, 1),(37, 5, 5),-- 好好說話
(56, 6, 2),(43, 6, 4),(79, 6, 6),
-- tellme
(80, 7, 2),(92, 7, 6);
內(nèi)連接
語法
select 字段 from 表1 別名1 [inner] join 表2 別名2 on 連接條件 and 其他條件;
select 字段 from 表1 別名1,表2 別名2 where 連接條件 and 其他條件;
示例
查詢所有同學(xué)的總成績,及同學(xué)的個人信息
-- 成績表對學(xué)生表是多對1關(guān)系,查詢總成績是根據(jù)成績表的同學(xué)id來進行分組的
SELECT
stu.sn,
stu.NAME,
stu.qq_mail,
sum( sco.score )
FROM
student stu
JOIN score sco ON stu.id = sco.student_id
GROUP BY
sco.student_id;
外連接
外連接分為左外連接和右外連接。如果聯(lián)合查詢,左側(cè)的表完全顯示我們就說是左外連接;右側(cè)的表完全顯示我們就說是右外連接
語法
-- 左外連接,表1完全顯示
select 字段名 from 表名1 left join 表名2 on 連接條件;
-- 右外連接,表2完全顯示
select 字段 from 表名1 right join 表名2 on 連接條件;
示例
查詢所有同學(xué)的成績,及同學(xué)的個人信息,如果該同學(xué)沒有成績,也需要顯示
- “老外學(xué)中文”同學(xué) 沒有考試成績,也顯示出來了
select * from student stu left join score sco on stu.id=sco.student_id;
-- 對應(yīng)的右外連接為:
select * from score sco right join student stu on stu.id=sco.student_id;
-- 學(xué)生表、成績表、課程表3張表關(guān)聯(lián)查詢
SELECT
stu.id,
stu.sn,
stu.NAME,
stu.qq_mail,
sco.score,
sco.course_id,
cou.NAME
FROM
student stu
LEFT JOIN score sco ON stu.id = sco.student_id
LEFT JOIN course cou ON sco.course_id = cou.id
ORDER BY
stu.id;
自連接
自連接是指在同一張表連接自身進行查詢。
select 字段 from 表1 別名1 join 表1 別名2 on 連接條件? join 表2?別名1 on 條件?join 表12別名2 .......and 其他條件;
示例:
顯示所有“計算機原理”成績比“Java”成績高的成績信息
SELECT
stu.*,
s1.score Java,
s2.score 計算機原理
FROM
score s1? ?JOIN score s2 ON s1.student_id = s2.student_id? ? ?//? 自連接? ?
JOIN student stu ON s1.student_id = stu.id
JOIN course c1 ON s1.course_id = c1.id
JOIN course c2 ON s2.course_id = c2.id
AND s1.score < s2.score
AND c1.NAME = 'Java'
AND c2.NAME = '計算機原理';拆分上述語句得到一下的分步執(zhí)行的語句
-- 1.先查詢“計算機原理”和“Java”課程的id
select id,name from course where name='Java' or name='計算機原理';
-- 2. 再查詢成績表中,“計算機原理”成績比“Java”成績 好的信息
SELECT
s1.*
FROM
score s1,
score s2
WHERE
s1.student_id = s2.student_idAND s1.score < s2.score
AND s1.course_id = 1
AND s2.course_id = 3;
-- 也可以使用join on 語句來進行自連接查詢
SELECT
s1.*
FROM
score s1
JOIN score s2 ON s1.student_id = s2.student_id
AND s1.score < s2.score
AND s1.course_id = 1
AND s2.course_id = 3;
子查詢
子查詢是指嵌入在其他sql語句中的select語句,也叫嵌套查詢
單行子查詢:返回一行記錄的子查詢
-- 單行子查詢
select ... from 表1 where 字段1 = (select ... from ...);
示例
查詢與“不想畢業(yè)” 同學(xué)的同班同學(xué)
select * from student where classes_id=(select classes_id from student where
name='不想畢業(yè)');
多行子查詢:返回多行記錄的子查詢
-- [NOT] IN
select ... from 表1 where 字段1 in (select ... from ...);
-- [NOT] EXISTS
select ... from 表1 where exists (select ... from ... where 條件);
-- 臨時表:form子句中的子查詢
select ... from 表1, (select ... from ...) as tmp where 條件
示例
案例:查詢“語文”或“英文”課程的成績信息
. [NOT] IN關(guān)鍵字
--使用INselect * from score where course_id in (select id from course where
name='語文' or name='英文');
-- 使用 NOT IN
select * from score where course_id not in (select id from course where
name!='語文' and name!='英文');
可以使用多列包含:
-- 插入重復(fù)的分?jǐn)?shù):score, student_id, course_id列重復(fù)
insert into score(score, student_id, course_id) values
-- 黑旋風(fēng)李逵
(70.5, 1, 1),(98.5, 1, 3),
-- 菩提老祖
(60, 2, 1);
-- 查詢重復(fù)的分?jǐn)?shù)
SELECT
*
FROM
score
WHERE
( score, student_id, course_id ) IN ( SELECT score, student_id,
course_id FROM score GROUP BY score, student_id, course_id HAVING
count( 0 ) > 1 );
[NOT] EXISTS關(guān)鍵字-- 使用 EXISTS
select * from score sco where exists (select sco.id from course cou
where (name='語文' or name='英文') and cou.id = sco.course_id);
-- 使用 NOT EXISTS
select * from score sco where not exists (select sco.id from course cou
where (name!='語文' and name!='英文') and cou.id = sco.course_id);
?在from子句中使用子查詢:子查詢語句出現(xiàn)在from子句中。這里要用到數(shù)據(jù)查詢的技巧,把一個子查詢當(dāng)做一個臨時表使用。
查詢所有比“中文系2019級3班”平均分高的成績信息
-- 獲取“中文系2019級3班”的平均分,將其看作臨時表
SELECT
avg( sco.score ) score
FROM
score sco
JOIN student stu ON sco.student_id = stu.id
JOIN classes cls ON stu.classes_id = cls.id
WHERE
cls.NAME = '中文系2019級3班';
查詢成績表中,比以上臨時表平均分高的成績
SELECT
*
FROM
score sco,
(
SELECT
avg( sco.score ) score
FROM
score sco
JOIN student stu ON sco.student_id = stu.id
JOIN classes cls ON stu.classes_id = cls.id
WHERE
cls.NAME = '中文系2019級3班'
) tmp
WHERE
sco.score > tmp.score;
?
C
在實際應(yīng)用中,為了合并多個select的執(zhí)行結(jié)果,可以使用集合操作符 union,union all。使用
-- UNION:去除重復(fù)數(shù)據(jù)(操作符用于取得兩個結(jié)果集的并集。當(dāng)使用該操作符時,會自動去掉結(jié)果集中的重復(fù)行。)
select ... from ... where 條件
union
select ... from ... where 條件
-- UNION ALL:不去重(該操作符用于取得兩個結(jié)果集的并集。當(dāng)使用該操作符時,不會去掉結(jié)果集中的重復(fù)行)
select ... from ... where 條件
union all
select ... from ... where 條件
-- 使用UNION和UNION ALL時,前后查詢的結(jié)果集中,字段需要一致
示例
UNION
和UNION ALL時,前后查詢的結(jié)果集中,字段需要一致
案例:查詢id小于3,或者名字為“英文”的課程:
select * from course where id<3
union
select * from course where name='英文';
-- 或者使用or來實現(xiàn)
select * from course where id<3 or name='英文';union all
案例:查詢id小于3,或者名字為“Java”的課程
-- 可以看到結(jié)果集中出現(xiàn)重復(fù)數(shù)據(jù)Java
select * from course where id<3
union all
select * from course where name='英文';
修改數(shù)據(jù)
語法
update 表 set 字段1=value1, 字段2=value2... where 條件
示例
-- 將孫悟空同學(xué)的數(shù)學(xué)成績變更為 80 分
UPDATE exam_result SET math = 80 WHERE name = '孫悟空';
-- 將曹孟德同學(xué)的數(shù)學(xué)成績變更為 60 分,語文成績變更為 70 分
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';
-- 將總成績倒數(shù)前三的 3 位同學(xué)的數(shù)學(xué)成績加上 30 分
UPDATE exam_result SET math = math + 30 ORDER BY chinese + math + english LIMIT
3;
-- 將所有同學(xué)的語文成績更新為原來的 2 倍
UPDATE exam_result SET chinese = chinese * 2;
刪除數(shù)據(jù)
語法
delete from 表 where 條件
示例
-- 刪除孫悟空同學(xué)的考試成績
DELETE FROM exam_result WHERE name = '孫悟空';
-- 刪除整張表數(shù)據(jù)
-- 準(zhǔn)備測試表
DROP TABLE IF EXISTS for_delete;
CREATE TABLE for_delete (
id INT,
name VARCHAR(20)
);
-- 插入測試數(shù)據(jù)
INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');
-- 刪除整表數(shù)據(jù)
DELETE FROM for_delete;
數(shù)據(jù)庫約束
- NOT NULL - 指示某列不能為空
- UNIQUE - 保證某列的每行必須有唯一,不重復(fù)的。
- DEFAULT - 規(guī)定沒有給列賦值時的默認(rèn)值。
- PRIMARY KEY - 主鍵約束,與?NOT NULL 和 UNIQUE 的結(jié)合。確保某列(或兩個列多個列的結(jié)合)有唯一標(biāo)識,有助于更容易更快速地找到表中的一個特定的記錄。
- FOREIGN KEY - 外鍵約束,保證一個表中的數(shù)據(jù)匹配另一個表中的值的參照完整性。
- CHECK - 保證列中的值符合指定的條件。對于MySQL數(shù)據(jù)庫,對CHECK子句進行分析,但是忽略CHECK子句。
索引
索引,相當(dāng)于目錄,它是一種特殊的文件包含著對數(shù)據(jù)表里所有記錄的引用指針??梢詭椭覀兛焖俣ㄎ?,檢索數(shù)據(jù)。
注意:創(chuàng)建索引會占用額外的磁盤空間,插入或修改操作效率不高,通常建議使用在需要大量進行查詢的場合。
?使用方法:
創(chuàng)建主鍵約束(PRIMARY KEY)、唯一約束(UNIQUE)、外鍵約束(FOREIGN KEY)時,會自動創(chuàng)建對應(yīng)列的索引。
查看索引
show index from 表名;
示例:
查看學(xué)生表已有的索引
show index from student;
創(chuàng)建索引
對于非主鍵、非唯一約束、非外鍵的字段,可以創(chuàng)建普通索引
create index 索引名 on 表名(字段名);
示例
創(chuàng)建班級表中,name字段的索引
create index idx_classes_name on classes(name);
刪除索引
drop index 索引名 on 表名;
示例
刪除班級表中name字段的索引
drop index idx_classes_name on classes;
事務(wù)
試想一下,當(dāng)你媽媽給你打生活費的時候,她給你轉(zhuǎn)賬但是數(shù)據(jù)庫掛掉了,那邊顯示轉(zhuǎn)賬成功了,金額減少了2000,但是你的賬戶并沒有增加2000。這個時候是不是就很難受,那么這個問題該怎么解決呢?
那就讓這里兩個操作要么同時成功,要么同時失敗。這就是事務(wù)的邏輯。
事務(wù)指邏輯上的一組操作,組成這組操作的各個單元,要么全部成功,要么全部失敗。
使用
- (1)開啟事務(wù):start transaction;
- (2)執(zhí)行多條SQL語句
- (3)回滾或提交:rollback/commit;
說明:rollback即是全部失敗,commit即是全部成功。
示例:
start transaction;
-- 阿里巴巴賬戶減少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盜賬戶增加2000
update accout set money=money+2000 where name = '四十大盜';
commit;文章來源:http://www.zghlxwxcb.cn/news/detail-432363.html
【以上就是本文分享的全部內(nèi)容,下一篇JDBC編程,敬請期待~~】文章來源地址http://www.zghlxwxcb.cn/news/detail-432363.html
到了這里,關(guān)于Mysql數(shù)據(jù)庫基礎(chǔ)知識總復(fù)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!