1. 程式人生 > 實用技巧 >SQL雜俎_陪老婆一起學SQL系列_Chapter 02_查詢基礎1

SQL雜俎_陪老婆一起學SQL系列_Chapter 02_查詢基礎1

一、建立一張練習表

1、建立student表

作為一個以實用為目的的學習教程,這裡學習《MySQL必知必會》的內容架構,準備將程式碼建立表格,追加資料,修改表格這幾部分的內容放到整個學習過程的後面。

前面的學習以查詢資料為核心。

所以,設計了一張練習表,包含了後面可能會用到了大部分知識點所涉及的資料狀況。

CREATE TABLE [student]
(
    [id] varchar(10),
    [class_no] char(4),
    [name] varchar(20),
    [name_en] varchar(20),
    [birthday] datetime,
    
[sex] varchar(10), [score] int ); INSERT INTO [student] VALUES ('1001','一班','劉蓋文','Gavin', '2012-10-12', 'M','86'); INSERT INTO [student] VALUES ('2002','二班','柯步麗','Kimberley', '2012-10-12', 'M','79'); INSERT INTO [student] VALUES ('1003','一班','費裡西','Felicia', '2013-11-12', 'F','90'); INSERT INTO [student] VALUES
('3004','三班','撒瓦刀','Salvador', '2013-10-12', 'F','43'); INSERT INTO [student] VALUES ('2005','二班','劉思彤','Stone', '2012-09-12', 'M','55'); INSERT INTO [student] VALUES ('4006','四班','蓋冷娜','Galena', '2014-02-10', 'M','16'); INSERT INTO [student] VALUES ('3007','三班','蓋瑞森','Garrison', '2012-08-15', 'F','32'); INSERT INTO
[student] VALUES ('2008','二班','爪克','Drake', '2013-05-06', 'M','56'); INSERT INTO [student] VALUES ('1009',NULL,'依刷克','Erake', '2013-05-06', 'M','66'); INSERT INTO [student] VALUES ('4006','四班','美芬','Meifen', '2013-02-10', 'M',NULL);

(可以先按步驟操作,表格建立的內容後面會單獨介紹)

1)首先開啟Navicat軟體,點選左側列表中的SQLite,上方的工具欄中 點選“新建查詢”

2)軟體中見區域出現了一個編輯器介面

這個位置就是以後編寫程式碼的主戰場咯~~~

你在這個介面中所編寫的語句被資料庫執行,然後得到相應的結果。

3)我們將練習表的程式碼完整的複製、貼上到這個編輯器的介面裡Ctrl+C、V

然後點選工具欄裡的這個綠色箭頭,執行程式碼。

(“執行”旁邊的倒三角里面可以實現 僅執行選中部分的當前語句程式碼)

4)這時候會發現,介面下方出現了一個 “資訊”的視窗,

這裡是針對執行的程式碼的狀態輸出的一個資訊,有問題的話會出現明顯的報錯資訊哦~

5)這時候再去雙擊開啟左側介面裡的表 發現在“表”這個模組下面多出來了一個“student”

雙擊試試看~~~~~~

是不是非常神奇,剛剛輸入的程式碼執行完了之後竟然出現了一張表

大致說明一下每一列的含義,也就是表頭的列名

id:學號

class_no:班級

name:姓名

name_en:英文名

birthday:出生日期

sex:性別

score:分數

好了,這樣你就得到了一張新鮮出爐的練習表student

接下來的SQL語句練習我們都將基於這一張表進行。

2.儲存一段程式碼

給這個程式碼檔案起個名字,儲存起來吧~~~(SQL指令碼檔案的字尾是“.sql”)

Tips:常用、重要的程式碼都可以儲存起來,以後從檔案中開啟就可以直接執行,不用重複去寫程式碼哦~

二、SELECT 查詢語句基礎

和網頁瀏覽器一樣,這裡的選項卡可以單擊切換,“X”關閉。

關掉這些選項卡,新建一個查詢

1、列的查詢

在資料庫裡,學生表的結構是這個樣子的。

通過Select語句,可以查詢出需要的指定列:

語法:

SELECT <列名1>,<列名2>,...

FROM <表名>;

Tips:

# SELECT 後面列舉了想要查詢出的列的名稱,而FROM則指定了選取出資料的表的名稱

# SELECT、FROM 這些SQL語句中特殊的部分,我們稱之為關鍵字,作為SQL語句中的特殊存在,

規範寫法中使用全大寫字母,當然小寫執行也不會報錯。

另外,我們要避免列名和表名與這些關鍵字相同

# 如果查詢多列,每個列名之間要用逗號 “,” 隔開;語句的最後結尾 要用分號“;”表示結束(符號均要使用英文狀態下的符號格式輸入!!!


示例1:

SELECT name
FROM student;

執行結果:


示例2:

SELECT name,name_en,sex
FROM student;

執行結果:


示例3:

SELECT sex,name_en,name
FROM student;

執行結果:

Tips:對比示例2、3 查詢多列時,列名需要使用逗號進行分隔,查詢結果中列的順序和SELECT語句中列的順序一致!


示例4:

SELECT id,class_no,name,name_en,birthday,sex,score
FROM student;

執行結果:


示例5:

SELECT *
FROM student

執行結果:

Tips:對比示例4、5,發現結果是完全一樣的

當想查詢所有列的時候,可以使用代表所有列的星號(*)

但是!

當使用 SELECT*這種方式的時候,沒辦法設定查詢出來的資料的列的順序 。

按表格原有的列順序輸出。

