久久国产精品一区二区_欧美成年网站_国产精品成人国产_亚洲欧美日韩在线观看a三区_在线成人动漫_国产乱码精品一品二品_一级毛片在线看_美女免费视频一区二区_亚洲综合图片_亚洲精品tv久久久久久久久久

外貿(mào)領(lǐng)航
首頁(yè)外貿(mào)學(xué)堂 > mysql基礎(chǔ)知識(shí)總結(jié)「MySQL數(shù)據(jù)庫(kù)原理、設(shè)計(jì)與應(yīng)用」

mysql基礎(chǔ)知識(shí)總結(jié)「MySQL數(shù)據(jù)庫(kù)原理、設(shè)計(jì)與應(yīng)用」

來(lái)源:互聯(lián)網(wǎng) 2023-05-17 22:32:23
mysql是啥?數(shù)據(jù)庫(kù)又是啥?MySQL:

MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在 WEB 應(yīng)用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))應(yīng)用軟件之一。

數(shù)據(jù)庫(kù):

數(shù)據(jù)庫(kù)(Database)是按照數(shù)據(jù)結(jié)構(gòu)來(lái)組織、存儲(chǔ)和管理數(shù)據(jù)的倉(cāng)庫(kù)。

每個(gè)數(shù)據(jù)庫(kù)都有一個(gè)或多個(gè)不同的 API 用于創(chuàng)建,訪問(wèn),管理,搜索和復(fù)制所保存的數(shù)據(jù)。

我們也可以將數(shù)據(jù)存儲(chǔ)在文件中,但是在文件中讀寫(xiě)數(shù)據(jù)速度相對(duì)較慢。

所以,我們使用關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)一般是用來(lái)存儲(chǔ)和管理大數(shù)據(jù)量。

關(guān)系型數(shù)據(jù)庫(kù)(SQL):關(guān)系型數(shù)據(jù)庫(kù)指的是使用關(guān)系模型(二維表格模型)來(lái)組織數(shù)據(jù)的數(shù)據(jù)庫(kù)。

非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL):非關(guān)系型數(shù)據(jù)庫(kù)又被稱為 NoSQL(Not Only SQL ),意為不僅僅是 SQL。通常指數(shù)據(jù)以對(duì)象的形式存儲(chǔ)在數(shù)據(jù)庫(kù)中,而對(duì)象之間的關(guān)系通過(guò)每個(gè)對(duì)象自身的屬性來(lái)決定,常用于存儲(chǔ)非結(jié)構(gòu)化的數(shù)據(jù)。

MySQL安裝及配置首先先下載到一個(gè)文件夾中下載后在環(huán)境變量中Path路徑 添加MySQL的bin目錄的路徑在 mysql-5.7.19-winx64 文件夾中 創(chuàng)建一個(gè) my.ini 文件,內(nèi)容為:[client] port=3306 default-character-set=utf8 [mysqld] #設(shè)置為自己MYSQL的安裝目錄 basedir=D:hspmysqlmysql-5.7.19-winx64 #設(shè)置為MYSQL的數(shù)據(jù)目錄 datadir=E:mysql-5.7.19-winx64data port=3306 character_set_server=utf8 ##跳過(guò)安全檢查,注銷后,需要輸入正確的用戶名和密碼才能啟動(dòng) skip-grant-tables使用管理員的身份打開(kāi)cmd,并切換到安裝的MySQL的bin目錄底下,執(zhí)行 mysqld-install初始化數(shù)據(jù)庫(kù):mysqld --initialize-insecure --user=MySQL 此句執(zhí)行后就會(huì)生成一個(gè) data 目錄啟動(dòng)服務(wù) net start mysql (要看MySQL服務(wù)是否啟動(dòng)可以去任務(wù)管理器的服務(wù)欄看)關(guān)閉服務(wù) net stop mysql進(jìn)入MySQL管理終端 mysql -u root -p使用MySQL數(shù)據(jù)庫(kù) :use mysql; 然后 UPDATE user SET authentication_string = PASSWORD('新的密碼') WHERE user = 'dbadmin' AND host = 'localhost'; FLUSH PRIVILEGES; 這句表示刷新一下權(quán)限quit 指退出管理終端

如果真在 5-10步驟中哪里出了非錯(cuò),可刪除MySQL后重新配置服務(wù) (sc delete mysql 該語(yǔ)句工作時(shí)一定要慎用!!)

4~7步一定要以管理員身份運(yùn)行控制臺(tái)才行

MySQL的服務(wù),默認(rèn)是“啟動(dòng)”的狀態(tài),只有啟動(dòng)了mysql才能用。默認(rèn)情況下是“自動(dòng)”啟動(dòng),自動(dòng)啟動(dòng)表示下一次重啟操作系統(tǒng)的時(shí)候自動(dòng)啟動(dòng)該服務(wù)。

可以在服務(wù)上點(diǎn)擊右鍵: 啟動(dòng) 重啟服務(wù) 停止服務(wù) ...

還可以改變服務(wù)的默認(rèn)配置: 服務(wù)上點(diǎn)擊右鍵,屬性,然后可以選擇啟動(dòng)方式: 自動(dòng)(延遲啟動(dòng)) 自動(dòng) 手動(dòng) 禁用

在windows操作系統(tǒng)當(dāng)中,怎么使用命令來(lái)啟動(dòng)和關(guān)閉mysql服務(wù)呢? 語(yǔ)法: net stop 服務(wù)名稱; net start 服務(wù)名稱;

其它服務(wù)的啟停都可以采用以上的命令。使用命令行窗口連接MySQL數(shù)據(jù)庫(kù):

首先,MySQL是一種服務(wù)(可在任務(wù)管理器服務(wù)欄中查看到MySQL),而只要是一個(gè)服務(wù)都會(huì)監(jiān)聽(tīng)一個(gè)端口

mysql -h 主機(jī)IP -P 端口 -u 用戶名 -p密碼 ( p和密碼間不要有空格,如果-p后面沒(méi)有寫(xiě)密碼,回車后會(huì)要求輸入密碼 )

如果不寫(xiě) -h 主機(jī)IP,默認(rèn)就是連接到本地如果不寫(xiě)-P 端口,默認(rèn)就是3306在實(shí)際工作中往往會(huì)修改端口號(hào)而不是使用此默認(rèn)端口號(hào),此處為了方便就不做改動(dòng)了MySQL數(shù)據(jù)庫(kù)的三層結(jié)構(gòu)數(shù)據(jù)在數(shù)據(jù)庫(kù)中的存儲(chǔ)形式

以表格的形式存儲(chǔ)數(shù)據(jù)

任何一張表都有行和列:

行(row):被稱為數(shù)據(jù)/記錄。 列(column):被稱為字段。

每一個(gè)字段都有:字段名、數(shù)據(jù)類型、約束等屬性。 字段名可以理解是一個(gè)普通的名字,見(jiàn)名知意就行。 數(shù)據(jù)類型:字符串,數(shù)字,日期等。

什么是SQL語(yǔ)句?

SQL:結(jié)構(gòu)化查詢語(yǔ)言 程序員需要學(xué)習(xí)SQL語(yǔ)句,程序員通過(guò)編寫(xiě)SQL語(yǔ)句,然后DBMS負(fù)責(zé)執(zhí)行SQL 語(yǔ)句,最終來(lái)完成數(shù)據(jù)庫(kù)中數(shù)據(jù)的增刪改查操作。

SQL語(yǔ)句分類

DQL:數(shù)據(jù)查詢語(yǔ)言[select…… ]

DML:數(shù)據(jù)操作語(yǔ)言[增加insert ,修改update,刪除delete] 操作的是表中的數(shù)據(jù)

DDL:數(shù)據(jù)定義語(yǔ)言[create、drop、alter] 操作的是表的結(jié)構(gòu)

DCL:數(shù)據(jù)控制語(yǔ)言[管理數(shù)據(jù)庫(kù),比如:授權(quán)grant、撤銷權(quán)限r(nóng)evoke.... ]

TCL:事務(wù)控制語(yǔ)言 [如:事務(wù)提交:commit; 事務(wù)回滾:rollback;]

數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)管理系統(tǒng)、SQL之間的關(guān)系

三者之間的關(guān)系? DBMS通過(guò)執(zhí)行SQL來(lái)操作DB

先安裝數(shù)據(jù)庫(kù)管理系統(tǒng)MySQL,然后學(xué)習(xí)SQL語(yǔ)句怎么寫(xiě),編寫(xiě)SQL語(yǔ)句之后,DBMS 對(duì)SQL語(yǔ)句進(jìn)行執(zhí)行,最終來(lái)完成數(shù)據(jù)庫(kù)的數(shù)據(jù)管理。

常用命令注意:這些命令不區(qū)分大小寫(xiě)都行。注意:mysql是不見(jiàn)“;”不執(zhí)行,“;”表示結(jié)束!

退出exit; 或者 quit;

查看mysql數(shù)據(jù)庫(kù)的版本號(hào): select version();

查看mysql中有哪些數(shù)據(jù)庫(kù)? show databases; 注意:以分號(hào)結(jié)尾,分號(hào)是英文的分號(hào)。

mysql默認(rèn)自帶了4個(gè)數(shù)據(jù)庫(kù)。

怎么選擇使用某個(gè)數(shù)據(jù)庫(kù)呢? mysql> use test; 表示使用一個(gè)名字叫做test的數(shù)據(jù)庫(kù)。

查看當(dāng)前使用的是哪個(gè)數(shù)據(jù)庫(kù)? mysql> select database();

導(dǎo)入一下提前準(zhǔn)備好的數(shù)據(jù): bjpowernode.sql 是提前為練習(xí)準(zhǔn)備的數(shù)據(jù)庫(kù)表。 怎么將sql文件中的數(shù)據(jù)導(dǎo)入呢?(可以將文件拖入source空格 后) 要在使用某個(gè)數(shù)據(jù)庫(kù)后才能使用該語(yǔ)句 mysql> source D:course03-MySQLdocumentbjpowernode.sql

注意:路徑中不要有中文!!!!

不看表中的數(shù)據(jù),只看表的結(jié)構(gòu),有一個(gè)命令: desc 表名;

簡(jiǎn)單查詢查詢一個(gè)字段?

select 字段名 from 表名;

查詢兩個(gè)字段,或者多個(gè)字段怎么辦? 使用逗號(hào)隔開(kāi)“,”

查詢所有字段?

使用:select * from 表名;

別把把這種寫(xiě)法寫(xiě)到 Java 程序中,因?yàn)榈綍r(shí)還要把 * 先轉(zhuǎn)換成字段

缺點(diǎn):①效率低 ②可讀性差。

在實(shí)際開(kāi)發(fā)中不建議,可以自己玩沒(méi)問(wèn)題。 你可以在DOS命令窗口中想快速的看一看全表數(shù)據(jù)可以采用這種方式。

給查詢的列起別名?

使用 as 關(guān)鍵字,可以省略 select deptno,dname as deptname from dept;

假設(shè)起別名的時(shí)候,別名里面有空格,怎么辦? mysql> select deptno,dname dept name from dept; DBMS看到這樣的語(yǔ)句,進(jìn)行SQL語(yǔ)句的編譯,不符合語(yǔ)法,編譯報(bào)錯(cuò)。 怎么解決? select deptno,dname 'dept name' from dept; //加單引號(hào) select deptno,dname "dept name" from dept; //加雙引號(hào)

注意:在所有的數(shù)據(jù)庫(kù)當(dāng)中,字符串統(tǒng)一使用單引號(hào)括起來(lái), 單引號(hào)是標(biāo)準(zhǔn),雙引號(hào)在oracle數(shù)據(jù)庫(kù)中用不了。但是在mysql 中可以使用。

再次強(qiáng)調(diào):數(shù)據(jù)庫(kù)中的字符串都是采用單引號(hào)括起來(lái)。這是標(biāo)準(zhǔn)的。 雙引號(hào)不標(biāo)準(zhǔn)。字段可以使用數(shù)學(xué)表達(dá)式

select ename,sal*12 from emp;

顯示時(shí)字段名是 sal*12 這樣時(shí)一般取個(gè)別名 select ename,sal*12 year_sal from emp;

條件查詢什么是條件查詢?

查詢出來(lái)符合條件的 ? 語(yǔ)法格式: ? select ? 字段1,字段2,字段3.... ? from ? 表名 ? where ? 條件;

都有哪些條件?

= 等于查詢薪資等于800的員工姓名和編號(hào)? select empno,ename from emp where sal = 800;

