SQL 強化練習 四

2022-05-06 20:27:11 字數 3322 閱讀 8422

繼續每日一練 sql 肯定會無敵強的後面. 恰好今天專案弄報表這塊, 用了國產的 bi 工具, 帆軟report, 除了頁面控制項做得有些 low 外, 我感覺其他各方面都特別適合做 中國式的報表. 明天上線, 今天才開始弄填報, 要設計表字段, 全部要自己來寫 sql, 恰好練習了把, 果然, sql 再資料這塊, 真的是無比重要的哦.

發現這個 bi 有點好, 就是可以做模板成網頁, 然後讓業務自己往裡導資料, 資料回寫資料庫, 感覺賊簡單好用哦

sql 搞來搞去, 還是這些, 篩選字段, 表拼接, 分組聚合... (ps: 今天寫 ddl 反覆改, 差點沒把領導給氣死.... )

查詢 學過 "尤拉" 老師所教的所有課的學生學號, 姓名

分析

分析: 學生表 inner join 成績表 inner join 課程表 inner join 教師表

select 

st.s_id as "學號",

st.s_name as "姓名"

from student as st

inner join score as s on st.s_id = s.s_id

inner join course as c on s.c_id = c.c_id

inner join teacher as t on c.t_id = t.t_id

where t.t_name = "尤拉"

-- 多名學生, 可按學號排序

order by st.s_id;

+--------+-----------+

| 學號 | 姓名 |

+--------+-----------+

| 0001 | 王二 |

| 0002 | 星落 |

| 0003 | 胡小適 |

+--------+-----------+

3 rows in set (0.00 sec)

關鍵點還是理解表結構邏輯和, 關聯關係的呀. 但是呢, 這裡有個很大的問題, 關於查詢效率. 這裡是先把所有的表都給拼接起來嘛, 通常業務中呢, 其實每個表都是非常大的, 這樣直接來 inner join 怕是要卡死. 更通常的做法是, 關聯一張的時候, 就臨時表安排一下, 然後慢慢拼, 先 where 過濾, 再來查詢以提高效率.

查詢 同時學過 0001 和 0002 號課程的學生學號, 姓名

分析

對 score 進行拆分按課號, 然後以學號為 inner join

select * from score where c_id = "0001";

+------+------+-------+

| s_id | c_id | score |

+------+------+-------+

| 0001 | 0001 | 80 |

| 0003 | 0001 | 80 |

+------+------+-------+

2 rows in set (0.00 sec)

mysql> select * from score where c_id = "0002";

+------+------+-------+

| s_id | c_id | score |

+------+------+-------+

| 0001 | 0002 | 90 |

| 0002 | 0002 | 60 |

| 0003 | 0002 | 80 |

+------+------+-------+

3 rows in set (0.00 sec)

可以看到, 二者相交的學號是 1, 3 , 其實就 inner join 就行啦.

-- 都給查出來看看

select

a.*,

b.*from

(select * from score where c_id = "0001") as a

inner join

(select * from score where c_id = "0002") as b

on a.s_id = b.s_id;

+------+------+-------+------+------+-------+

| s_id | c_id | score | s_id | c_id | score |

+------+------+-------+------+------+-------+

| 0001 | 0001 | 80 | 0001 | 0002 | 90 |

| 0003 | 0001 | 80 | 0003 | 0002 | 80 |

+------+------+-------+------+------+-------+

2 rows in set (0.00 sec)

多表關聯的好處就是, 取了表的別名後, 你想要哪個就可以拿到哪個字段, 大表就是好用的呀.

只是需要學號和姓名, 那其實只查學號, in 學生表即可

select

s_id as "學號",

s_name as "姓名"

from student

where s_id in (

select

a.s_id

from

(select s_id from score where c_id = "0001") as a

inner join

(select s_id from score where c_id = "0002") as b

on a.s_id = b.s_id

);

+--------+-----------+

| 學號 | 姓名 |

+--------+-----------+

| 0001 | 王二 |

| 0003 | 胡小適 |

+--------+-----------+

2 rows in set (0.00 sec)

mysql 查詢強化訓練 SQL強化練習工具

sql語句語法說明 select from 表名 顯示表中的所有記錄 select 字段 as 別名 from 表名 where 條件 用別名顯示查詢結果 select top 行數 字段 from 表名 限制返回結果集行數 select 字段 from 表名 where 字段 like 關鍵字 模...

Sql 強化 oracle環境

1.to char 出現空格 原理解釋參考 解決方法 新增mi引數或使用trim去掉空格 to char num,0000mi trim to char 11111 999999 2.to char 日期轉換 to char hire date,d 一周中的第幾天 to char hire date...

強化學習筆記(四)

sarsa 演算法初始化 q s,a 為任意值 重複以下步驟 每個訓練回合 初始化狀態 s 從狀態 s 中根據 於 q 的策略選擇行為 a 例如 greedy 0.9 90 情況取最優行為,10 情況隨機採取行為 重複以下步驟 單個回合中的每一步 執行行為 a,觀察獎勵 r,下一狀態 s 從狀態 s...