- 今日推薦
-
- 寧夏警方破獲一起特大網(wǎng)絡(luò)電信詐騙案「經(jīng)開(kāi)區(qū)警方搗毀一特大傳銷團(tuán)伙」
- 市商務(wù)局赴各縣區(qū)開(kāi)展跨境電商政策及業(yè)務(wù)培訓(xùn)活動(dòng)方案「鄭州商務(wù)局跨境電商補(bǔ)貼」
- 跟鮮花有關(guān)的創(chuàng)業(yè)「鮮花都賣光了,我種一束給你吧」
- 阿聯(lián)酋航空公司a380頭等艙「頭等艙洗澡」
- 湘潭市招商局「湘潭市招商局」
- mac口紅色號(hào)選擇「mac口紅滋潤(rùn)的幾款」
- 昆山花橋度假酒店「昆山周市鎮(zhèn)」
- 警方提示最新騙局曝光專門針對(duì)高考考生和家長(zhǎng)的信息「有警方在聯(lián)系影視投資詐騙」
- 與進(jìn)口美國(guó)天然氣相比中國(guó)從俄羅斯「俄羅斯賣給中國(guó)天然氣價(jià)格」
- 推進(jìn)跨境電子商務(wù)綜合試驗(yàn)區(qū)建設(shè)「跨境電子商務(wù)試點(diǎn)城市」
- 特別關(guān)注
-
- 連續(xù)劇權(quán)力的游戲「權(quán)力的游戲hbo」
- appstore付費(fèi)排行「月秀App」
- 安陽(yáng)新地標(biāo)「安陽(yáng)cbd公園」
- 呂迪格轉(zhuǎn)會(huì)皇馬「皇馬09年轉(zhuǎn)會(huì)轟動(dòng)」
- 警惕天津又有人被騙了「天津電信詐騙」
- 墨西哥人被美國(guó)人歧視「墨西哥這么亂有華人嗎」
- 巴西包稅渠道「了解稅務(wù)政策」
- 這家公司儲(chǔ)能領(lǐng)域已獲千萬(wàn)訂單「儲(chǔ)能還有行情嗎」
- 阜陽(yáng)專賣店「阜陽(yáng)特產(chǎn)店」
- 低碳生活靠科技創(chuàng)新還是觀念創(chuàng)新「碳中和機(jī)會(huì)」
- 熱門點(diǎn)擊
-
- 政府跨境電商服務(wù)平臺(tái)「上海跨境電商公共服務(wù)平臺(tái)」
- 福田年貨節(jié)「深圳市節(jié)假日貨車限行嗎」
- 國(guó)內(nèi)電纜龍頭企業(yè)「普睿司曼電線質(zhì)量怎么樣」
- 跨境電商企業(yè)的財(cái)務(wù)如何合規(guī)「財(cái)稅合規(guī)什么意思」
- 煙臺(tái)綜保區(qū)跨境電商海關(guān)監(jiān)管中心首批貨物出口公示「煙臺(tái)保稅港區(qū)」
- 美歐峰會(huì)聲明「中國(guó)與歐盟簽署協(xié)議」
- 瓷磚分哪些等級(jí)「瓷磚怎么分等級(jí)劃分」
- 跨境店鋪的管理「跨境電商管理平臺(tái)」
- 科比生涯總得分多少「科比生涯中投命中率」
- 什么是跨境電商品牌出海「京東海外站國(guó)貨選品」
mysql基礎(chǔ)知識(shí)總結(jié)「MySQL數(shù)據(jù)庫(kù)原理、設(shè)計(jì)與應(yīng)用」
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)以表格的形式存儲(chǔ)數(shù)據(jù)
任何一張表都有行和列:
行(row):被稱為數(shù)據(jù)/記錄。 列(column):被稱為字段。
每一個(gè)字段都有:字段名、數(shù)據(jù)類型、約束等屬性。 字段名可以理解是一個(gè)普通的名字,見(jiàn)名知意就行。 數(shù)據(jù)類型:字符串,數(shù)字,日期等。
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
相關(guān)文章
- 跨境電商一天5000單什么水平「跨境電商月入多少」
- 石獅女裝特賣會(huì)場(chǎng)「泉州寰球鞋服董事長(zhǎng)」
- 華銳風(fēng)電最新消息:高管辭職「A股高管辭職」
- 龍崗跨境電商運(yùn)營(yíng)中心地址「龍崗電商大廈有哪些電商公司」
- 南通國(guó)家級(jí)高新技術(shù)產(chǎn)業(yè)開(kāi)發(fā)區(qū)「南通跨境電商產(chǎn)業(yè)園」
- 網(wǎng)紅經(jīng)濟(jì)的影響力「經(jīng)濟(jì)支柱」
- 跨境電商高峰期「跨境電商未來(lái)的發(fā)展呈現(xiàn)什么趨勢(shì)」
- 門面模式與外觀模式「外觀設(shè)計(jì)模式」
- 崇陽(yáng)勞務(wù)派遣公司「崇左臨時(shí)工最新招聘」
- 和牛在哪吃「牛種哪里有」
- 如何防止亞馬遜跟賣「亞馬遜遇到跟賣怎么辦」
- 暖暖環(huán)游世界百美圖驚鴻高分「百美圖暖暖環(huán)游世界關(guān)雎」
- 昆山為什么叫小臺(tái)灣「昆山臺(tái)灣商品交易中心」
- 武漢跨境電商發(fā)展「湖北自貿(mào)區(qū)」
- 新疆洽談會(huì)「第七屆中國(guó)國(guó)際服務(wù)貿(mào)易交易會(huì)」
- 福田跨境電商小微創(chuàng)業(yè)園「與電商有關(guān)的企業(yè)」
- 跨境電商的出口退稅怎么做「跨境電商退貨退稅」
