日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

日常SQL常见问题(二)

發(fā)布時(shí)間:2025/4/5 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 日常SQL常见问题(二) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)秀' end

1.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)

select * from test_1234 join test_1235; 等價(jià)于select * from test_1234,test_1235;

結(jié)果集是兩個(gè)表的笛卡爾積
2.inner join 連接兩個(gè)表(有on)

select * from test_1234 t1 join test_1235 t2 on t1.trade_id = t2.trade_id;


結(jié)果集是兩個(gè)表有相同trade_id的數(shù)據(jù)
3.inner join 連接兩個(gè)表(有where)

select * from test_1234 t1 join test_1235 t2 where t1.trade_id = t2.trade_id;


結(jié)果集是兩個(gè)表有相同trade_id的數(shù)據(jù),從2和3的結(jié)果中我們可以看出,在使用inner join連接時(shí),on和where的作用相等.
4.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;


結(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子句中

select * from test_1234 t1 left join test_1235 t2 on t1.trade_id = t2.trade_id where t2.nick_name = 'wangwu';


結(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 |
±-----±-----±-------±------+

select g.id,g.name,g.weight,sum(t.count) from goods g inner join trans t on g.id = t.goods_id where g.weight<50 --不能同時(shí)用sum(t.count),因?yàn)楸砝餂](méi)有該字段 group by g.id having sum(t.count)>20 order by g.id;

from here

總結(jié)

以上是生活随笔為你收集整理的日常SQL常见问题(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。