<> 或 != 不等于查詢薪資不等于800的員工姓名和編號(hào)? select empno,ename from emp where sal != 800;

同理還有:<=,<,>=,>

between … and …. 兩個(gè)值之間, 等同于 >= and <=

查詢薪資在2450和3000之間的員工信息?包括2450和3000?

注意: 使用between and的時(shí)候,必須遵循左小右大。 between and是閉區(qū)間,包括兩端的值。is null 表示為 null(is not null 不為空)

查詢哪些員工的津貼/補(bǔ)助為null? select empno,ename,sal,comm from emp where comm = null;( 像這樣用=是查不到的 ) Empty set (0.00 sec)

注意:在數(shù)據(jù)庫(kù)當(dāng)中null不能使用等號(hào)進(jìn)行衡量。需要使用is null 因?yàn)閿?shù)據(jù)庫(kù)中的null代表什么也沒(méi)有,它不是一個(gè)值,所以不能使用 等號(hào)衡量。

正確的:select empno,ename,sal,comm from emp where comm is null;

and 并且查詢工作崗位是MANAGER并且工資大于2500的員工信息?

select empno,ename,job,sal from emp where job = 'MANAGER' and sal > 2500;

or 或者

查詢工作崗位是MANAGER或SALESMAN的員工?

select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';

and和or同時(shí)出現(xiàn)的話,有優(yōu)先級(jí)問(wèn)題嗎?(開(kāi)發(fā)中如不記得優(yōu)先級(jí),加小括號(hào))查詢工資大于2500,并且部門編號(hào)為10或20部門的員工? select * from emp where sal > 2500 and deptno = 10 or deptno = 20; 分析以上語(yǔ)句的問(wèn)題? and優(yōu)先級(jí)比or高。 以上語(yǔ)句會(huì)先執(zhí)行and,然后執(zhí)行or。 以上這個(gè)語(yǔ)句表示什么含義? 找出工資大于2500并且部門編號(hào)為10的員工,或者20部門所有員工找出來(lái)。 正確做法:select * from emp where sal > 2500 and (deptno = 10 or deptno = 20);

in 包含,相當(dāng)于多個(gè) or (not in 不在這個(gè)范圍中)查詢工作崗位是MANAGER和SALESMAN的員工? select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN'; select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');

注意:in不是一個(gè)區(qū)間。in后面跟的是具體的值。

查詢薪資是800和5000的員工信息? select ename,sal from emp where sal = 800 or sal = 5000; select ename,sal from emp where sal in(800, 5000); //這個(gè)不是表示800到5000都找出來(lái)。

not in 表示不在這幾個(gè)值當(dāng)中的數(shù)據(jù)。select ename,sal from emp where sal not in(800, 5000, 3000);

not 可以取非,主要用在 is 或 in 中 is null is not null in not inlike 稱為模糊查詢,支持%或下劃線匹配 %匹配任意多個(gè)字符 下劃線:任意一個(gè)字符。 (%是一個(gè)特殊的符號(hào),_ 也是一個(gè)特殊符號(hào))

找出名字中含有O的? mysql> select ename from emp where ename like '%O%';

找出名字以T結(jié)尾的? select ename from emp where ename like '%T';

找出名字以K開(kāi)始的? select ename from emp where ename like 'K%';

找出第二個(gè)字每是A的? select ename from emp where ename like '_A%';

找出第三個(gè)字母是R的? select ename from emp where ename like '__R%';

找出名字中有“_”的? select name from t_student where name like '%_%'; //這樣不行。

正確: select name from t_student where name like '%_%'; // 轉(zhuǎn)義字符。

對(duì)查詢結(jié)果排序排序 order by( 默認(rèn)是升序!!!)

查詢所有員工薪資,排序? select ename,sal from emp order by sal;

怎么降序(后面加上desc)?

指定降序: select ename,sal from emp order by sal desc;

可以兩個(gè)字段排序嗎?或者說(shuō)按照多個(gè)字段排序? 查詢員工名字和薪資,要求按照薪資升序,如果薪資一樣的話, 再按照名字升序排列。 select ename,sal from emp order by sal desc, ename asc; // sal在前,起主導(dǎo),只有sal相等的時(shí)候,才會(huì)考慮啟用ename排序。

了解內(nèi)容:根據(jù)字段的位置也可以排序 select ename,sal from emp order by 2; // 2表示第二列。第二列是sal 按照查詢結(jié)果的第2列sal排序。

了解一下,不建議在開(kāi)發(fā)中這樣寫(xiě),因?yàn)椴唤选?因?yàn)榱械捻樞蚝苋菀装l(fā)生改變,列順序修改之后,2就廢了

綜合一點(diǎn)的案例: 找出工資在1250到3000之間的員工信息,要求按照薪資降序排列。 select ename,sal from emp where sal between 1250 and 3000 order by sal desc;

以上語(yǔ)句的執(zhí)行順序必須掌握: 第一步:from 第二步:where 第三步:select 第四步:order by數(shù)據(jù)處理函數(shù)

數(shù)據(jù)處理函數(shù)又被稱為單行處理函數(shù)

單行處理函數(shù)的特點(diǎn):一個(gè)輸入對(duì)應(yīng)一個(gè)輸出。

和單行處理函數(shù)相對(duì)的是:多行處理函數(shù)。(多行處理函數(shù)特點(diǎn):多個(gè)輸入,對(duì)應(yīng)1個(gè)輸出!)

常見(jiàn)的單行處理行數(shù)

lower 轉(zhuǎn)換小寫(xiě)select lower(ename) as ename from emp;

-------- | ename | -------- | smith || allen || ward || jones || martin || blake || clark || scott || king || turner || adams || james || ford || miller | -------- 14個(gè)輸入,最后還是14個(gè)輸出。這是單行處理函數(shù)的特點(diǎn)。

upper 轉(zhuǎn)換大寫(xiě)select upper(name) as name from t_student;

substr 取子串(substr( 被截取的字符串, 起始下標(biāo),截取的長(zhǎng)度))select substr(ename, 1, 1) as ename from emp; 注意:起始下標(biāo)從1開(kāi)始,沒(méi)有0.

LEFT (string2 ,length )從 string2 中的左邊起取 length 個(gè)字符

RIGHT (string2 ,length ) 從 string2 中的右邊起取 length 個(gè)字符

找出員工名字第一個(gè)字母是A的員工信息? 第一種方式:模糊查詢 select ename from emp where ename like 'A%'; 第二種方式:substr函數(shù) select ename from emp where substr(ename,1,1) = 'A';

學(xué)生名字首字母大寫(xiě)?

select concat(upper(substr(name,1,1)),substr(name,2,length(name) - 1)) as result from t_student;

注意:字符串拼接一定要用concat而不能用

像這樣不行:select upper(substr(name,1,1)) substr(name,2,length(name) - 1) from t_student;

concat函數(shù)進(jìn)行字符串的拼接select concat(empno,ename) from emp;

可以拼接多個(gè)concat(……,……,……)

length 取長(zhǎng)度select length(ename) enamelength from emp;

trim 去兩邊空格

select * from emp where ename = trim(' KING');

RTrim切除右邊的空格,LTrim切除左邊的空格

str_to_date 將字符串轉(zhuǎn)換成日期 date_format 格式化日期 format 設(shè)置千分位

(后面講)

一個(gè)詭異的現(xiàn)象

select 'abc' as bieming from emp; // select后面直接跟“字面量/字面值”

--------- | bieming | --------- | abc | | abc | | abc | | abc | | abc | | abc | | abc | | abc | | abc | | abc | | abc | | abc | | abc | | abc | ---------

select abc from emp; ERROR 1054 (42S22): Unknown column 'abc' in 'field list' 這樣肯定報(bào)錯(cuò),因?yàn)闀?huì)把a(bǔ)bc當(dāng)做一個(gè)字段的名字,去emp表中找abc字段去了。

結(jié)論:select后面可以跟某個(gè)表的字段名(可以等同看做變量名),也可以跟字面量/字面值(數(shù)據(jù))。select 21000 as num from dept;// 21000也是被當(dāng)做一個(gè)字面量/字面值。

------- | num | ------- | 21000 | | 21000 | | 21000 | | 21000 | ------- round(要操作的數(shù), 保留幾位小數(shù)) 四舍五入

select round(21000.4, 0) as num from dept; //結(jié)果和上面一樣

select round(1236.567, -1); // 保留到十位。

rand() 生成隨機(jī)數(shù) 在 0 ≤ 隨機(jī)數(shù) ≤ 1.0 select floor(rand()*100); // 100以內(nèi)的隨機(jī)數(shù)

如果使用 rand(seed) 返回隨機(jī)數(shù), 范圍 0 ≤ 隨機(jī)數(shù) ≤ 1.0, 如果 seed 不變,多次執(zhí)行返回的結(jié)果也是不變的

ifnull是空處理函數(shù)。專門處理空的,可以將 null 轉(zhuǎn)換成一個(gè)具體值

在所有的數(shù)據(jù)庫(kù)當(dāng)中,只要有null參與了數(shù)學(xué)運(yùn)算,最終結(jié)果就是NULL

計(jì)算每個(gè)員工的年薪?

select ename, (sal ifnull(comm, 0))*12 year_sal from emp;

case..when..then..when..then..else..end 當(dāng)員工的工作崗位是MANAGER的時(shí)候,工資上調(diào)10%,當(dāng)工作崗位是SALESMAN的時(shí)候,工資上調(diào)50%,其它正常。 (注意:不修改數(shù)據(jù)庫(kù),只是將查詢結(jié)果顯示為工資上調(diào)) select ename, job, sal as oldsal, (case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal from emp;

select 后可以不接from 當(dāng)作簡(jiǎn)單的測(cè)試工具

等同于接了from dual;

dual為 亞元表, 系統(tǒng)表 可以作為測(cè)試表使用

select round(3.14, 3);

---------------- | round(3.14, 3) | ---------------- | 3.140 | ----------------

select concat('13','57','9');

----------------------- | concat('13','57','9') | ----------------------- | 13579 | ----------------------- 多行處理函數(shù)五個(gè)分組函數(shù)

多行處理函數(shù)也叫分組函數(shù)

多行處理函數(shù)的特點(diǎn):輸入多行,最終輸出一行。

5個(gè): count 計(jì)數(shù) sum 求和 avg 平均值 max 最大值 min 最小值

注意: 分組函數(shù)在使用的時(shí)候必須先進(jìn)行分組,然后才能用。 如果你沒(méi)有對(duì)數(shù)據(jù)進(jìn)行分組,整張表默認(rèn)為一組。

找出最高工資? mysql> select max(sal) from emp;

找出最低工資? mysql> select min(sal) from emp;

計(jì)算工資和: mysql> select sum(sal) from emp;

計(jì)算平均工資: mysql> select avg(sal) from emp;

計(jì)算員工數(shù)量? mysql> select count(ename) from emp;

計(jì)算員工數(shù)量? mysql> select count(ename) from emp;

注意:如果count中填的是表達(dá)式的話,要加上 or null, 因?yàn)?Mysql 中 count() 函數(shù)的一般用法是統(tǒng)計(jì)字段非空的記錄數(shù),利用這個(gè)特點(diǎn)來(lái)進(jìn)行條件統(tǒng)計(jì),如果字段是 NULL 就不會(huì)統(tǒng)計(jì),但是 false 是會(huì)被統(tǒng)計(jì)到的分組函數(shù)在使用的時(shí)候需要注意哪些?分組函數(shù)自動(dòng)忽略NULL,你不需要提前對(duì)NULL進(jìn)行處理。

mysql> select sum(comm) from emp;

----------- | sum(comm) | ----------- | 2200.00 | ----------- 分組函數(shù)中count(*) 和 count(具體字段) 有什么區(qū)別?

count(具體字段):表示統(tǒng)計(jì)該字段下所有不為NULL的元素的總數(shù)。 count(*):統(tǒng)計(jì)表當(dāng)中的總行數(shù)。(只要有一行數(shù)據(jù)count則 ) 每一行記錄不可能都為NULL(不存在一行全為null的表),一行數(shù)據(jù)中有一列不為NULL,則這行數(shù)據(jù)就是有效的。

mysql> select count(*) from emp; ---------- | count(*) | ---------- | 14 | ---------- ?mysql> select count(comm) from emp; ------------- | count(comm) | ------------- | 4 | ------------- 分組函數(shù)不能直接使用在where子句中

