在線做圖的網(wǎng)站長沙網(wǎng)站推廣 下拉通推廣
1、把查詢結(jié)果中去除重復(fù)記錄
?
2、連接查詢?
從一張表中單獨(dú)查詢,稱為單表查詢。emp表和dept表聯(lián)合起來查詢數(shù)據(jù),從emp表中取員工名字,從dept表中取部門名字,這種跨表查詢,多張表聯(lián)合起來查詢數(shù)據(jù),被稱為連接查詢。
(1)連接查詢的分類
根據(jù)表連接的方式分類:內(nèi)連接、外連接、全連接(幾乎不用)
內(nèi)連接又分為等值連接、非等值連接和自連接
外連接又分為左外連接(左連接)、右外連接(右連接)
(2)當(dāng)兩張表進(jìn)行連接查詢時(shí),沒有任何條件的限制會發(fā)生什么現(xiàn)象?
最終的查詢結(jié)果條數(shù),是兩張表?xiàng)l數(shù)的乘積,這種現(xiàn)象被稱為笛卡爾積現(xiàn)象
表的連接次數(shù)越多效率越低,盡量避免表的連接次數(shù)
例子:查詢每個(gè)員工所在的部門名稱
(3)避免笛卡爾積現(xiàn)象就是連接時(shí)加條件
?(4)?內(nèi)連接的等值連接
例子:查詢每個(gè)員工所在部門名稱,顯示員工名和部門名
?SQL92的缺點(diǎn):結(jié)構(gòu)不清晰,表的連接條件,和后期進(jìn)一步篩選的條件,都放到了where后面?
SQL99的優(yōu)點(diǎn):表連接的條件是獨(dú)立的,連接之后,如果還需要進(jìn)一步篩選,再往后繼續(xù)添加where
(5)內(nèi)連接的非等值連接
例子:找出每個(gè)員工的薪資等級
(6)內(nèi)連接的自連接
例子:查詢員工的上級領(lǐng)導(dǎo)(一張表看成兩張表)
(7)外連接
內(nèi)連接的特點(diǎn):查詢出能夠匹配上條件的數(shù)據(jù),A和B兩張表沒有主次關(guān)系
外連接:兩張表連接產(chǎn)生了主次關(guān)系
外連接的查詢結(jié)果條數(shù)一定大于等于內(nèi)連接的查詢結(jié)果條數(shù)
?
(8)三張以上的表
select ...
from a join b on a和b的連接條件
join c on a和c的連接條件
join d? on a和d的連接條件
一條SQL中內(nèi)連接和外連接可以混合
例子:找出每個(gè)員工的部門名稱以及工資等級,要求顯示員工名、部門名、薪資、薪資等級
找出每個(gè)員工的部門名稱以及工資等級,還有上級領(lǐng)導(dǎo),要求顯示員工名、領(lǐng)導(dǎo)名、部門名、薪資、薪資等級?