而且!

當資料量非常的的時候直接使用(*)查詢會消耗比較大的執行資源,建議還是隻SELECT必要的列出來。

重點!有一個概念要說明,SELECT語句的每一次查詢只是改變最終輸出的結果

並沒有讓原資料來源student表中的資料發生變化。

2、列の 別名(Alias)

黑怕界人人都有AKA

一個江湖稱謂可能比本人更知名。

SQL語句中使用關鍵字 AS為查詢出來的列設定一個新的名稱、代號。稱之為“別名”

我們在建立基礎資料來源表格的時候,往往喜歡將列名用單詞、字母、拼音縮寫去表示。。。

這樣方便SQL語句的書寫,不用中英文切換,但是查詢出結果的時候可能看起來就不是那麼明顯

我們來看一下使用關鍵字AS的效果:


示例6:

SELECT
    name   AS "姓名",
    name_en AS "英文名",
    sex AS 性別
FROM student;

執行結果:

此時輸出的結果中顯示的列名已經變成列我們設定的中文列名。

Tips:

1)別名可以使用漢字,但規範性的寫法需要用英文字元下的雙引號(“)括起來,

實際使用中,其實不用雙引號也是可以執行的,可以仔細看一下示例6

但是規範起見,建議使用

2)再次強調

重點!有一個概念要說明,SELECT語句的每一次查詢只是改變最終輸出的結果

並沒有讓原資料來源student表中的資料發生變化。

別名只是讓輸出的結果更符合我們使用檢視的需求,並沒有讓student表中的實際列名發生變化。

3、常數、常量的查詢顯示_臨時列

設想一個場景需求:

如果我們在查詢想臨時多增加幾列資料怎麼辦?

查詢的時候增加一列資訊標明 ”查詢人“

查詢的時候增加一列資訊標明 ”查詢時間“

查詢的時候增加一列資訊標明 ”滿分“是百分制100分


示例7:

SELECT
    name   AS "姓名",
    name_en AS "英文名",
    score AS "分數",
    '古睿可' AS "查詢人",
    '2014-12-29 20:13:14' AS "查詢時間",
    100 AS "滿分"
FROM student;

執行結果:


仔細看圖中的執行結果,每一行資料都新增了三列我們需要的常數資訊。

Tips:

#第一列 '古睿可' 是字串常數

第二列'2014-12-29 20:13:14' 是 日期常數

第三列 100 是 數值常數

#SQL語句中 字串常數和日期常數必須使用 單引號(')括起來

數值常數不需要。注意100 和 '100' 是有區別的,前者是數值可以參與計算,後者是字串不能直接計算。

4、查詢結果去重 _ 刪除重複資料行

1)單列去重

當資料量很大的時候,我們想很直接的查詢出來這個student表中,涉及哪幾個班級的資料?

能不能有方法達到圖中的效果?

又引入了一個新的 關鍵字 DISTINCT(讀音:迪斯'廷-科特)

使用DISTINCT 刪除班級列的重複資料


示例8:

SELECT
    DISTINCT class_no
FROM student;

執行結果:


2)去重中的奇怪亂入

仔細看示例8的執行結果,和我們預想的結果之間有什麼區別?

實際執行結果中多出了一個灰色的 (NULL)

為什麼多出來一行資料呢?

Tips:NULL值的概念

NULL無值、空值。它與欄位包含0、僅僅包含空格不同,NULL表示真正意義上的真空~

看一下student表,會發現,班級號和分數都有null值,可以理解為當時漏填或者當時確實不知道分數,先空著在那裡,

這與得分是0分的概念是不一樣的哦!你細品一下

回到示例8的 distinct語句,不難理解,在對班級這一列資料做刪除重複項操作時,

除了一班、二班、三班、四班、還有一個不容忽視的 空值NULL。

如果將其直接刪重不顯示出來顯然是不合適的。

所以

在使用DISTINCT時,NULL也被視為一類資料。類似地,如果存在多條NULL資料,DISTINCT去重後也只會顯示出一條NULL。(類比多個一班、二班,去重後的查詢結果只會顯示出一條資料)

3)多列去重

DISTINCT可以同時對多列使用,相當於將多個列的資料合併,然後查詢出不重複的情況。

示例9:

SELECT
    DISTINCT class_no,sex
FROM student;

執行結果:

示例9對班級列、以及性別列去重,可以看到,只有一班男女生都有,所以出現了兩條一班的資料。

Tips:多列去重的時候,DISTINCT只能寫在第一個列名前,否則會報錯。

5、敲程式碼的好習慣:註釋

在敲寫程式碼的時候,經常需要對語句標註一些說明或者備註

在SQL中稱之為註釋

註釋在SQL不會被執行,中英文都可以隨意使用,有兩種註釋的寫法:

a.單行註釋:以"--"(英文字元狀態下的兩個短橫)開頭

b.多行註釋:夾在 “/*” 和 “*/” 之間的任意多行內容


示例10:

SELECT
--這是第一條單行測試註釋
    DISTINCT class_no,sex   -- 這是第二行單行測試註釋
FROM student;

示例11:

/* 這是示例11的第一個
   多行
     測試
     註釋!!!*/
SELECT
    DISTINCT class_no,sex
        /*這是第二個多行
        
        測試註釋
        */
FROM student;

執行結果:(示例10 和示例11)

語句執行的效果與沒有註釋的時候完全一致,註釋能夠在閱讀程式碼時幫助我們更好地理解一些語句。

是一個敲程式碼時的好習慣~~~