找出比最低工資高的員工信息。 select ename,sal from emp where sal > min(sal); 表面上意思感覺(jué)是沒(méi)問(wèn)題,運(yùn)行一下發(fā)現(xiàn): ERROR 1111 (HY000): Invalid use of group function ????????????????????????????????????????????????????????????????????? 分組函數(shù)在使用的時(shí)候必須先進(jìn)行分組,而分組的group by 執(zhí)行順序是在where后的,也就是讓分組函數(shù) min 先于分組了,所以會(huì)報(bào)錯(cuò)

所有的分組函數(shù)可以組合起來(lái)一起用

select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;

---------- ---------- ---------- ------------- ---------- | sum(sal) | min(sal) | max(sal) | avg(sal) | count(*) | ---------- ---------- ---------- ------------- ---------- | 29025.00 | 800.00 | 5000.00 | 2073.214286 | 14 | ---------- ---------- ---------- ------------- ---------- 分組查詢

在實(shí)際的應(yīng)用中,可能有這樣的需求, 需要先進(jìn)行分組,然后對(duì)每一組的數(shù)據(jù)進(jìn)行操作。 這個(gè)時(shí)候我們需要使用分組查詢,怎么進(jìn)行分組查詢呢? select ... from ... group by ... 計(jì)算每個(gè)部門的工資和? 計(jì)算每個(gè)工作崗位的平均薪資? 找出每個(gè)工作崗位的最高薪資? ....

將之前的關(guān)鍵字全部組合在一起,他們的執(zhí)行順序? select ... from ... where ... group by ... order by ...

以上關(guān)鍵字的順序不能顛倒,需要記住。執(zhí)行順序是什么? 1.from 2.where 3.group by 4.select 5.order by

為什么分組函數(shù)不能直接使用在where后面? select ename,sal from emp where sal > min(sal);//報(bào)錯(cuò)。 因?yàn)榉纸M函數(shù)在使用的時(shí)候必須先分組之后才能使用。 where執(zhí)行的時(shí)候,還沒(méi)有分組。所以where后面不能出現(xiàn)分組函數(shù)。

select sum(sal) from emp; ? 這個(gè)沒(méi)有分組,為啥sum()函數(shù)可以用呢? ? 因?yàn)閟elect在group by之后執(zhí)行。

找出每個(gè)工作崗位的工資和? 實(shí)現(xiàn)思路:按照工作崗位分組,然后對(duì)工資求和。 select job,sum(sal) from emp group by job;

----------- ---------- | job | sum(sal) | ----------- ---------- | ANALYST | 6000.00 || CLERK | 4150.00 || MANAGER | 8275.00 || PRESIDENT | 5000.00 || SALESMAN | 5600.00 | ----------- ---------- 以上這個(gè)語(yǔ)句的執(zhí)行順序?先從emp表中查詢數(shù)據(jù)。根據(jù)job字段進(jìn)行分組。然后對(duì)每一組的數(shù)據(jù)進(jìn)行sum(sal)重點(diǎn)結(jié)論: 在一條select語(yǔ)句當(dāng)中,如果有g(shù)roup by語(yǔ)句的話, select后面只能跟:參加分組的字段,以及分組函數(shù)。 其它的一律不能跟。找出“每個(gè)部門,不同工作崗位”的最高薪資?

兩個(gè)字段聯(lián)合分組select deptno, job, max(sal) from emp group by deptno, job;

使用having對(duì)分組后的數(shù)據(jù)進(jìn)一步過(guò)濾

having不能單獨(dú)使用,having不能代替where,having必須和group by聯(lián)合使用。

找出每個(gè)部門最高薪資,要求顯示最高薪資大于3000的?

select deptno, max(sal) from emp group by deptno having max(sal) > 3000;

單表查詢大總結(jié)

select ? ... ? from ? ... ? where ? ... ? group by ? ... ? having ? ... ? order by ? ...

執(zhí)行順序?

1.from

2.where

3.group by

4.having

5.select

6.order by

找出除MANAGER崗位之外,每個(gè)崗位的平均薪資,要求顯示平均薪資大于1500的, 要求按照平均薪資降序排。

select job, avg(sal) from emp where job != 'MANAGER' group by job having avg(sal) > 1500 order by avg(sal);

distinct 關(guān)鍵字

把查詢結(jié)果去除重復(fù)記錄【distinct】 注意:原表數(shù)據(jù)不會(huì)被修改,只是查詢結(jié)果去重。 去重需要使用一個(gè)關(guān)鍵字:distinct

distinct只能出現(xiàn)在所有字段的最前方,表示對(duì)各字段聯(lián)合起來(lái)的查詢結(jié)果去重

這樣編寫(xiě)是錯(cuò)誤的,語(yǔ)法錯(cuò)誤。

select ename,distinct job from emp;

統(tǒng)計(jì)一下工作崗位的數(shù)量?select count(distinct job) from emp;

連接查詢什么是連接查詢?

從一張表中單獨(dú)查詢,稱為單表查詢。 ? 多張表聯(lián)合起來(lái)查詢數(shù)據(jù),被稱為連接查詢。

根據(jù)語(yǔ)法的年代分類: SQL92:1992年的時(shí)候出現(xiàn)的語(yǔ)法 SQL99:1999年的時(shí)候出現(xiàn)的語(yǔ)法 我們這里重點(diǎn)學(xué)習(xí)SQL99.(這個(gè)過(guò)程中簡(jiǎn)單演示一個(gè)SQL92的例子)

根據(jù)表連接的方式分類: 內(nèi)連接: 等值連接 非等值連接 自連接

外連接: ? 左外連接(左連接) ? 右外連接(右連接)

什么是笛卡爾積現(xiàn)象

當(dāng)兩張表進(jìn)行連接查詢,沒(méi)有任何條件限制的時(shí)候,最終查詢結(jié)果條數(shù),是 兩張表?xiàng)l數(shù)的乘積,這種現(xiàn)象被稱為:笛卡爾積現(xiàn)象。(笛卡爾發(fā)現(xiàn)的,這是一個(gè)數(shù)學(xué)現(xiàn)象。)

怎么避免笛卡爾積現(xiàn)象

連接時(shí)加條件,滿足這個(gè)條件的記錄被篩選出來(lái)!

表起別名。很重要。效率問(wèn)題。select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno;

注意:通過(guò)笛卡爾積現(xiàn)象得出,表的連接次數(shù)越多效率越低,盡量減少表的連接次數(shù)。內(nèi)連接兩張表連接時(shí)沒(méi)有主次關(guān)系的連接稱為內(nèi)連接等值連接

案例:查詢每個(gè)員工所在部門名稱,顯示員工名和部門名? emp e和dept d表進(jìn)行連接。條件是:e.deptno = d.deptno

SQL92語(yǔ)法: select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno;

sql92的缺點(diǎn):結(jié)構(gòu)不清晰,表的連接條件,和后期進(jìn)一步篩選的條件,都放到了where后面。

SQL99語(yǔ)法: inner 可以省略,不省略可讀性會(huì)好一些 select e.ename,d.dname from emp e inner join dept d on e.deptno = d.deptno;

sql99優(yōu)點(diǎn):表連接的條件是獨(dú)立的,連接之后,如果還需要進(jìn)一步篩選,再往后繼續(xù)添加where非等值連接

案例:找出每個(gè)員工的薪資等級(jí),要求顯示員工名、薪資、薪資等級(jí)?

select e.ename, e.sal, s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;

自連接

內(nèi)連接之自連接 案例:查詢員工的上級(jí)領(lǐng)導(dǎo),要求顯示員工名和對(duì)應(yīng)的領(lǐng)導(dǎo)名?

emp a 員工表、emp b 領(lǐng)導(dǎo)表

select a.ename 員工, b.ename 領(lǐng)導(dǎo) from emp a join emp b on a.mgr = b.empno;

外連接

兩張表連接時(shí)有主次關(guān)系

右(外)連接

// outer是可以省略的,帶著可讀性強(qiáng)。 select e.ename,d.dname from emp e right outer join dept d on e.deptno = d.deptno;

right代表什么:表示將join關(guān)鍵字右邊的這張表看成主表,主要是為了將 這主表的數(shù)據(jù)全部查詢出來(lái),捎帶著關(guān)聯(lián)查詢左邊的表。(如果此表沒(méi)有對(duì)應(yīng)和主表滿足 on 后條件的 ,那次表會(huì)自動(dòng)補(bǔ)充 NULL ) 在外連接當(dāng)中,兩張表連接,產(chǎn)生了主次關(guān)系。

左(外)連接

左外連接同理

任何一個(gè)右連接都有左連接的寫(xiě)法。 任何一個(gè)左連接都有右連接的寫(xiě)法。

案例:查詢每個(gè)員工的上級(jí)領(lǐng)導(dǎo),要求顯示所有員工的名字和領(lǐng)導(dǎo)名?

select a.ename '員工', b.ename '領(lǐng)導(dǎo)' from emp a left join emp b on a.mgr = b.empno;

三張表連接如下(四張表同理)

語(yǔ)法: select ... from a join b on a和b的連接條件 join c on a和c的連接條件

案例:找出每個(gè)員工的部門名稱以及工資等級(jí), 要求顯示員工名、部門名、薪資、薪資等級(jí)?

select e.ename, d.dname, s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal;

一條SQL中內(nèi)連接和外連接可以混合。都可以出現(xiàn)!

案例:找出每個(gè)員工的部門名稱以及工資等級(jí),還有上級(jí)領(lǐng)導(dǎo), 要求顯示員工名、領(lǐng)導(dǎo)名、部門名、薪資、薪資等級(jí)?

select e.ename '員工', u.ename '領(lǐng)導(dǎo)', d.dname, e.sal, s.grade from emp e left join emp u on e.mgr = u.empno join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal;

什么是子查詢?

select語(yǔ)句中嵌套select語(yǔ)句,被嵌套的select語(yǔ)句稱為子查詢。

子查詢都可以出現(xiàn)在哪里呢?

select ? ..(select). ? from ? ..(select). ? where ? ..(select).

where子句中的子查詢

案例:找出比最低工資高100的員工姓名和工資?

select ? ename,sal ? from ? emp ? where ? sal > min(sal);

ERROR 1111 (HY000): Invalid use of group function ? where子句中不能直接使用分組函數(shù)。

正確:select e.ename, e.sal from emp e where e.sal > (select min(sal) 1000 from emp);

from子句中的子查詢

案例:找出每個(gè)崗位的平均工資的薪資等級(jí)。

select a.*, s.grade from (select job, avg(sal) avg_sal from emp group by job) a join salgrade s on a.avg_sal between s.losal and s.hisal;

子查詢中的avg(sal)一定要起個(gè)別名才能在內(nèi)連接中使用select后面出現(xiàn)的子查詢(了解即可)

案例:找出每個(gè)員工的部門名稱,要求顯示員工名,部門名? select e.ename,e.deptno,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;

select e.ename,e.deptno,(select dname from dept) as dname from emp e; //錯(cuò)誤:ERROR 1242 (21000): Subquery returns more than 1 row

注意:對(duì)于select后面的子查詢來(lái)說(shuō),這個(gè)子查詢只能一次返回1條結(jié)果, 多于1條,就報(bào)錯(cuò)了。!

Union關(guān)鍵字

union作用:合并查詢結(jié)果集

案例:查詢工作崗位是MANAGER和SALESMAN的員工?

select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';

select ename,job from emp where job in('MANAGER','SALESMAN');

select ename,job from emp where job = 'MANAGER' union select ename,job from emp where job = 'SALESMAN';

像下面這樣是錯(cuò)誤的:union在進(jìn)行結(jié)果集合并的時(shí)候,要求兩個(gè)結(jié)果集的列數(shù)相同。 select ename,job from emp where job = 'MANAGER' union select ename from emp where job = 'SALESMAN';

// MYSQL可以結(jié)果集合并時(shí)列和列的數(shù)據(jù)類型不一致 ,oracle語(yǔ)法嚴(yán)格 ,不可以,其結(jié)果集合并時(shí)列和列的數(shù)據(jù)類型也要一致。 select ename,job from emp where job = 'MANAGER' union select ename,sal from emp where job = 'SALESMAN';

limit關(guān)鍵字

limit作用:將查詢結(jié)果集的一部分取出來(lái)。通常使用在分頁(yè)查詢當(dāng)中。 百度默認(rèn):一頁(yè)顯示10條記錄。 分頁(yè)的作用是為了提高用戶的體驗(yàn),因?yàn)橐淮稳慷疾槌鰜?lái),用戶體驗(yàn)差。 可以一頁(yè)一頁(yè)翻頁(yè)看。

