presql
1. sql 語句 中的表示什麼意思
sql語句中的?相當於一個變數,你可以再其後通過具體賦值,例如setString(1,「nihao」),設置對應?位置處的變數的值。
這樣做的目的是:當你有很多相同的sql語句執行時,可以先發出sql語句的定義,然後再將具體的值傳過去,這樣只發了一次sql語句,提高效率;否則,你發多次相同的sql語句,效率就低了。另外,在防sql注入方面,可以通過這樣的方法來避免簡單的侵害。
2. 資料庫基礎篇(二)—— SQL之數據查詢
接下來,我們將使用員工相關的四張樣本數據表,來學習SQL,建議你在學習過程中多動手練習,理解才會更深刻。表和欄位含義,如下圖:
如何利用SQL語句來操作以上數據呢?我們必須將樣本數據導入MySQL客戶端(如:Navicat)中。可以在客戶端操作數據,或者在終端窗口。工作中經常在客戶端操作,所以本文所有SQL語句將在Navicat中學習。
首先將sql腳本保存到桌面(獲取方式:關注"Python之每日一課"公眾號,後來回復"sql基礎數據",即可。),導入SQL腳本的具體操作流程如下:
現在數據准備完成。這里是導入sql腳本;導出同理,選擇」轉儲SQL「文件。當然了,Navicat也支持將當前表或查詢結果導出Excel、CSV等文件類型。
下面可以寫SQL語句了(每個sql腳本可以保存,下次直接使用),如下:
類似於Python中 :print(要列印的東西)
①通過select查詢完的結果 ,是一個虛擬的表格,不是真實存在
② 要查詢的東西 可以是常量值、表達式、欄位、也可以是函數
補充:可以給欄位起別名,好處是提高可讀性,更方便理解;多表連接時,區分欄位。用AS 或 空格來實現。如下:
2、 條件查詢
條件查詢:根據條件過濾原始表的數據,查詢到想要的數據
1)語法
2)分類
①條件表達式
②邏輯表達式
③模糊查詢
⭐ 注意:where 一定要放到 from 後面。NULL 不是假,也不是真,而是"空";任何運算符,判斷符碰到NULL,都得NULL;NULL的判斷只能用is null,is not null;NULL 影響查詢速度,一般避免使值為NULL。exists查詢可以與in型子查詢互換,它們之間區別以後語句優化時會詳細講解。
3、 排序查詢
1)語法
2)舉栗
⭐ 注意:order by 一定要放到 語句最後(limit前面)
4、分組查詢
1)語法
2)特點
①可以按單個欄位分組
②和分組函數一同查詢的欄位最好是分組後的欄位
③分組篩選(where 和 having區別)
④可以按多個欄位分組,欄位之間用逗號隔開
⑤可以支持排序
⑥having後可以支持別名
3)舉栗
⭐ 注意:關鍵字順序是where —>group by—>having—>order by—>limit( having不能單獨使用,需結合group by ,表示對分組後的結果進行篩選;而 group by 必須結合分組聚合函數一起使用 ,比如:count()、max()等)
5、 常見函數
1)單行函數
2)分組函數
3)分組函數特點
①以上五個分組函數都忽略null值,除了count(*)
②sum和avg一般處理數值型,max、min、count可以處理任何數據類型
③都可以搭配distinct使用,用於統計去重後的結果
④count的參數可以支持:欄位、*、常量值,一般放1
6、連接查詢(多表查詢)
單個表不能滿足需求時,需要結合多張表,去除有關聯的數據。這時就需要用連接查詢,連接查詢有三種,通常join使用的最多。
①等值連接的結果 = 多個表的交集
②多個表不分主次,沒有順序要求
③一般為表起別名,提高閱讀性和性能
①語法
②好處
語句上,連接條件和篩選條件實現了分離,簡潔。
⭐ 注意:左右連接可互換 A left join B 等價於B right join A;內連接是左</pre>
右連接的交集;mysql沒有外連接。
自連接相當於等值連接,但是等值連接涉及多個表,而自連接僅僅是它自己。如下:在員工信息表裡,查詢員工名和直接上級的名。
7、子查詢
一條查詢語句中又嵌套了另一條完整的select語句,其中被嵌套的select語句,稱為子查詢或內查詢。在外面的查詢語句,稱為主查詢或外查詢。
①子查詢都放在小括弧內
②子查詢可以放在from後面、select後面、where後面、having後面,但一般放在條件的右側
③子查詢優先於主查詢執行,主查詢使用了子查詢的執行結果
④子查詢根據查詢結果的行數不同分為以下兩類:
2)舉栗
8、分頁查詢 (可選)
實際web開發中,當顯示的數據,一頁顯示不完時,需要分頁提交sql請求。
2)特點
①起始條目索引默認從0開始
②limit子句放在查詢語句的最後
③公式:select * from 表 limit (page-1)*sizePerPage,
3)舉栗
9、union聯合查詢
union用於把涉及多個表的SELECT語句的結果組合到一個結果集合中。適用於查詢條件較多,多個表之間沒有連接關系的場景。</pre>
2)特點
①多條查詢語句的查詢的列數必須是一致的
②多條查詢語句的查詢的列的類型幾乎相同
③union 代表去重,union all 代表不去重
3)舉栗
UNION 和 UNION ALL 運行結果的區別如下:
⭐ 注意:在多個 SELECT 語句中,第一個 SELECT 語句中被使用的欄位名稱將被用於結果的欄位名稱。當使用 UNION 時,MySQL 會把結果集中重復的記錄刪掉,而使用 UNION ALL ,MySQL 會把所有的記錄返回,且效率高於 UNION
好,今天學習到這里。工作中用的最多就是查詢。如果能消化本文涉及到的所有內容,大概能解決80%的工作需求。本文更多的是原理介紹,例子不多,只有先知道是什麼,才能知道怎麼學。那麼,接下來最重要的是要多練習實踐。因為實際的業務場景要復雜很多,給大家推薦兩個刷題的網站,力扣和牛客網,裡面有大量的sql面試題。能進一步提高我們sql的水平。這篇文章主要是SQL的常用查詢。明天繼續學習SQL的DML增刪改。一起加油!
3. SQL報錯,無效數字
問題原因:表中的欄位dept類型是varchar,但是傳入的數據類型是number
解決方案兩種:
①把dept欄位的數據轉換成告敬number類型
builder.append("\n and to_number(s.dept) in(").append(department).append(")");
②使用presql,調用工具類的襪譽慎 querySqlConditionByMap() 方法,不過需要注意:
比如,有開始日期stdate 和 結束日期eddate還有 部門casein_department 時,得先把stdate和eddate從map取出來,然後再remove掉,只對casein_department進行虛凳單獨處理。舉例如下