日常SQL常见问题(二)
MySQL中的函數(shù)相關(guān)
MySQL考試試題及答案
MySQL中數(shù)據(jù)類(lèi)型
在MySQL數(shù)據(jù)庫(kù)中, 字段或列的注釋是用屬性comment來(lái)添加。
SQL優(yōu)化:避免全表掃描;考慮在where和order by涉及的列建立索引;
避免在where子句中使用!=或者<>;或者使用or來(lái)連接條件;或者使用in和not in;或者like‘%abc%’;或者對(duì)字段進(jìn)行表達(dá)式操作;或者對(duì)字段進(jìn)行函數(shù)操作;有時(shí)候用exist代替in比較好;
char:定長(zhǎng),簡(jiǎn)單,浪費(fèi)空間,存取速度快 0-255
varchar:變長(zhǎng),精準(zhǔn),節(jié)省空間,存取速度慢 0-65535
盡量使用varchar代替char
1.SQL 語(yǔ)句中 where 條件后 寫(xiě)上1=1 是什么意思?
我們知道1=1表示true,即永真,在SQL注入時(shí)配合or運(yùn)算符會(huì)得到意向不到的結(jié)果;
有1=1就會(huì)有1<>1或1=2之類(lèi)的永假的條件,這個(gè)在拷貝表的時(shí)候,加上where 1<>1,意思就是沒(méi)有任何一條記錄符合條件,這樣我們就可以只拷貝表結(jié)構(gòu),不拷貝數(shù)據(jù)了;
超過(guò)經(jīng)理收入的員工
select a.Name Employee from Employee a inner join Employee b on a.ManagerId = b.Id where a.Salary>b.Salary; 或者 select c1.Name as Employee from Employee as c1,Employee as c2 where c1.ManagerId = c2.Id and c1.Salary>c2.Salary;case 搜索函數(shù)法:
case when score<60 then '不及格'when score<70 then '一般'when score<85 then '良好'else '優(yōu)秀' end1.mysql中count的用法
一、count情況
1、count(1):可以統(tǒng)計(jì)表中所有數(shù)據(jù),不統(tǒng)計(jì)所有的列,用1代表代碼行,在統(tǒng)計(jì)結(jié)果中包含列字段為null的數(shù)據(jù);
2、count(字段):只包含列名的列,統(tǒng)計(jì)表中出現(xiàn)該字段的次數(shù),并且不統(tǒng)計(jì)字段為null的情況;
3、count(*):統(tǒng)計(jì)所有的列,相當(dāng)于行數(shù),統(tǒng)計(jì)結(jié)果中會(huì)包含字段值為null的列;
二、count執(zhí)行效率
列名為主鍵,count(列名)比count(1)快;列名不為主鍵,count(1)會(huì)比count(列名)快;
如果表中多個(gè)列并且沒(méi)有主鍵,則count(1)的執(zhí)行效率優(yōu)于count(*);
如果有主鍵,則select count(主鍵)的執(zhí)行效率是最優(yōu)的;如果表中只有一個(gè)字段,則select count(xing)最優(yōu)。
1.Mysql中where與on的區(qū)別及何時(shí)使用詳析
首先有兩張表:test_1234
test_1235;
說(shuō)明:區(qū)分on和where首先我們將連接分為內(nèi)部連接和非內(nèi)部連接,內(nèi)部連接時(shí)on和where的作用是一樣的,通常我們分不清它們的區(qū)別說(shuō)的是非內(nèi)部連接(left join、right join、full join等);
一般on用來(lái)連接兩個(gè)表,指的是連接的條件,在內(nèi)部連接時(shí),可以省略on,此時(shí)它表示的是兩個(gè)表的笛卡爾積;使用on連接后,mysql會(huì)生成一張臨時(shí)表,而where就是在臨時(shí)表的基礎(chǔ)上,根據(jù)where子句來(lái)篩選出符合條件的記錄,因此where是用來(lái)篩選的。
內(nèi)部連接(inner join)
說(shuō)明:join默認(rèn)為inner join,當(dāng)為內(nèi)部連接時(shí),on和where的作用你可以看做是一樣的,一般分不清區(qū)別就是在使用非內(nèi)部連接時(shí)。
1.inner join 連接兩個(gè)表(無(wú)on和where)
結(jié)果集是兩個(gè)表的笛卡爾積
2.inner join 連接兩個(gè)表(有on)
結(jié)果集是兩個(gè)表有相同trade_id的數(shù)據(jù)
3.inner join 連接兩個(gè)表(有where)
結(jié)果集是兩個(gè)表有相同trade_id的數(shù)據(jù),從2和3的結(jié)果中我們可以看出,在使用inner join連接時(shí),on和where的作用相等.
4.left join(下面以left join為例來(lái)連接兩個(gè)表) 連接兩個(gè)表
結(jié)果集是以左面的表為基礎(chǔ),直接根據(jù)trade_id去右邊查詢(xún)相等的值然后連接,如果右表沒(méi)有符合的數(shù)據(jù),則都顯示為null.
5.left join(下面以left join為例來(lái)連接兩個(gè)表) 連接兩個(gè)表,連接條件中有常量等式
SELECT * FROM test_1234 t1 LEFT JOIN test_1235 t2 ON t1.trade_id=t2.trade_id and t2.nick_name='wangwu';
結(jié)果集是以左面的表為基礎(chǔ),如果on連接條件最后沒(méi)有找到匹配的記錄,則都顯示null
6.left join(下面以left join為例來(lái)連接兩個(gè)表) 連接兩個(gè)表,將常量表達(dá)式放入where子句中
結(jié)果只會(huì)顯示符合where子句的數(shù)據(jù),只要沒(méi)有符合的都不會(huì)顯示,因?yàn)樗呛Y選連接后的臨時(shí)表中的數(shù)據(jù),而on只是連接,如果右邊沒(méi)有符合的數(shù)據(jù),就顯示null,而左邊的數(shù)據(jù)都會(huì)顯示,不會(huì)被過(guò)濾,這就是where和on最大的區(qū)別。
力扣自連接寫(xiě)法(與以上文章不相關(guān)):
-- a表中的經(jīng)理Id=b表中的員工Id,即b表中 的人員都是a表中的經(jīng)理 select a.Name Employee from Employee a inner join Employee b on a.ManagerId = b.Id where a.Salary>b.Salary;from here
2.正確理解MySQL中的where和having的區(qū)別
前言:where: 后面不能接聚合函數(shù) ,可以接單行函數(shù)。
單行函數(shù):就是使用函數(shù)查詢(xún)返回一條結(jié)果如(等于,時(shí)間轉(zhuǎn)換,轉(zhuǎn)換函數(shù)等)
聚合函數(shù):就是使用函數(shù)查詢(xún)返回多調(diào)數(shù)據(jù)的如(大于,小于,不等于)
having: 在group by 之后執(zhí)行 可以接聚合函數(shù)
示例:
1) 只可以用having,不可以用where情況
查詢(xún)每種goods_category_id商品的價(jià)格平均值,獲取平均價(jià)格大于1000元的商品信息
select goods_category_id , avg(goods_price) as ag from sw_goods group by goods_category having ag > 1000 select goods_category_id , avg(goods_price) as ag from sw_goods where ag>1000 group by goods_category //報(bào)錯(cuò)!!因?yàn)閒rom sw_goods 這張數(shù)據(jù)表里面沒(méi)有ag這個(gè)字段注意:where 后面要跟的是數(shù)據(jù)表里的字段,如果我把a(bǔ)g換成avg(goods_price)也是錯(cuò)誤的!因?yàn)楸砝餂](méi)有該字段。***而having只是根據(jù)前面查詢(xún)出來(lái)的是什么***就可以后面接什么。
2)只可以用where,不可以用having的情況
select goods_name,goods_number from sw_goods where goods_price > 100 select goods_name,goods_number from sw_goods having goods_price > 100 //報(bào)錯(cuò)!!!因?yàn)榍懊娌](méi)有篩選出goods_price 字段3)where和having都可以使用的場(chǎng)景
select goods_price,goods_name from sw_goods where goods_price > 100 select goods_price,goods_name from sw_goods having goods_price > 100解釋:上面的having可以用的前提是我已經(jīng)篩選出了goods_price字段,在這種情況下和where的效果是等效的,但是如果我沒(méi)有select goods_price 就會(huì)報(bào)錯(cuò)!!因?yàn)閔aving是從前篩選的字段再篩選,而where是從數(shù)據(jù)表中的字段直接進(jìn)行的篩選的。
**舉例:**商品交易(網(wǎng)易校招筆試真題)
描述
如下有一張商品表(goods),字段依次為:商品id、商品名、商品質(zhì)量
±-----±-----±-------+
| id | name | weight |
±-----±-----±-------+
| 1 | A1 | 100 |
| 2 | A2 | 20 |
| 3 | B3 | 29 |
| 4 | T1 | 60 |
| 5 | G2 | 33 |
| 6 | C0 | 55 |
±-----±-----±-------+
還有一張交易表(trans),字段依次為:交易id、商品id、這個(gè)商品購(gòu)買(mǎi)個(gè)數(shù)
±-----±---------±------+
| id | goods_id | count |
±-----±---------±------+
| 1 | 3 | 10 |
| 2 | 1 | 44 |
| 3 | 6 | 9 |
| 4 | 1 | 2 |
| 5 | 2 | 65 |
| 6 | 5 | 23 |
| 7 | 3 | 20 |
| 8 | 2 | 16 |
| 9 | 4 | 5 |
| 10 | 1 | 3 |
±-----±---------±------+
查找購(gòu)買(mǎi)個(gè)數(shù)超過(guò)20,質(zhì)量小于50的商品,按照商品id升序排序,如:
±-----±-----±-------±------+
| id | name | weight | total |
±-----±-----±-------±------+
| 2 | A2 | 20 | 81 |
| 3 | B3 | 29 | 30 |
| 5 | G2 | 33 | 23 |
±-----±-----±-------±------+
from here
總結(jié)
以上是生活随笔為你收集整理的日常SQL常见问题(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。