完整用法:limit startIndex, length startIndex是起始下標(biāo),length是長(zhǎng)度。 limit起始下標(biāo)從0開(kāi)始。substr的起始下標(biāo)從1開(kāi)始

缺省用法:limit 5; 這是取前5.

select ename,sal from emp order by sal desc limit 0,5;

注意:mysql當(dāng)中l(wèi)imit在order by之后執(zhí)行!!!!!!

取出工資排名在[3-5]名的員工? select ename,sal from emp order by sal desc limit 2, 3; 2表示起始位置從下標(biāo)2開(kāi)始,就是第三條記錄。 3表示長(zhǎng)度。

通用分頁(yè)方法:

每頁(yè)顯示3條記錄 第1頁(yè):limit 0,3 [0 1 2] 第2頁(yè):limit 3,3 [3 4 5] 第3頁(yè):limit 6,3 [6 7 8] 第4頁(yè):limit 9,3 [9 10 11]

每頁(yè)顯示pageSize條記錄 第pageNo頁(yè):limit (pageNo - 1) * pageSize , pageSize

DQL語(yǔ)句總結(jié)

關(guān)于DQL語(yǔ)句的大總結(jié): select ... from ... where ... group by ... having ... order by ... limit ...

執(zhí)行順序? 1.from 2.where 3.group by 4.having 5.select 6.order by 7.limit..

DDL及常見(jiàn)數(shù)據(jù)類型create

建表的語(yǔ)法格式:

create table 表名(字段名1 數(shù)據(jù)類型, 字段名2 數(shù)據(jù)類型, 字段名3 數(shù)據(jù)類型);

create table 表名( 字段名1 數(shù)據(jù)類型, 字段名2 數(shù)據(jù)類型, 字段名3 數(shù)據(jù)類型 );

表名:建議以t_ 或者 tbl_開(kāi)始,可讀性強(qiáng)。見(jiàn)名知意。 字段名:見(jiàn)名知意。 表名和字段名都屬于標(biāo)識(shí)符。

drop

刪除一個(gè)數(shù)據(jù)庫(kù)

drop database [if exists] 庫(kù)名; #if exists 如果庫(kù)存在才刪除

刪除一張表:

drop table 表名;

Alter

對(duì)表結(jié)構(gòu)的修改

什么是對(duì)表結(jié)構(gòu)的修改? 添加一個(gè)字段,刪除一個(gè)字段,修改一個(gè)字段!!!

第一:在實(shí)際的開(kāi)發(fā)中,需求一旦確定之后,表一旦設(shè)計(jì)好之后,很少的 進(jìn)行表結(jié)構(gòu)的修改。因?yàn)殚_(kāi)發(fā)進(jìn)行中的時(shí)候,修改表結(jié)構(gòu),成本比較高。 修改表的結(jié)構(gòu),對(duì)應(yīng)的java代碼就需要進(jìn)行大量的修改。成本是比較高的。 這個(gè)責(zé)任應(yīng)該由設(shè)計(jì)人員來(lái)承擔(dān)!

第二:由于修改表結(jié)構(gòu)的操作很少,所以我們不需要掌握,如果有一天 真的要修改表結(jié)構(gòu),你可以使用工具!!!!

修改表結(jié)構(gòu)的操作是不需要寫(xiě)到j(luò)ava程序中的。實(shí)際上也不是java程序員的范疇。

常見(jiàn)數(shù)據(jù)類型

varchar(最長(zhǎng)255) 可變長(zhǎng)度的字符串 比較智能,節(jié)省空間。 會(huì)根據(jù)實(shí)際的數(shù)據(jù)長(zhǎng)度動(dòng)態(tài)分配空間。

優(yōu)點(diǎn):節(jié)省空間 ? 缺點(diǎn):需要?jiǎng)討B(tài)分配空間,速度慢。

char(最長(zhǎng)255) 定長(zhǎng)字符串 不管實(shí)際的數(shù)據(jù)長(zhǎng)度是多少。 分配固定長(zhǎng)度的空間去存儲(chǔ)數(shù)據(jù)。 使用不恰當(dāng)?shù)臅r(shí)候,可能會(huì)導(dǎo)致空間的浪費(fèi)。

優(yōu)點(diǎn):不需要?jiǎng)討B(tài)分配空間,速度快。 ? 缺點(diǎn):使用不當(dāng)可能會(huì)導(dǎo)致空間的浪費(fèi)。

varchar和char我們應(yīng)該怎么選擇? 性別字段你選什么?因?yàn)樾詣e是固定長(zhǎng)度的字符串,所以選擇char。 姓名字段你選什么?每一個(gè)人的名字長(zhǎng)度不同,所以選擇varchar。

int(最長(zhǎng)11) 數(shù)字中的整數(shù)型。等同于java的int。

bigint 數(shù)字中的長(zhǎng)整型。等同于java中的long。

float(數(shù)字a, 數(shù)字b) 其中數(shù)字a表示有效數(shù)字,數(shù)字b表示小數(shù)位 單精度浮點(diǎn)型數(shù)據(jù)

double(數(shù)字a, 數(shù)字b) 其中數(shù)字a表示有效數(shù)字,數(shù)字b表示小數(shù)位 雙精度浮點(diǎn)型數(shù)據(jù)

date 短日期類型

datetime 長(zhǎng)日期類型

clob 字符大對(duì)象 最多可以存儲(chǔ)4G的字符串。 比如:存儲(chǔ)一篇文章,存儲(chǔ)一個(gè)說(shuō)明。 超過(guò)255個(gè)字符的都要采用CLOB字符大對(duì)象來(lái)存儲(chǔ)。 Character Large OBject:CLOB

blob 二進(jìn)制大對(duì)象 Binary Large OBject 專門用來(lái)存儲(chǔ)圖片、聲音、視頻等流媒體數(shù)據(jù)。 往BLOB類型的字段上插入數(shù)據(jù)的時(shí)候,例如插入一個(gè)圖片、視頻等,需要使用IO流才行。

案例:

創(chuàng)建一個(gè)學(xué)生表? 學(xué)號(hào)、姓名、年齡、性別、郵箱地址 create table t_student( no int, name varchar(32), sex char(1), age int(3), email varchar(255) );

數(shù)據(jù)類型后括號(hào)內(nèi)的數(shù)字表示內(nèi)容的長(zhǎng)度,int(3) 表示最多3位數(shù)

刪除表: drop table t_student; // 當(dāng)這張表不存在的時(shí)候會(huì)報(bào)錯(cuò)!

像下面這樣刪就不會(huì)報(bào)錯(cuò) drop table if exists t_student;

DML插入數(shù)據(jù)insert (DML)

語(yǔ)法格式: insert into 表名(字段名1,字段名2,字段名3...) values(值1,值2,值3);

注意:字段名和值要一一對(duì)應(yīng)。

注意:insert語(yǔ)句但凡是執(zhí)行成功了,那么必然會(huì)多一條記錄。 沒(méi)有給其它字段指定值的話,默認(rèn)值是NULL。

注意:字段名可以省略,省略了的話等于都寫(xiě)了且按順序?qū)懙?/p>注意:數(shù)據(jù)庫(kù)中的有一條命名規(guī)范: 所有的標(biāo)識(shí)符都是全部小寫(xiě),單詞和單詞之間使用下劃線進(jìn)行銜接。修改update

語(yǔ)法格式: update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3... where 條件;

注意:沒(méi)有條件限制會(huì)導(dǎo)致所有數(shù)據(jù)全部更新。

刪除數(shù)據(jù) delete

語(yǔ)法格式? ? delete from 表名 where 條件;

注意:沒(méi)有條件,整張表的數(shù)據(jù)會(huì)全部刪除!

delete from t_user where id = 2;

delete from t_user; // 刪除所有!

快速創(chuàng)建一張表

mysql> create table emp2 as select * from emp;

原理: 將一個(gè)查詢結(jié)果當(dāng)做一張表新建,這個(gè)可以完成表的快速?gòu)?fù)制。表創(chuàng)建出來(lái),同時(shí)表中的數(shù)據(jù)也存在了。

create table mytable as select empno,ename from emp where job = 'MANAGER';

將查詢結(jié)果插入到一張表當(dāng)中?insert相關(guān)的

create table dept_bak as select * from dept;

insert into dept_bak select * from dept; //很少用!

快速刪除表中數(shù)據(jù)

快速刪除表中的數(shù)據(jù)?【truncate比較重要,必須掌握】

//刪除dept_bak表中的數(shù)據(jù) delete from dept_bak; //這種刪除數(shù)據(jù)的方式比較慢。

mysql> select * from dept_bak; Empty set (0.00 sec)

delete語(yǔ)句刪除數(shù)據(jù)的原理?(DML操作) 表中的數(shù)據(jù)被刪除了,但是這個(gè)數(shù)據(jù)在硬盤上的真實(shí)存儲(chǔ)空間不會(huì)被釋放!!!(相當(dāng)于把表中格子內(nèi)容擦掉,但不會(huì)把格子刪掉,還占了空間) 這種刪除缺點(diǎn)是:刪除效率比較低 這種刪除優(yōu)點(diǎn)是:支持回滾,后悔了可以再恢復(fù)數(shù)據(jù)!!!

truncate語(yǔ)句刪除數(shù)據(jù)的原理? 這種刪除效率比較高,表被一次截?cái)啵锢韯h除。(相當(dāng)于把占的那片空間給截了) 這種刪除缺點(diǎn):不支持回滾。 這種刪除優(yōu)點(diǎn):快速

用法:truncate table dept_bak; (這種操作屬于DDL操作。)

大表非常大,上億條記錄???? 刪除的時(shí)候,使用delete,也許需要執(zhí)行很久才能刪除完!效率較低。 可以選擇使用truncate刪除表中的數(shù)據(jù)。只需要不到1秒鐘的時(shí)間就刪除結(jié)束。效率較高。 但是使用truncate之前,必須仔細(xì)詢問(wèn)客戶是否真的要?jiǎng)h除,并警告刪除之后不可恢復(fù)!

truncate是刪除表中的數(shù)據(jù),表還在!

刪除表操作drop table 表名; 會(huì)把表結(jié)構(gòu)和表中的數(shù)據(jù)一起都刪了

四大約束什么是約束?

約束對(duì)應(yīng)的英語(yǔ)單詞:constraint 在創(chuàng)建表的時(shí)候,我們可以給表中的字段加上一些約束,來(lái)保證這個(gè)表中數(shù)據(jù)的 完整性、有效性!!!

約束的作用就是為了保證表中的數(shù)據(jù)有效!!約束包括哪些?

非空約束:not null ? 唯一性約束: unique ? 主鍵約束: primary key (簡(jiǎn)稱PK) ? 外鍵約束:foreign key(簡(jiǎn)稱FK) ? 檢查約束:check(mysql不支持,oracle支持)

非空約束:not null

非空約束not null約束的字段不能為NULL。 drop table if exists t_vip; create table t_vip( id int, name varchar(255) not null );

insert into t_vip(id) values(3); ERROR 1364 (HY000): Field 'name' doesn't have a default value

唯一性約束: unique

唯一性約束unique約束的字段不能重復(fù),但是可以為NULL。 drop table if exists t_vip; create table t_vip( id int, name varchar(255) unique, email varchar(255) ); insert into t_vip(id,name,email) values(3,'wangwu',' [email protected] ');

insert into t_vip(id,name,email) values(4,'wangwu',' [email protected] '); ERROR 1062 (23000): Duplicate entry 'wangwu' for key 'name'

name字段雖然被unique約束了,但是可以為NULL。且可以有多個(gè)人的是null

