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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

日常SQL常见问题(二)

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

MySQL中的函數相關
MySQL考試試題及答案
MySQL中數據類型
在MySQL數據庫中, 字段或列的注釋是用屬性comment來添加。

SQL優化:避免全表掃描;考慮在where和order by涉及的列建立索引;
避免在where子句中使用!=或者<>;或者使用or來連接條件;或者使用in和not in;或者like‘%abc%’;或者對字段進行表達式操作;或者對字段進行函數操作;有時候用exist代替in比較好;

char:定長,簡單,浪費空間,存取速度快 0-255
varchar:變長,精準,節省空間,存取速度慢 0-65535
盡量使用varchar代替char

1.SQL 語句中 where 條件后 寫上1=1 是什么意思?
我們知道1=1表示true,即永真,在SQL注入時配合or運算符會得到意向不到的結果;
有1=1就會有1<>1或1=2之類的永假的條件,這個在拷貝表的時候,加上where 1<>1,意思就是沒有任何一條記錄符合條件,這樣我們就可以只拷貝表結構,不拷貝數據了;

超過經理收入的員工

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 搜索函數法:

case when score<60 then '不及格'when score<70 then '一般'when score<85 then '良好'else '優秀' end

1.mysql中count的用法

一、count情況

1、count(1):可以統計表中所有數據,不統計所有的列,用1代表代碼行,在統計結果中包含列字段為null的數據;
2、count(字段):只包含列名的列,統計表中出現該字段的次數,并且不統計字段為null的情況;
3、count(*):統計所有的列,相當于行數,統計結果中會包含字段值為null的列;

二、count執行效率

列名為主鍵,count(列名)比count(1)快;列名不為主鍵,count(1)會比count(列名)快;
如果表中多個列并且沒有主鍵,則count(1)的執行效率優于count(*);
如果有主鍵,則select count(主鍵)的執行效率是最優的;如果表中只有一個字段,則select count(xing)最優。

1.Mysql中where與on的區別及何時使用詳析

首先有兩張表:test_1234

test_1235;

說明:區分on和where首先我們將連接分為內部連接和非內部連接,內部連接時on和where的作用是一樣的,通常我們分不清它們的區別說的是非內部連接(left join、right join、full join等);
一般on用來連接兩個表,指的是連接的條件,在內部連接時,可以省略on,此時它表示的是兩個表的笛卡爾積;使用on連接后,mysql會生成一張臨時表,而where就是在臨時表的基礎上,根據where子句來篩選出符合條件的記錄,因此where是用來篩選的
內部連接(inner join)
說明:join默認為inner join,當為內部連接時,on和where的作用你可以看做是一樣的,一般分不清區別就是在使用非內部連接時。
1.inner join 連接兩個表(無on和where)

select * from test_1234 join test_1235; 等價于select * from test_1234,test_1235;

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

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


結果集是兩個表有相同trade_id的數據
3.inner join 連接兩個表(有where)

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


結果集是兩個表有相同trade_id的數據,從2和3的結果中我們可以看出,在使用inner join連接時,on和where的作用相等.
4.left join(下面以left join為例來連接兩個表) 連接兩個表

SELECT * FROM test_1234 t1 LEFT JOIN test_1235 t2 ON t1.trade_id=t2.trade_id;


結果集是以左面的表為基礎,直接根據trade_id去右邊查詢相等的值然后連接,如果右表沒有符合的數據,則都顯示為null.

5.left join(下面以left join為例來連接兩個表) 連接兩個表,連接條件中有常量等式

SELECT * FROM test_1234 t1 LEFT JOIN test_1235 t2 ON t1.trade_id=t2.trade_id and t2.nick_name='wangwu';


結果集是以左面的表為基礎,如果on連接條件最后沒有找到匹配的記錄,則都顯示null
6.left join(下面以left join為例來連接兩個表) 連接兩個表,將常量表達式放入where子句中

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


結果只會顯示符合where子句的數據,只要沒有符合的都不會顯示,因為它是篩選連接后的臨時表中的數據,而on只是連接,如果右邊沒有符合的數據,就顯示null,而左邊的數據都會顯示,不會被過濾,這就是where和on最大的區別。

力扣自連接寫法(與以上文章不相關):

-- a表中的經理Id=b表中的員工Id,即b表中 的人員都是a表中的經理 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的區別

前言:where: 后面不能接聚合函數 ,可以接單行函數。
單行函數:就是使用函數查詢返回一條結果如(等于,時間轉換,轉換函數等)
聚合函數:就是使用函數查詢返回多調數據的如(大于,小于,不等于)
having: 在group by 之后執行 可以接聚合函數
示例:

1) 只可以用having,不可以用where情況

查詢每種goods_category_id商品的價格平均值,獲取平均價格大于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 //報錯!!因為from sw_goods 這張數據表里面沒有ag這個字段

注意:where 后面要跟的是數據表里的字段,如果我把ag換成avg(goods_price)也是錯誤的!因為表里沒有該字段。***而having只是根據前面查詢出來的是什么***就可以后面接什么。

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 //報錯!!!因為前面并沒有篩選出goods_price 字段

3)where和having都可以使用的場景

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可以用的前提是我已經篩選出了goods_price字段,在這種情況下和where的效果是等效的,但是如果我沒有select goods_price 就會報錯!!因為having是從前篩選的字段再篩選,而where是從數據表中的字段直接進行的篩選的。

**舉例:**商品交易(網易校招筆試真題)
描述
如下有一張商品表(goods),字段依次為:商品id、商品名、商品質量
±-----±-----±-------+
| id | name | weight |
±-----±-----±-------+
| 1 | A1 | 100 |
| 2 | A2 | 20 |
| 3 | B3 | 29 |
| 4 | T1 | 60 |
| 5 | G2 | 33 |
| 6 | C0 | 55 |
±-----±-----±-------+
還有一張交易表(trans),字段依次為:交易id、商品id、這個商品購買個數
±-----±---------±------+
| 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 |
±-----±---------±------+

查找購買個數超過20,質量小于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 --不能同時用sum(t.count),因為表里沒有該字段 group by g.id having sum(t.count)>20 order by g.id;

from here

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。