日常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 '優秀' end1.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)
結果集是兩個表的笛卡爾積
2.inner join 連接兩個表(有on)
結果集是兩個表有相同trade_id的數據
3.inner join 連接兩個表(有where)
結果集是兩個表有相同trade_id的數據,從2和3的結果中我們可以看出,在使用inner join連接時,on和where的作用相等.
4.left join(下面以left join為例來連接兩個表) 連接兩個表
結果集是以左面的表為基礎,直接根據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子句中
結果只會顯示符合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 |
±-----±-----±-------±------+
from here
總結
以上是生活随笔為你收集整理的日常SQL常见问题(二)的全部內容,希望文章能夠幫你解決所遇到的問題。