新需求:name和email兩個(gè)字段聯(lián)合起來(lái)具有唯一性!!!! drop table if exists t_vip; create table t_vip( id int, name varchar(255) unique, // 約束直接添加到列后面的,叫做列級(jí)約束。 email varchar(255) unique ); 這張表這樣創(chuàng)建是不符合我以上“新需求”的。 這樣創(chuàng)建表示:name具有唯一性,email具有唯一性。各自唯一。

正確做法:

drop table if exists t_vip; ? create table t_vip( ? id int, ? name varchar(255), ? email varchar(255), ? unique(name,email) // 約束沒(méi)有添加在列的后面,這種約束被稱為表級(jí)約束。 ? );

需要給多個(gè)字段聯(lián)合起來(lái)添加某一個(gè)約束的時(shí)候,需要使用表級(jí)約束

not null只有列級(jí)約束,沒(méi)有表級(jí)約束!在mysql當(dāng)中,如果一個(gè)字段同時(shí)被not null和unique約束的話,該字段自動(dòng)變成主鍵字段。(注意:oracle中不一樣!)主鍵約束(primary key,簡(jiǎn)稱PK)主鍵約束的相關(guān)術(shù)語(yǔ)?

主鍵約束:就是一種約束。 ? 主鍵字段:該字段上添加了主鍵約束,這樣的字段叫做:主鍵字段 ? 主鍵值:主鍵字段中的每一個(gè)值都叫做:主鍵值。

什么是主鍵?有啥用?

主鍵值是每一行記錄的唯一標(biāo)識(shí)。? 主鍵值是每一行記錄的身份證號(hào)!!!

記住:任何一張表都應(yīng)該有主鍵(且僅有一個(gè)),沒(méi)有主鍵,表無(wú)效!!主鍵的特征:not null unique(主鍵值不能是NULL,同時(shí)也不能重復(fù)!)主鍵可以使用表級(jí)約束

表級(jí)約束主要是給多個(gè)字段聯(lián)合起來(lái)添加約束

幾個(gè)字段聯(lián)合起來(lái)的主鍵叫 復(fù)合主鍵

在實(shí)際開(kāi)發(fā)中不建議使用復(fù)合主鍵。建議使用單一主鍵

主鍵值建議使用: int bigint char 等類型。

不建議使用:varchar來(lái)做主鍵。主鍵值一般都是數(shù)字,一般都是定長(zhǎng)的!

主鍵除了:?jiǎn)我恢麈I和復(fù)合主鍵之外,還可以這樣進(jìn)行分類?

自然主鍵:主鍵值是一個(gè)自然數(shù),和業(yè)務(wù)沒(méi)關(guān)系。 ? 業(yè)務(wù)主鍵:主鍵值和業(yè)務(wù)緊密關(guān)聯(lián),例如拿銀行卡賬號(hào)做主鍵值。這就是業(yè)務(wù)主鍵!

在實(shí)際開(kāi)發(fā)中使用業(yè)務(wù)主鍵多,還是使用自然主鍵多一些? ? 自然主鍵使用比較多,因?yàn)橹麈I只要做到不重復(fù)就行,不需要有意義。 ? 業(yè)務(wù)主鍵不好,因?yàn)橹麈I一旦和業(yè)務(wù)掛鉤,那么當(dāng)業(yè)務(wù)發(fā)生變動(dòng)的時(shí)候, ? 可能會(huì)影響到主鍵值,所以業(yè)務(wù)主鍵不建議使用。盡量使用自然主鍵。

在mysql當(dāng)中, 有一種機(jī)制,可以幫助我們自動(dòng)維護(hù)一個(gè)主鍵值 drop table if exists t_vip; create table t_vip( id int primary key auto_increment, name varchar(255) );

auto_increment 表示自增,從1開(kāi)始,以1遞增!外鍵約束(foreign key,簡(jiǎn)稱FK)

外鍵約束涉及到的相關(guān)術(shù)語(yǔ): 外鍵約束:一種約束(foreign key) 外鍵字段:該字段上添加了外鍵約束 外鍵值:外鍵字段當(dāng)中的每一個(gè)值。

業(yè)務(wù)背景: 請(qǐng)?jiān)O(shè)計(jì)數(shù)據(jù)庫(kù)表,來(lái)描述“班級(jí)和學(xué)生”的信息?? 第一種方案:班級(jí)和學(xué)生存儲(chǔ)在一張表中??? t_student no(pk) name classno classname ------------------------------------------------------------------------------- 1 jack 100 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班 2 lucy 100 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班 3 lilei 100 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班 4 hanmeimei 100 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班 5 zhangsan 101 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三2班 6 lisi 101 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三2班 7 wangwu 101 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三2班 8 zhaoliu 101 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三2班 分析以上方案的缺點(diǎn): 數(shù)據(jù)冗余,空間浪費(fèi)!!!! 這個(gè)設(shè)計(jì)是比較失敗的! 第二種方案:班級(jí)一張表、學(xué)生一張表?? t_class 班級(jí)表 classno(pk) classname ------------------------------------------------------ 100 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班 101 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班 t_student 學(xué)生表 no(pk) name cno(FK引用t_class這張表的classno) ---------------------------------------------------------------- 1 jack 100 2 lucy 100 3 lilei 100 4 hanmeimei 100 5 zhangsan 101 6 lisi 101 7 wangwu 101 8 zhaoliu 101? 當(dāng)cno字段沒(méi)有任何約束的時(shí)候,可能會(huì)導(dǎo)致數(shù)據(jù)無(wú)效。可能出現(xiàn)一個(gè)102,但是102班級(jí)不存在。 所以為了保證cno字段中的值都是100和101,需要給cno字段添加外鍵約束。 那么:cno字段就是外鍵字段。cno字段中的每一個(gè)值都是外鍵值。注意:理解即記住

刪除表的順序? 先刪子,再刪父。

創(chuàng)建表的順序? 先創(chuàng)建父,再創(chuàng)建子。

刪除數(shù)據(jù)的順序? 先刪子,再刪父。

插入數(shù)據(jù)的順序? 先插入父,再插入子。

create table t_class ( classno int primary key, classname varchar(255););create table t_student ( no int primary key auto_increment, name varchar(255), cno int, foreign key(cno) references t_class(classno));

思考:子表中的外鍵引用的父表中的某個(gè)字段,被引用的這個(gè)字段必須是主鍵嗎? 不一定是主鍵,但至少具有unique約束。

即:外鍵引用的字段不一定是主鍵,但一定要有unique約束

測(cè)試:外鍵值可以為NULL嗎? 外鍵只要滿足至少含有unique約束即可,而有unique修飾的字段字段可以為NULL(而且可以有多個(gè)NULL),所以外鍵值當(dāng)然可以為NULL。

存儲(chǔ)引擎什么是存儲(chǔ)引擎,有什么用呢?

存儲(chǔ)引擎是MySQL中特有的一個(gè)術(shù)語(yǔ),其它數(shù)據(jù)庫(kù)中沒(méi)有。(Oracle中有,但是不叫這個(gè)名字) ? 實(shí)際上 存儲(chǔ)引擎是一個(gè) 表存儲(chǔ)/組織數(shù)據(jù) 的方式 ? 不同的存儲(chǔ)引擎,表存儲(chǔ)數(shù)據(jù)的方式不同。

怎么給表添加/指定“存儲(chǔ)引擎”呢?

在建表的時(shí)候可以在最后小括號(hào)的")"的右邊使用: ENGINE來(lái)指定存儲(chǔ)引擎。 CHARSET來(lái)指定這張表的字符編碼方式。

結(jié)論: mysql默認(rèn)的存儲(chǔ)引擎是:InnoDB mysql默認(rèn)的字符編碼方式是:utf8

建表時(shí)指定存儲(chǔ)引擎,以及字符編碼方式。 create table t_product( id int primary key, name varchar(255) )engine=InnoDB default charset=gbk;

怎么查看mysql支持哪些存儲(chǔ)引擎呢?

命令: show engines G

MySQL支持9大存儲(chǔ)引擎,不同版本支持引擎不同,通過(guò)上面指令可以看出當(dāng)前版本哪些支持

關(guān)于mysql常用的存儲(chǔ)引擎的介紹

MyISAM存儲(chǔ)引擎? 它管理的表具有以下特征: 使用三個(gè)文件表示每個(gè)表: 格式文件 — 存儲(chǔ)表結(jié)構(gòu)的定義(mytable.frm) 數(shù)據(jù)文件 — 存儲(chǔ)表行的內(nèi)容(mytable.MYD) 索引文件 — 存儲(chǔ)表上索引(mytable.MYI):索引用于縮小掃描范圍,提高查詢效率的一種機(jī)制。 可被轉(zhuǎn)換為壓縮、只讀表來(lái)節(jié)省空間

注意: 對(duì)于一張表來(lái)說(shuō), 主鍵或者加有unique約束的字段上會(huì)自動(dòng)創(chuàng)建索引 。

MyISAM存儲(chǔ)引擎特點(diǎn): 可被轉(zhuǎn)換為壓縮、只讀表來(lái)節(jié)省空間!

MyISAM不支持事務(wù)機(jī)制,安全性低。

InnoDB存儲(chǔ)引擎 這是mysql默認(rèn)的存儲(chǔ)引擎,同時(shí)也是一個(gè)重量級(jí)的存儲(chǔ)引擎。 InnoDB支持事務(wù),支持?jǐn)?shù)據(jù)庫(kù)崩潰后自動(dòng)恢復(fù)機(jī)制。 InnoDB存儲(chǔ)引擎最主要的特點(diǎn)是:非常安全。

它管理的表具有下列主要特征: – 每個(gè) InnoDB 表在數(shù)據(jù)庫(kù)目錄中以.frm 格式文件表示 – InnoDB 表空間 tablespace 被用于存儲(chǔ)表的內(nèi)容(表空間是一個(gè)邏輯名稱。表空間存儲(chǔ)數(shù)據(jù)和索引。)

– 提供一組用來(lái)記錄事務(wù)性活動(dòng)的日志文件 ? – 用 COMMIT(提交)、SAVEPOINT 及ROLLBACK(回滾)支持事務(wù)處理 ? – 提供全 ACID 兼容 ? – 在 MySQL 服務(wù)器崩潰后提供自動(dòng)恢復(fù) ? – 多版本(MVCC)和行級(jí)鎖定 ? – 支持外鍵及引用的完整性,包括級(jí)聯(lián)刪除和更新

InnoDB最大的特點(diǎn)就是:支持事務(wù),以保證數(shù)據(jù)的安全。

效率不是很高,并且也不能壓縮,不能轉(zhuǎn)換為只讀,不能很好的節(jié)省存儲(chǔ)空間。

MEMORY存儲(chǔ)引擎? 使用 MEMORY 存儲(chǔ)引擎的表,其數(shù)據(jù)存儲(chǔ)在內(nèi)存中,且行的長(zhǎng)度固定, 這兩個(gè)特點(diǎn)使得 MEMORY 存儲(chǔ)引擎非常快。

MEMORY 存儲(chǔ)引擎管理的表具有下列特征: – 在數(shù)據(jù)庫(kù)目錄內(nèi),每個(gè)表均以.frm 格式的文件表示。 – 表數(shù)據(jù)及索引被存儲(chǔ)在內(nèi)存中。(目的就是快,查詢快!) – 表級(jí)鎖機(jī)制。 – 不能包含 TEXT 或 BLOB 字段。

MEMORY 存儲(chǔ)引擎以前被稱為HEAP 引擎。

MEMORY引擎優(yōu)點(diǎn):查詢效率是最高的。不需要和硬盤交互。 MEMORY引擎缺點(diǎn):不安全,關(guān)機(jī)之后數(shù)據(jù)消失。因?yàn)閿?shù)據(jù)和索引都是在內(nèi)存當(dāng)中。

事務(wù)

一個(gè)事務(wù)其實(shí)就是一個(gè)完整的業(yè)務(wù)邏輯。是一個(gè)最小的工作單元。不可再分。

說(shuō)到本質(zhì)上,一個(gè)事務(wù)其實(shí)就是多條DML語(yǔ)句同時(shí)成功,或者同時(shí)失敗!

什么是一個(gè)完整的業(yè)務(wù)邏輯? 假設(shè)轉(zhuǎn)賬,從A賬戶向B賬戶中轉(zhuǎn)賬10000. 將A賬戶的錢減去10000(update語(yǔ)句) 將B賬戶的錢加上10000(update語(yǔ)句) 這就是一個(gè)完整的業(yè)務(wù)邏輯。? 以上的操作是一個(gè)最小的工作單元,要么同時(shí)成功,要么同時(shí)失敗,不可再分。 這兩個(gè)update語(yǔ)句要求必須同時(shí)成功或者同時(shí)失敗,這樣才能保證錢是正確的。

只有DML語(yǔ)句才會(huì)有事務(wù)這一說(shuō),其它語(yǔ)句和事務(wù)無(wú)關(guān)!!!insert delete update 只有以上的三個(gè)語(yǔ)句和事務(wù)有關(guān)系,其它都沒(méi)有關(guān)系。

因?yàn)?只有以上的三個(gè)語(yǔ)句是數(shù)據(jù)庫(kù)表中數(shù)據(jù)進(jìn)行增、刪、改的。 只要你的操作一旦涉及到數(shù)據(jù)的增、刪、改,那么就一定要考慮安全問(wèn)題。

數(shù)據(jù)安全第一位!!

