SQL刷題
SQL基礎——
1.要求查詢所有列
——有兩種方式,
方式一:select * from 表名;
方式二:select 列名1,列名2,列名3... from 表名;
實際開發中,更建議使用第二種,因為第一種實際上需要先將*轉化為每個列名,然後再開始查詢,執行時間相對第二種更久,記憶體佔用更高。
且在實際的業務需求中,通過第二種方式 select 列名 來查詢可以自定義顯示的順序,以及顯示的欄位,更加靈活。
2.運營只需要檢視前2個使用者明細裝置ID資料,請你從使用者資訊表 user_profile 中取出相應結果
——有三種方式,
select device_id from user_profile limit 0,2---執行效率高
select device_id from user_profile limit 2 ---執行效率低
也可結合 limit offset: 一起使用時,limit表示要取的數量,offset表示跳過的數量
select device_id from user_profile limit 2 offset 0 // 跳過0條,從第一條資料開始取,取兩條資料 ---執行效率中
使用LIMIT限制結果集
LIMIT 子句可以被用於強制 SELECT 語句返回指定的記錄數。
LIMIT 接受一個或兩個數字引數。引數必須是一個整數常量。
如果只給定一個引數,它表示返回最大的記錄行數目。
如果給定兩個引數,第一個引數指定第一個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。
為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個引數為 -1。
初始記錄行的偏移量是 0(而不是 1)。
檢索記錄行 6-10——SELECT
*
FROM
table
LIMIT 5,5
SELECT
*
FROM
table
LIMIT 10,-1
檢索前 5 個記錄行——SELECT
*
FROM
table
LIMIT 5
3.需要檢視前2個使用者明細裝置ID資料,並將列名改為 'user_infos_example',請你從使用者資訊表取出相應結果
select device_id user_infos_example from user_profile limit 0,2;
//1.as 寫不寫都可
//2.別名加不加引號(單雙)都可
//加引號:別名就是引號內的內容。
//不加引號:別名如果為小寫,會解析為大寫,別名實際為大寫。
//以上兩點在呼叫別名時要注意,易報錯:找不到對應的列(大小寫對應的是不同的列)
4.現在運營想要篩選出所有北京大學的學生進行使用者調研,請你從使用者資訊表中取出滿足條件的資料,結果返回裝置id和學校
select device_id, university from user_profile where university = '北京大學';
可以優化一下,
使用索引覆蓋效率提升80%
select語句中使用的索引覆蓋所有需要查詢的欄位
覆蓋索引的原理:就是查詢欄位在 二級索引中全部找到,不需要回表查詢
覆蓋索引只是特定於具體select語錄而言的聯合索引。也就是說一個聯合索引對於某個select語句,通過索引可以直接獲取查詢結果,而不再需要回表查詢啦,就稱該聯合索引覆蓋了這條select語句。
本題中經過測試,device_id,university 為聯合索引,因此:
Select device_id,university FROM user_profile where university = "北京大學" and device_id = user_profile.device_id;
device_id = user_profile.device_id 這一步是100%成立的,使用的目的就是索引覆蓋,以此實現提升查詢效率
5.
用where過濾空值
方法1:select device_id,gender,age,university from user_profile where age is not NULL --執行效率高
方法2:select device_id,gender,age,university from user_profile where age !='' --執行效率低
6.
-
_ :下劃線 代表匹配任意一個字元;
-
% :百分號 代表匹配0個或多個字元;
-
[]: 中括號 代表匹配其中的任意一個字元;
-
[^]: ^尖冒號 代表 非,取反的意思;不匹配中的任意一個字元。
tips:面試常問的一個問題:你瞭解哪些資料庫優化技術?
SQL語句優化也屬於資料庫優化一部分,而我們的like模糊查詢會引起全表掃描,速度比較慢,應該儘量避免使用like關鍵字進行模糊查詢。
7.