3、子查詢
select語句中嵌套select語句,被嵌套的select語句稱為子查詢
select ...(select) from ...(select) where ...(select)
(1)where子句中的子查詢
例子:找出比最低工資高的員工姓名和工資
(2)from子句中的字查詢
?注意:from后面的子查詢,可以將子查詢的查詢結(jié)果當(dāng)做一張臨時(shí)表
例子:找出每個(gè)崗位的平均工資的薪資等級
(3)select后面出現(xiàn)的子查詢(了解)
例子:找出每個(gè)員工的部門名稱
?注意:對于select后面的子查詢來說,這個(gè)子查詢只能一次返回1條結(jié)果,多余1條會報(bào)錯(cuò)
4、union合并查詢結(jié)果集
例子:查詢工作崗位是MANAGER和SALESMAN的員工
a連接b連接c
a 10條記錄?
b 10條記錄?
c 10條記錄?
匹配次數(shù)是:1000
a連接b一個(gè)結(jié)果:10*10=100次
a連接c一個(gè)結(jié)果:10*10=100次
使用union的話:100+100=200次
5、limit(重要)
limit將查詢結(jié)果集的一部分取出來,通常使用在分頁查詢當(dāng)中(分頁作用是提升用戶體驗(yàn))
完整用法:limit startIndext,length
缺省用法:limit 5; 這是取前5
注意:mysql當(dāng)中l(wèi)imit在order by之后執(zhí)行
例子:按照薪資降序,取出排名在前5名的員工
分頁
?每頁顯示3條記錄
第一頁:limit 0,3
第二頁:limit 3,3
第三頁:limit 6,3
第四頁:limit 9,3
...
每頁顯示pageSize條記錄
第pageNo頁:limit (pageNo-1)*pageSize, pageSize
6、關(guān)于DQL語句的總結(jié)
select ... from ... where ... group by ... having ... order by ... limit ...
執(zhí)行順序:from、where、group by、having、select、order by、limit
7、表的創(chuàng)建(建表)
建表屬于DDL語句,DDL包括:create、drop、alter
(1)語法
create table 表名(字段名1 數(shù)據(jù)類型,字段名2 數(shù)據(jù)類型, 字段名3 數(shù)據(jù)類型);
表名建議以t_或者tbl_開始,可讀性強(qiáng)
(2)關(guān)于mysql中常見的數(shù)據(jù)類型
- varchar:可變長度的字符串,最長255。節(jié)省空間,會根據(jù)實(shí)際的數(shù)據(jù)長度動態(tài)分配空間。優(yōu)點(diǎn)節(jié)省空間,缺點(diǎn)需要?jiǎng)討B(tài)分配空間,速度慢。
- char:定長字符串,最長255。不管實(shí)際的數(shù)據(jù)長度,分配固定長度的空間取存儲數(shù)據(jù)。優(yōu)點(diǎn)不需要?jiǎng)討B(tài)分配空間,速度快,缺點(diǎn)使用不當(dāng)可能會導(dǎo)致空間的浪費(fèi)。
比如性別字段選char,姓名字段選varchar
- int:數(shù)字中的整數(shù)型,最長11,等同于java中的int
- bigint:數(shù)字中的長整型,等同于java中的long
- float:單精度浮點(diǎn)型數(shù)據(jù)
- double:雙精度浮點(diǎn)型數(shù)據(jù)
- date:短日期
- datetime:長日期
- clob:字符大對象,最多可以存儲4G的字符串,超過255個(gè)字符的都要采用CLOB大對象來存儲。比如存儲一篇文章。
- blob:二進(jìn)制大對象,Binary Large Object,專門用來存儲圖片、聲音、視頻等流媒體數(shù)據(jù)。往BLOB類型的字段上插入數(shù)據(jù)時(shí),例如插入一個(gè)圖片、視頻等,需要使用IO流才行。
舉例:t_movie電影表
電影編號 no(bigint)
電影名 name(vachar)
描述信息 description(clob)
上映日期 playtime(data)
時(shí)長 time(double)
海報(bào) image(blob)
類型 type(char)
(3)創(chuàng)建一個(gè)學(xué)生表(學(xué)號、姓名、年齡、性別、郵箱地址)
create table t_student(no int, name varchar(32), age int(3), sex char(1),email varchar(255));
刪除表
drop table t_student;? 當(dāng)這張表不存在的時(shí)候會報(bào)錯(cuò)
drop table if exits t_student;
(4)插入數(shù)據(jù)
insert into 表名(字段名1,字段名2,字段名3,...) values (值1,值2,值3,...);
注意:字段名要和值一一對應(yīng),數(shù)量要對應(yīng),數(shù)據(jù)類型要對應(yīng)
數(shù)據(jù)庫中的命名規(guī)范:所有的標(biāo)識符都是全部小寫,單詞和單詞之間使用下劃線進(jìn)行銜接
注意:insert語句但凡是執(zhí)行成功了,必然會多一條記錄。沒有給其他字段指定值的話,默認(rèn)值是NULL
創(chuàng)建表時(shí)給默認(rèn)值:
create table t_student(no int, name varchar(32), age int(3), sex char(1) default '女',email varchar(255));
insert語句的字段名可以省略,但是值都要按順序?qū)懮?#xff1a;
(5)插入日期?
數(shù)字格式化:format(數(shù)據(jù),'格式')
str_to_data:將字符串varchar類型轉(zhuǎn)換成date類型,通常使用在插入insert上
date_format:將date類型轉(zhuǎn)換成具有一定格式的varchar字符串類型,通常使用在查詢select上
mysql的日期格式:
- %Y 年
- %m 月
- %d 日
- %h 時(shí)
- %i 分
- %s 秒
str_to_date
?如果提供的字符串是'%Y-%m-%d'的格式,str_to_date就可以不寫了
date_format
以上的SQL語句實(shí)際上是進(jìn)行了默認(rèn)的日期格式化,自動將數(shù)據(jù)庫中的date類型轉(zhuǎn)換成varchar類型,并且采用的格式是mysql默認(rèn)的日期格式:%Y-%m-%d
?(6)date和datetime兩個(gè)類型的區(qū)別
date是短日期:只包括年月日,默認(rèn)格式%Y-%m-%d
datetime是長日期:包括年月日時(shí)分秒,默認(rèn)格式%Y-%m-%d %h:%i:%s
在mysql中獲取系統(tǒng)當(dāng)前時(shí)間使用now()函數(shù),并且獲取的時(shí)間帶有時(shí)分秒信息
(7)修改update
語法格式:update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3...where 條件;
注意:沒有條件限制會導(dǎo)致所有數(shù)據(jù)全部更新
(8)刪除數(shù)據(jù)delete
語法格式:delete from 表名 where 條件;
注意:沒有條件,整張表的數(shù)據(jù)會全部刪除