事務(wù)是怎么做到多條DML語(yǔ)句同時(shí)成功和同時(shí)失敗的呢?

InnoDB存儲(chǔ)引擎:提供一組用來(lái)記錄事務(wù)性活動(dòng)的日志文件

事務(wù)開(kāi)啟了: insert insert delete update update 事務(wù)結(jié)束了!

在事務(wù)的執(zhí)行過(guò)程中,每一條DML的操作都會(huì)記錄到“事務(wù)性活動(dòng)的日志文件”中。 在事務(wù)的執(zhí)行過(guò)程中,我們可以提交事務(wù),也可以回滾事務(wù)。

提交事務(wù)? 清空事務(wù)性活動(dòng)的日志文件,將數(shù)據(jù)全部徹底持久化到數(shù)據(jù)庫(kù)表中。 提交事務(wù)標(biāo)志著,事務(wù)的結(jié)束。并且是一種全部成功的結(jié)束。

回滾事務(wù)? 將之前所有的DML操作全部撤銷,并且清空事務(wù)性活動(dòng)的日志文件 回滾事務(wù)標(biāo)志著,事務(wù)的結(jié)束。并且是一種全部失敗的結(jié)束。

怎么提交事務(wù),怎么回滾事務(wù)?

提交事務(wù):commit; 語(yǔ)句 回滾事務(wù):rollback; 語(yǔ)句(回滾永遠(yuǎn)都是只能回滾到上一次的提交點(diǎn)!)

事務(wù)對(duì)應(yīng)的英語(yǔ)單詞是:transaction

測(cè)試一下,在mysql當(dāng)中默認(rèn)的事務(wù)行為是怎樣的? mysql默認(rèn)情況下是支持自動(dòng)提交事務(wù)的。(自動(dòng)提交) 什么是自動(dòng)提交? 每執(zhí)行一條DML語(yǔ)句,則提交一次!

這種自動(dòng)提交實(shí)際上是不符合我們的開(kāi)發(fā)習(xí)慣,因?yàn)橐粋€(gè)業(yè)務(wù)通常是需要多條DML語(yǔ)句共同執(zhí)行才能完成的,為了保證數(shù)據(jù)的安全,必須要求同時(shí)成功之后再提交,所以不能執(zhí)行一條 就提交一條。

怎么將mysql的自動(dòng)提交機(jī)制關(guān)閉掉呢? 開(kāi)啟事務(wù)時(shí)先執(zhí)行這個(gè)命令:start transaction;

事務(wù)的四個(gè)特性

事務(wù)包括4個(gè)特性?

A:原子性 說(shuō)明事務(wù)是最小的工作單元。不可再分。所有操作必須同時(shí)成功,或者同時(shí)失敗。

C:一致性 一個(gè)事務(wù)在執(zhí)行前后,數(shù)據(jù)庫(kù)都必須處于正確的狀態(tài),滿足完整性約束。也就是說(shuō)事務(wù)不能破壞數(shù)據(jù)庫(kù)的完整性以及業(yè)務(wù)邏輯的一致性。

例如:

業(yè)務(wù)邏輯一致性:A給B轉(zhuǎn)賬,無(wú)論是否操作成功,兩者的賬戶余額之和應(yīng)該是不變的。

數(shù)據(jù)庫(kù)完整性:數(shù)據(jù)庫(kù)的約束關(guān)系應(yīng)該是正確的,例如唯一索引,主鍵等。

I:隔離性 同時(shí)執(zhí)行的事務(wù)是相互隔離的,它們不能相互冒犯。

D:持久性 事務(wù)最終結(jié)束的一個(gè)保障。事務(wù)提交,就相當(dāng)于將沒(méi)有保存到硬盤上的數(shù)據(jù) 保存到硬盤上!

4個(gè)隔離級(jí)別讀未提交:read uncommitted(最低的隔離級(jí)別,沒(méi)有提交就讀到了)

什么是讀未提交? ? 事務(wù)A可以讀取到事務(wù)B未提交的數(shù)據(jù)。 ? 這種隔離級(jí)別存在的問(wèn)題就是: ? 臟讀現(xiàn)象 !(Dirty Read) ? 我們稱讀到了臟數(shù)據(jù)。 ? 這種隔離級(jí)別一般都是理論上的,大多數(shù)的數(shù)據(jù)庫(kù)隔離級(jí)別都是二檔起步!

讀已提交:read committed(提交之后才能讀到)

什么是讀已提交? ? 事務(wù)A只能讀取到事務(wù)B提交之后的數(shù)據(jù)。 ? 這種隔離級(jí)別解決了什么問(wèn)題? ? 解決了臟讀的現(xiàn)象。 ? 這種隔離級(jí)別存在什么問(wèn)題? ? 不可重復(fù)讀取數(shù)據(jù)。 ? 什么是不可重復(fù)讀取數(shù)據(jù)呢? ? 在事務(wù)開(kāi)啟之后,第一次讀到的數(shù)據(jù)是3條,當(dāng)前事務(wù)還沒(méi)有 ? 結(jié)束,可能第二次再讀取的時(shí)候,讀到的數(shù)據(jù)是4條,3不等于4 ? 稱為不可重復(fù)讀取。

這種隔離級(jí)別是比較真實(shí)的數(shù)據(jù),每一次讀到的數(shù)據(jù)是絕對(duì)的真實(shí)。 ? oracle數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別是:read committed

可重復(fù)讀:repeatable read(提交之后也讀不到,永遠(yuǎn)讀取的都是剛開(kāi)啟事務(wù)時(shí)的數(shù)據(jù))

什么是可重復(fù)讀取? ? 事務(wù)A開(kāi)啟之后,不管是多久,每一次在事務(wù)A中讀取到的數(shù)據(jù) ? 都是一致的。即使事務(wù)B將數(shù)據(jù)已經(jīng)修改,并且提交了,事務(wù)A ? 讀取到的數(shù)據(jù)還是沒(méi)有發(fā)生改變,這就是可重復(fù)讀。 ? 可重復(fù)讀解決了什么問(wèn)題? ? 解決了不可重復(fù)讀取數(shù)據(jù)。 ? 可重復(fù)讀存在的問(wèn)題是什么? ? 會(huì)出現(xiàn)幻影讀。 ? 每一次讀取到的數(shù)據(jù)都是幻象。不夠真實(shí)!

早晨9點(diǎn)開(kāi)始開(kāi)啟了事務(wù),只要事務(wù)不結(jié)束,到晚上9點(diǎn),讀到的數(shù)據(jù)還是那樣! ? 讀到的是假象。不夠絕對(duì)的真實(shí)。

mysql中默認(rèn)的事務(wù)隔離級(jí)別就是這個(gè)!!序列化/串行化:serializable(最高的隔離級(jí)別)

這是最高隔離級(jí)別,效率最低。解決了所有的問(wèn)題。 ? 這種隔離級(jí)別表示事務(wù)排隊(duì),不能并發(fā)! ? synchronized,線程同步(事務(wù)同步) ? 每一次讀取到的數(shù)據(jù)都是最真實(shí)的,并且效率是最低的。

什么是索引?

索引是在數(shù)據(jù)庫(kù)表的字段上添加的,是為了提高查詢效率存在的一種機(jī)制。一張表的一個(gè)字段可以添加一個(gè)索引,當(dāng)然,多個(gè)字段聯(lián)合起來(lái)也可以添加索引。 索引相當(dāng)于一本書(shū)的目錄,是為了縮小掃描范圍而存在的一種機(jī)制。

MySQL在查詢方面主要就是兩種方式: 第一種方式:全表掃描 第二種方式:根據(jù)索引檢索。

在mysql數(shù)據(jù)庫(kù)當(dāng)中索引也是需要排序的,并且這個(gè)索引的排序和TreeSet 數(shù)據(jù)結(jié)構(gòu)相同。TreeSet(TreeMap)底層是一個(gè)自平衡的二叉樹(shù)!在mysql 當(dāng)中索引是一個(gè)B-Tree數(shù)據(jù)結(jié)構(gòu)。

遵循左小右大原則存放。采用中序遍歷方式遍歷取數(shù)據(jù)。

提醒1:在任何數(shù)據(jù)庫(kù)當(dāng)中主鍵上都會(huì)自動(dòng)添加索引對(duì)象。另外在mysql當(dāng)中,一個(gè)字段上如果有unique約束的話,也會(huì)自動(dòng)創(chuàng)建索引對(duì)象。

提醒2:在任何數(shù)據(jù)庫(kù)當(dāng)中,任何一張表的任何一條記錄在硬盤存儲(chǔ)上都有 一個(gè)硬盤的物理存儲(chǔ)編號(hào)。

提醒3:在mysql當(dāng)中,索引是一個(gè)單獨(dú)的對(duì)象,不同的存儲(chǔ)引擎以不同的形式 存在,在MyISAM存儲(chǔ)引擎中,索引存儲(chǔ)在一個(gè).MYI文件中。在InnoDB存儲(chǔ)引擎中 索引存儲(chǔ)在一個(gè)邏輯名稱叫做tablespace的當(dāng)中。在MEMORY存儲(chǔ)引擎當(dāng)中索引 被存儲(chǔ)在內(nèi)存當(dāng)中。不管索引存儲(chǔ)在哪里,索引在mysql當(dāng)中都是一個(gè)樹(shù)的形式 存在。(自平衡二叉樹(shù):B-Tree)

什么條件下,我們會(huì)考慮給字段添加索引呢?

條件1: 數(shù)據(jù)量龐大 (到底有多么龐大算龐大?這個(gè)需要測(cè)試,因?yàn)槊恳粋€(gè)硬件環(huán)境不同) ? 條件2: 該字段經(jīng)常出現(xiàn)在where的后面 ,以條件的形式存在,也就是說(shuō)這個(gè)字段總是被掃描。 ? 條件3: 該字段很少的DML (insert delete update)操作。(因?yàn)镈ML之后,索引需要重新排序。)

建議不要隨意添加索引,因?yàn)樗饕彩切枰S護(hù)的,太多的話反而會(huì)降低系統(tǒng)的性能。 建議通過(guò)主鍵查詢,建議通過(guò)unique約束的字段進(jìn)行查詢,效率是比較高的。

索引怎么創(chuàng)建?怎么刪除?語(yǔ)法是什么?

創(chuàng)建索引: mysql> create index emp_ename_index on emp(ename); 給emp表的ename字段添加索引,起名:emp_ename_index

刪除索引: mysql> drop index emp_ename_index on emp; 將emp表上的emp_ename_index索引對(duì)象刪除。

查看是否使用索引

mysql> explain select * from emp where ename = 'KING';

type=ALL 說(shuō)明沒(méi)有使用索引,如果是 typr=ref 則使用了索引

索引失效

失效的第1種情況: select * from emp where ename like '%T';

ename上即使添加了索引,也不會(huì)走索引,為什么? 原因是因?yàn)槟:ヅ洚?dāng)中以“%”開(kāi)頭了! 盡量避免模糊查詢的時(shí)候以“%”開(kāi)始。 在MySQL8開(kāi)始好像會(huì)走索引了 這是一種優(yōu)化的手段/策略。

失效的第2種情況: 使用or的時(shí)候會(huì)失效,如果使用or那么 要求or兩邊的條件字段都要有 索引,才會(huì)走索引 ,如果其中一邊有一個(gè)字段沒(méi)有索引,那么另一個(gè) 字段上的索引也會(huì)失效。所以這就是為什么不建議使用or的原因。

失效的第3種情況: 使用復(fù)合索引的時(shí)候,沒(méi)有使用左側(cè)的列查找,索引失效 什么是復(fù)合索引? 兩個(gè)字段,或者更多的字段聯(lián)合起來(lái)添加一個(gè)索引,叫做復(fù)合索引。

create index emp_job_sal_index on emp(job,sal);

explain select * from emp where sal = 800; 沒(méi)走索引

失效的第4種情況: 在where當(dāng)中索引列參加了運(yùn)算,索引失效。

create index emp_sal_index on emp(sal);

explain select * from emp where sal 1 = 800; 沒(méi)走索引

失效的第5種情況: 在where當(dāng)中索引列使用了函數(shù) explain select * from emp where lower(ename) = 'smith';

索引的類別

單一索引:一個(gè)字段上添加索引。 復(fù)合索引:兩個(gè)字段或者更多的字段上添加索引。

主鍵索引:主鍵上添加索引。 唯一性索引:具有unique約束的字段上添加索引。 .....

注意:唯一性比較弱的字段上添加索引用處不大。什么是視圖?

view:站在不同的角度去看待同一份數(shù)據(jù)。

怎么創(chuàng)建視圖對(duì)象?怎么刪除視圖對(duì)象?

表復(fù)制:mysql> create table dept2 as select * from dept;?dept2表中的數(shù)據(jù):mysql> select * from dept2; -------- ------------ ---------- | DEPTNO | DNAME | LOC | -------- ------------ ---------- | 10 | ACCOUNTING | NEW YORK || 20 | RESEARCH | DALLAS || 30 | SALES | CHICAGO || 40 | OPERATIONS | BOSTON | -------- ------------ ----------

創(chuàng)建視圖對(duì)象: create view dept2_view as select * from dept2;

刪除視圖對(duì)象: drop view dept2_view;

注意:只有DQL語(yǔ)句才能以view的形式創(chuàng)建。create view view_name as 這里的語(yǔ)句必須是DQL語(yǔ)句;

視圖作用

我們可以面向視圖對(duì)象進(jìn)行增刪改查,對(duì)視圖對(duì)象的增刪改查,會(huì)導(dǎo)致 原表被操作!(視圖的特點(diǎn):通過(guò)對(duì)視圖的操作,會(huì)影響到原表數(shù)據(jù)。)

//面向視圖查詢 select * from dept2_view;

// 面向視圖插入 insert into dept2_view(deptno,dname,loc) values(60,'SALES', 'BEIJING');

select * from dept2;

視圖對(duì)象在實(shí)際開(kāi)發(fā)中到底有什么用?方便,簡(jiǎn)化開(kāi)發(fā),利于維護(hù)

假設(shè)有一條非常復(fù)雜的SQL語(yǔ)句,而這條SQL語(yǔ)句需要在不同的位置上反復(fù)使用。 每一次使用這個(gè)sql語(yǔ)句的時(shí)候都需要重新編寫(xiě),很長(zhǎng),很麻煩,怎么辦? 可以 把這條復(fù)雜的SQL語(yǔ)句以視圖對(duì)象的形式新建。 在需要編寫(xiě)這條SQL語(yǔ)句的位置直接使用視圖對(duì)象,可以大大簡(jiǎn)化開(kāi)發(fā)。 并且利于后期的維護(hù),因?yàn)樾薷牡臅r(shí)候也只需要修改一個(gè)位置就行,只需要 修改視圖對(duì)象所映射的SQL語(yǔ)句。

我們以后面向視圖開(kāi)發(fā)的時(shí)候,使用視圖的時(shí)候可以像使用table一樣。 可以對(duì)視圖進(jìn)行增刪改查等操作。視圖不是在內(nèi)存當(dāng)中,視圖對(duì)象也是 存儲(chǔ)在硬盤上的,不會(huì)消失。

如下面這樣,就是將一條SQL語(yǔ)句以視圖的形式創(chuàng)建出來(lái)

create view emp_dept_view as select e.ename,e.sal,d.dname from emp e join dept d on e.deptno = d.deptno;注意: 創(chuàng)建視圖對(duì)應(yīng)的語(yǔ)句只能是DQL語(yǔ)句。 但是視圖對(duì)象創(chuàng)建完成之后,可以對(duì)視圖進(jìn)行增刪改查等操作。

CRUD: 增刪改查,又叫做:CRUD。 CRUD是在公司中程序員之間溝通的術(shù)語(yǔ)。一般我們很少說(shuō)增刪改查。 一般都說(shuō)CRUD。

C:Create(增) R:Retrieve(查:檢索) U:Update(改) D:Delete(刪)

Java程序員必須會(huì)的DBA常用命令:

數(shù)據(jù)的導(dǎo)入和導(dǎo)出(數(shù)據(jù)的備份)? 其它命令了解一下即可。(這個(gè)B站嫖的培訓(xùn)日志文檔留著,以后忘了,可以打開(kāi)文檔復(fù)制粘貼。)

數(shù)據(jù)導(dǎo)出? 注意:在windows的dos命令窗口中: mysqldump bjpowernode>D:bjpowernode.sql -uroot -p123456

可以導(dǎo)出指定的表嗎? mysqldump bjpowernode emp>D:bjpowernode.sql -uroot -p123456

數(shù)據(jù)導(dǎo)入? 注意:需要先登錄到mysql數(shù)據(jù)庫(kù)服務(wù)器上。 然后創(chuàng)建數(shù)據(jù)庫(kù):create database bjpowernode; 使用數(shù)據(jù)庫(kù):use bjpowernode 然后初始化數(shù)據(jù)庫(kù):source D:bjpowernode.sql 該語(yǔ)句后不需要跟分號(hào)

如果備份的是表則不需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù),直接使用需要導(dǎo)入表的數(shù)據(jù)即可數(shù)據(jù)庫(kù)設(shè)計(jì)范式共有3個(gè)

第一范式:要求任何一張表必須有主鍵,每一個(gè)字段原子性不可再分。

第二范式:建立在第一范式的基礎(chǔ)之上,要求所有非主鍵字段完全依賴主鍵, 不要產(chǎn)生部分依賴。

第三范式:建立在第二范式的基礎(chǔ)之上,要求所有非主鍵字段直接依賴主鍵, 不要產(chǎn)生傳遞依賴。

設(shè)計(jì)數(shù)據(jù)庫(kù)表的時(shí)候, 按照以上的范式進(jìn)行,可以避免表中數(shù)據(jù)的冗余,空間的浪費(fèi)。

第一范式

最核心,最重要的范式,所有表的設(shè)計(jì)都需要滿足。 必須有主鍵,并且每一個(gè)字段都是原子性不可再分。

學(xué)生編號(hào) 學(xué)生姓名 聯(lián)系方式------------------------------------------1001 張三 [email protected],13599999991002 李四 [email protected],136999999991001 王五 [email protected],13488888888?以上是學(xué)生表,滿足第一范式嗎? 不滿足,第一:沒(méi)有主鍵。第二:聯(lián)系方式可以分為郵箱地址和電話?學(xué)生編號(hào)(pk) 學(xué)生姓名 郵箱地址 聯(lián)系電話----------------------------------------------------1001 張三 [email protected] 13599999991002 李四 [email protected] 136999999991003 王五 [email protected] 13488888888第二范式

4.4、第二范式: 建立在第一范式的基礎(chǔ)之上, 要求所有非主鍵字段必須完全依賴主鍵,不要產(chǎn)生部分依賴。

學(xué)生編號(hào) 學(xué)生姓名 教師編號(hào) 教師姓名

1001 張三 001 王老師 1002 李四 002 趙老師 1003 王五 001 王老師 1001 張三 002 趙老師

這張表描述了學(xué)生和老師的關(guān)系:(1個(gè)學(xué)生可能有多個(gè)老師,1個(gè)老師有多個(gè)學(xué)生) 這是非常典型的:多對(duì)多關(guān)系!

分析以上的表是否滿足第一范式? 不滿足第一范式。

怎么滿足第一范式呢?修改

學(xué)生編號(hào) 教師編號(hào)(pk) 學(xué)生姓名 教師姓名

1001 001 張三 王老師 1002 002 李四 趙老師 1003 001 王五 王老師 1001 002 張三 趙老師

學(xué)生編號(hào) 教師編號(hào),兩個(gè)字段聯(lián)合做主鍵,復(fù)合主鍵(PK: 學(xué)生編號(hào) 教師編號(hào)) 經(jīng)過(guò)修改之后,以上的表滿足了第一范式。但是滿足第二范式嗎? 不滿足,“張三”依賴1001,“王老師”依賴001,顯然產(chǎn)生了部分依賴。 產(chǎn)生部分依賴有什么缺點(diǎn)? 數(shù)據(jù)冗余了。空間浪費(fèi)了。“張三”重復(fù)了,“王老師”重復(fù)了。

為了讓以上的表滿足第二范式,你需要這樣設(shè)計(jì): 使用三張表來(lái)表示多對(duì)多的關(guān)系!!!! 學(xué)生表

學(xué)生編號(hào)(pk) 學(xué)生名字

1001 張三 ? 1002 李四 ? 1003 王五 ?

教師表

教師編號(hào)(pk) 教師姓名

001 王老師

002 趙老師

學(xué)生教師關(guān)系表

id(pk) 學(xué)生編號(hào)(fk) 教師編號(hào)(fk)

1 1001 001 2 1002 002 3 1003 001 4 1001 002

背口訣: 多對(duì)多怎么設(shè)計(jì)? 多對(duì)多,三張表,關(guān)系表兩個(gè)外鍵!

第三范式第三范式建立在第二范式的基礎(chǔ)之上 ? 要求所有非主鍵字典必須直接依賴主鍵,不要產(chǎn)生傳遞依賴。

學(xué)生編號(hào)(PK) 學(xué)生姓名 班級(jí)編號(hào) 班級(jí)名稱

1001 張三 01 一年一班 1002 李四 02 一年二班 1003 王五 03 一年三班 1004 趙六 03 一年三班

以上表的設(shè)計(jì)是描述:班級(jí)和學(xué)生的關(guān)系。很顯然是1對(duì)多關(guān)系! 一個(gè)教室中有多個(gè)學(xué)生。

分析以上表是否滿足第一范式? 滿足第一范式,有主鍵。

分析以上表是否滿足第二范式? 滿足第二范式,因?yàn)橹麈I不是復(fù)合主鍵,沒(méi)有產(chǎn)生部分依賴。主鍵是單一主鍵。

分析以上表是否滿足第三范式? 第三范式要求:不要產(chǎn)生傳遞依賴! 一年一班依賴01,01依賴1001,產(chǎn)生了傳遞依賴。 不符合第三范式的要求。產(chǎn)生了數(shù)據(jù)的冗余。

那么應(yīng)該怎么設(shè)計(jì)一對(duì)多呢?

班級(jí)表:一

班級(jí)編號(hào)(pk) 班級(jí)名稱

01 一年一班 02 一年二班 03 一年三班

學(xué)生表:多

學(xué)生編號(hào)(PK) 學(xué)生姓名 班級(jí)編號(hào)(fk)

1001 張三 01 1002 李四 02 1003 王五 03 1004 趙六 03

背口訣: 一對(duì)多,兩張表,多的表加外鍵!!

表的設(shè)計(jì)總結(jié)

總結(jié)表的設(shè)計(jì)?

一對(duì)多: 一對(duì)多,兩張表,多的表加外鍵

多對(duì)多: 多對(duì)多,三張表,關(guān)系表兩個(gè)外鍵

一對(duì)一: 一對(duì)一放到一張表中不就行了嗎?為啥還要拆分表? 在實(shí)際的開(kāi)發(fā)中,可能存在一張表字段太多,太龐大。這個(gè)時(shí)候要拆分表。 一對(duì)一怎么設(shè)計(jì)? 沒(méi)有拆分表之前:一張表 t_user id login_name login_pwd real_name email

1 zhangsan 123 張三 zhangsan@xxx ? 2 lisi 123 李四 lisi@xxx

這種龐大的表建議拆分為兩張: t_login 登錄信息表 id(pk) login_name login_pwd

1 zhangsan 123 ? 2 lisi 123

t_user 用戶詳細(xì)信息表

id(pk) real_name email login_id(fk unique)

100 張三 zhangsan@xxx 1 200 李四 lisi@xxx 2

口訣:一對(duì)一,外鍵唯一

數(shù)據(jù)庫(kù)設(shè)計(jì)實(shí)際中要注意的

數(shù)據(jù)庫(kù)設(shè)計(jì)三范式是理論上的。

實(shí)踐和理論有的時(shí)候有偏差。

最終的目的都是為了滿足客戶的需求, 有的時(shí)候會(huì)拿冗余換執(zhí)行速度。

因?yàn)樵趕ql當(dāng)中,表和表之間連接次數(shù)越多,效率越低。(笛卡爾積)

有的時(shí)候可能會(huì)存在冗余,但是為了減少表的連接次數(shù),這樣做也是合理的, 并且對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),sql語(yǔ)句的編寫(xiě)難度也會(huì)降低。

原文鏈接:https://blog.csdn.net/qq_61557294/article/details/126925880?utm_source=tuicool&utm_medium=referral

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如有侵權(quán)行為,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

CopyRight ? 外貿(mào)領(lǐng)航 2023 All Rights Reserved.

无码免费一区二区三区免费播放 | 99国产精品白浆在线观看免费| 国产黄色片在线| 国产日韩视频一区| 色综合av综合无码综合网站| 久久精品www| 国产探花一区| 亚洲欧美影音先锋| 国语自产在线不卡| 黄色三级视频在线| 亚洲精品国产suv一区| 久久精品人人做人人爽电影蜜月| 欧美日韩一级视频| 国产在线播放一区二区| 日韩影视一区二区三区| 999久久精品| 国产精品你懂的| 久久久久久中文字幕| 天堂在线资源视频| 欧美特级特黄aaaaaa在线看| 捆绑调教一区二区三区| 亚洲精品v欧美精品v日韩精品| 亚洲欧美日韩精品在线| 国产91av视频| 欧美在线免费| 欧美日韩精品一区二区在线播放| 精品免费国产| 男人的天堂久久久| 成人三级视频| 亚洲成av人片www| 成人高h视频在线| 免费看91的网站| 偷拍亚洲色图| 天天综合网天天综合色| 5566中文字幕一区二区| 91视频免费看片| www.日日操| youjizz.com国产| 国产成人精品一区二三区在线观看| 国产成人自拍高清视频在线免费播放| 最近2019中文免费高清视频观看www99| 欧美日韩福利在线| 国产成人精品一区二区无码呦| 美女免费视频一区二区| 亚洲人成网7777777国产| 国产真人做爰毛片视频直播| www三级免费| 激情亚洲综合在线| 日韩中文字幕免费| 国产又大又黄又猛| 久久青草视频| 国产精品高潮呻吟久久| 国产精品视频成人| 婷婷丁香综合网| 久久免费大视频| 欧美日韩三级一区| 日韩理论片在线观看| 无码人妻丰满熟妇精品区| 午夜亚洲性色视频| 亚洲欧美福利视频| 久久午夜夜伦鲁鲁一区二区| 成人精品国产亚洲| 国产精品传媒视频| 成人免费视频网址| 青青草激情视频| 欧美三区不卡| 欧美精品一区二区不卡 | 国产精品a级| 精品久久久久久亚洲综合网 | 欧美日韩国产免费一区二区 | 成人性生交大片免费看中文视频| 亚洲精品中文在线| 91丨九色丨国产| 日韩aaaaaa| 免费亚洲一区| 在线播放日韩av| 日本77777| 国产精品xxx在线观看| 天天综合色天天综合色h| 欧美少妇一区| 夜夜爽8888| 成人国产电影网| 日本精品一区二区三区在线播放视频| 东方伊人免费在线观看| 一级欧洲+日本+国产| 日韩欧美国产一二三区| 波多野结衣综合网| 黄色欧美视频| 一区二区三区在线观看动漫| 国产一区二区在线网站| 夜夜爽妓女8888视频免费观看| 美女性感视频久久| 欧美国产精品人人做人人爱 | 亚洲欧美一区二区三区极速播放 | 国产精品迅雷| 国产精品久久久一区麻豆最新章节| 成人乱人伦精品视频在线观看| 一区二区三区免费高清视频| 丝袜美腿高跟呻吟高潮一区| 久热精品视频在线免费观看| 日本japanese极品少妇| 久久精品国产99久久| 欧美精品一区二区三区视频| 国产精品人人爽人人爽| 哺乳一区二区三区中文视频| 狠狠v欧美v日韩v亚洲ⅴ| 99精品视频免费在线观看| 久久中文字幕一区| 美女又爽又黄视频毛茸茸| 日韩一区电影| 亚洲国产美女精品久久久久∴| 久久婷婷国产91天堂综合精品| 一级毛片精品毛片| 欧美伊人久久久久久午夜久久久久| 视色,视色影院,视色影库,视色网| 欧美成人性网| 亚洲小说欧美激情另类| 日韩资源av在线| 视频一区 中文字幕| 中文字幕一区二区三区视频| 久久精品日产第一区二区三区乱码 | 欧美日韩成人一区二区| 777精品久无码人妻蜜桃| 成人污污视频| 欧美性受xxxx| 一区二区传媒有限公司| 亚洲**毛片| 欧美性淫爽ww久久久久无| 亚洲国产精品久久久久婷蜜芽| 蜜桃精品一区二区三区| 欧洲日韩一区二区三区| www.av蜜桃| 天堂精品在线视频| 欧美麻豆精品久久久久久| 国产精品wwwww| 亚洲妇女av| 亚洲国产精品久久久久久| 亚洲精品在线网址| 羞羞答答成人影院www| 在线看福利67194| 亚洲第一香蕉网| 国产精品日韩久久久| 久久91亚洲精品中文字幕奶水| 福利视频第一页| 奇米影视一区二区三区小说| 国产成人极品视频| 国产精品久久久久久人| 99国内精品久久| 久久免费视频1| 欧美性xxx| 色综合一个色综合| 国产日韩一区二区在线观看| 美日韩黄色大片| 亚洲国产精久久久久久久| 一边摸一边做爽的视频17国产| 欧美精品午夜| 久久久久久久97| 国产性生活网站| 99热国产精品| 精品国产一区二区三区麻豆免费观看完整版 | 羞羞视频在线观看欧美| 久久久久久久久久久成人| 欧美三级免费看| 国产一区二三区好的| 亚洲tv在线观看| 精品人妻一区二区三区日产乱码| 一区二区三区色| 18禁网站免费无遮挡无码中文| av综合网站| 日韩精品免费观看| 国内精品卡一卡二卡三| 大胆欧美人体视频| 欧美日韩国产精品激情在线播放| 婷婷成人在线| 国产一区二区三区丝袜| 久久久久久久毛片| 久久成人久久爱| 2022国产精品| 五月天婷婷社区| 欧美伊人久久久久久久久影院| 亚洲免费成人在线视频| 激情亚洲网站| 国产99久久久欧美黑人| 欧美性猛交xxxx乱大交hd| 成人欧美一区二区三区1314 | 伊人久久大香线蕉av超碰演员| 欧美国产乱视频| 特级做a爱片免费69| 亚洲国产电影在线观看| 国产资源第一页| 亚洲欧洲av| xxxxx91麻豆| 特一级黄色大片| 国产精品丝袜一区| 在线观看17c| 国产综合久久久| 欧美成人免费全部| 中文字幕亚洲乱码熟女1区2区| 亚洲图片欧美激情| 国产原创中文在线观看 | 日日摸天天爽天天爽视频| 91视频综合| 91精品国产99久久久久久| 中文字幕+乱码+中文乱码91| 亚洲国产中文字幕在线视频综合| 北条麻妃av高潮尖叫在线观看| 韩国自拍一区| 国产日本欧美在线观看| 少妇又色又爽又黄的视频| 欧美日韩在线免费视频| 日韩www视频| 国产资源在线一区| 麻豆亚洲一区| 136国产福利精品导航网址应用| 国产亚洲精品va在线观看| 劲爆欧美第一页| 国产精品久久久久永久免费观看| 男人添女荫道口图片| 中国精品18videos性欧美| 国产精品大片wwwwww| 国产91绿帽单男绿奴| 91麻豆精品国产91久久久使用方法 | 成人免费视频视频| 日韩视频在线免费播放| 精品国产一区二区三区| 97国产精品免费视频| www.xxxx国产| 欧美一区二区三区影视| 国产精品av久久久久久无| 久久久久久久久久久黄色| 午夜免费福利小电影| 亚洲人体偷拍| 国产精品免费区二区三区观看| av一级久久| 久久九九亚洲综合| 中文字幕一区二区在线视频 | 俄罗斯女人裸体性做爰| 激情五月婷婷综合| 亚洲欧洲精品在线 | 一道本一区二区| 国产精品9999久久久久仙踪林| 亚洲国产aⅴ精品一区二区| 久久视频在线直播| 国产精品爽爽久久久久久| 欧美精品1区2区| 天天色天天综合| 亚洲欧美日韩国产手机在线| 亚欧美在线观看| 久久99热这里只有精品| 亚洲精品乱码视频| 成人羞羞视频播放网站| 国产精品久久久久久久久免费看| 二区三区不卡| 在线观看欧美日韩国产| 精品国产www| 欧美喷水一区二区| 国产天堂av在线| 亚洲国产另类精品专区| 日本性生活一级片| 91免费视频大全| 欧美少妇性生活视频| 美日韩一级片在线观看| 中文字幕乱码免费| 亚洲精品1区| 欧美日韩精品综合| 欧美限制电影| 91麻豆桃色免费看| 国产精品qvod| 国产成人精品电影久久久| 欧美大片网站| 欧美激情中文字幕乱码免费| 手机在线精品视频| 在线观看欧美www| 国产肥老妇视频| 日韩av在线免费播放| 超碰在线观看91| 日韩一区二区三区观看| 日本少妇全体裸体洗澡| 91国模大尺度私拍在线视频| 久久久久久久麻豆| 精品国产91久久久| 网爆门在线观看| 亚洲不卡av一区二区三区| 欧洲美一区二区三区亚洲| 中文字幕一区二区5566日韩| 亚洲麻豆一区二区三区| 国产欧美日韩在线观看| 永久看看免费大片| 久久精品在这里| xxxxwww一片| 国产日韩av一区| 无码人妻一区二区三区精品视频 | 一区二区三区四区高清精品免费观看| 稀缺小u女呦精品呦| 国产精品久久夜| 偷偷色噜狠狠狠狠的777米奇| 欧美国产激情二区三区| 国产av一区二区三区传媒| 国产精品女主播av| 强迫凌虐淫辱の牝奴在线观看| 国产精品久久三区| 一区二区不卡免费视频| 亚洲免费在线观看视频| 在线不卡av电影| 亚洲一二三区在线观看| 极品尤物一区二区| 丁香五六月婷婷久久激情| av成人免费网站| 欧美亚洲一区三区| 伊人久久综合视频| 欧美一级国产精品| 亚洲大尺度在线观看| 亚洲成人在线视频播放| 国产精品久久久久久免费 | 国产精品乱码一区二区| 日韩av影片在线观看| a级片在线免费看| 日韩有码视频在线| 日本美女久久| 日韩美女在线播放| 亚洲男人都懂第一日本| 国产乱码精品一区二区三区不卡| 最新国产精品久久久| 亚洲精品日韩成人| 奇米精品一区二区三区在线观看| 美女日批免费视频| www.欧美日韩国产在线| 一本之道在线视频| 亚洲欧美另类图片小说| 亚洲欧美日韩第一页| 欧美午夜不卡视频| 中文字幕亚洲乱码熟女1区2区| 亚洲精品国偷自产在线99热| 亚洲老妇色熟女老太| 欧美日本黄视频| 亚洲午夜免费| 91视频最新| 亚洲性图久久| 无码粉嫩虎白一线天在线观看| 成人激情校园春色| 国产精品一区二区无码对白| 亚洲国产成人av网| 久久精品亚洲无码| 亚洲国产97在线精品一区| 日本精品一二区| 欧美与黑人午夜性猛交久久久| 亚洲精品合集| 欧美中文娱乐网| 日韩av一二三| 欧美成人福利在线观看| 成人免费在线播放视频| 亚洲一级生活片| 欧美成人性战久久| 人成网站在线观看| 51午夜精品视频| 国产乱码精品一区二区亚洲| 日产中文字幕在线精品一区| 蜜臀91精品一区二区三区| 午夜久久福利视频| 亚洲素人一区二区| 久久精品第一页| 日韩精品高清视频| 国产成人精品一区二区三区视频| 国产一区二中文字幕在线看| 欧美日韩国产探花| 色综合久久久久无码专区| 久久日韩精品一区二区五区| 特级西西www444人体聚色 | 成a人片亚洲日本久久| 欧美做受高潮中文字幕| 黑人巨大精品欧美一区二区一视频| 五月婷婷色丁香| 日韩一区二区三区xxxx| 草草视频在线一区二区| 欧美在线一二三区| 国产精品一区二区三区乱码| 日本性生活一级片| 欧美吻胸吃奶大尺度电影 | 亚洲免费av网址| 九七电影院97理论片久久tvb| 92国产精品视频| 亚洲深夜福利| 九九热免费在线观看| 五月综合激情婷婷六月色窝| 国产一级片免费视频| 欧美成人午夜影院| 狠狠综合久久av一区二区蜜桃| 在线无限看免费粉色视频| 99久久综合99久久综合网站| 天天干天天舔天天操| 欧美精品一区二区久久婷婷| 福利一区二区三区视频在线观看 | 亚洲成人动漫在线| 99久久精品99国产精品| 欧美a级片免费看| 亚洲精品日韩丝袜精品| 国产高清精品二区| 欧美精品在线一区| 国产成人午夜视频| 免费看黄色三级|