MySQL基础之select基本查询
DQL語言基本查詢
- 一、基本的select語句
- 1.查詢常量
- 2.從表中查數據
- 3.使用列的別名查詢
- 4.去重
- 5.空值NULL參與運算
- 6.過濾數據
- 二、 運算符
- 1.算術運算符
- 2.比較運算符
- 3.邏輯運算符
- 4.位運算符
- 三、 排序和分頁
- 1.排序
- 2.分頁
一、基本的select語句
1.查詢常量
2.從表中查數據
SELECT 標識選擇哪些列
FROM 標識從哪個表中選擇
很明顯,它的意思就是說,我們要從哪一張表中查詢數據
比如說,我們要從員工表emp中查詢所有數據,
當然了,如果我們只是想要查詢部分數據,我們完全可以指定要查詢的字段名字
MySQL中的SQL語句是不區分大小寫的,因此SELECT和select的作用是相同的,但是,許多開發人員習慣將關鍵字大寫、數據列和表名小寫,讀者也應該養成一個良好的編程習慣,這樣寫出來的代碼更容易閱讀和維護。注意:一般情況下,除非需要使用表中所有的字段數據,最好不要使用通配符‘*’。使用通配符雖然可以節省輸入查詢語句的時間,但是獲取不需要的列數據通常會降低查詢和所使用的應用程序的效率。通配符的優勢是,當不知道所需要的列的名稱時,可以通過它獲取它們。
在開發的時候,我們最好不要使用*來進行查詢,你想想看,開發過程中,數據庫中的數據是不是有很多,然后如果使用通配符一下子把所有記錄查詢出來,電腦可能就直接死機了。
3.使用列的別名查詢
我們發現在進行數據查詢的時候,有的時候字段名很長,我們寫起來也不是很方便,我們就考慮能不能通過別名來查數據呢
方式一:列名和別名之間加上as關鍵字
方式二:列名和別名之間用空格隔開
注意:我們需要保證表中的字段、表名等沒有和保留字、數據庫系統或常用方法沖突。如果真的相同,請在SQL語句中使用一對``(著重號)引起來。
我們使用select語句來進行查詢,那么查詢的結果會影響到數據庫中表的記錄嗎?
接下來我們來看一下
我們剛剛不是用來別名了嗎,為什么表中沒有改變呢,大家可能會有這樣的疑惑,事實上,使用select語句查詢出來的是一個臨時的表。
你看看,我們用select查詢出來的結果,是不是和表長得很像,上面是第一行都是字段,然后下面都是數據。就相當于是客戶端新建了一張臨時的表用來存放我們剛剛用select查詢出來的數據,當它把查詢結果顯示出來給我們看以后,內存就釋放了,當然不會影響硬盤中的數據,。
4.去重
使用關鍵字distinct
我們先來看看distinct用在單給字段上面的情況
接下來我們來看看對多個字段進行去重的情況
5.空值NULL參與運算
所有運算符或列值遇到null值,運算的結果都為null
先回顧一下表中數據
發現和null運算結果為null
6.過濾數據
使用where可以過濾數據,篩選出我們想要選的數據
SELECT 字段1,字段2
FROM 表名
WHERE 過濾條件
補充一下:desc可以顯示表的結構
Field:表示字段名稱。
Type:表示字段類型,這里 barcode、goodsname 是文本型的,price 是整數類型的。
Null:表示該列是否可以存儲NULL值。
Key:表示該列是否已編制索引。PRI表示該列是表主鍵的一部分;UNI表示該列是UNIQUE索引的一部分;MUL表示在列中某個給定值允許出現多次。
Default:表示該列是否有默認值,如果有,那么值是多少。
Extra:表示可以獲取的與給定列有關的附加信息,例如AUTO_INCREMENT等。
二、 運算符
1.算術運算符
2.比較運算符
比較運算符用來對表達式左邊的操作數和右邊的操作數進行比較,比較的結果為真則返回1,比較的結果為假則返回0,其他情況則返回NULL。
比較運算符經常被用來作為SELECT查詢語句的條件來使用,返回符合條件的結果記錄。
1.等號運算符
2.安全等于運算符
3.不等于運算符
空運算符(IS NULL或者ISNULL)判斷一個值是否為NULL,如果為NULL則返回1,否則返回0。mysql> SELECT NULL IS NULL, ISNULL(NULL), ISNULL('a'), 1 IS NULL; +--------------+--------------+-------------+-----------+ | NULL IS NULL | ISNULL(NULL) | ISNULL('a') | 1 IS NULL | +--------------+--------------+-------------+-----------+ | 1 | 1 | 0 | 0 | +--------------+--------------+-------------+-----------+BETWEEN運算符使用的格式通常為SELECT D FROM TABLE WHERE C BETWEEN A AND B,此時,當C大于或等于A,并且C小于或等于B時,結果為1,否則結果為0。
IN運算符
IN運算符用于判斷給定的值是否是IN列表中的一個值,如果是則返回1,否則返回0。如果給定的值為NULL,或者IN列表中存在NULL,則結果為NULL。
LIKE運算符主要用來匹配字符串,通常用于模糊匹配,如果滿足條件則返回1,否則返回0。如果給定的值或者匹配條件為NULL,則返回結果為NULL。
LIKE運算符通常使用如下通配符: “%”:匹配0個或多個字符。 “_”:只能匹配一個字符。
3.邏輯運算符
邏輯非
邏輯與
邏輯或
OR可以和AND一起使用,但是在使用時要注意兩者的優先級,由于AND的優先級高于OR,因此先對AND兩邊的操作數進行操作,再與OR中的操作數結合。
邏輯異或運算符
4.位運算符
位運算符是在二進制數上進行計算的運算符。位運算符會先將操作數變成二進制數,然后進行位運算,最后將計算結果從二進制變回十進制數。
MySQL支持的位運算符如下:
1.按位與運算符
按位與(&)運算符將給定值對應的二進制數逐位進行邏輯與運算。當給定值對應的二進制位的數值都為1時,則該位返回1,否則返回0。
mysql> SELECT 1 & 10, 20 & 30;
+--------+---------+
| 1 & 10 | 20 & 30 |
+--------+---------+
| 0 | 20 |
+--------+---------+
1 row in set (0.00 sec)
1的二進制數為0001,10的二進制數為1010,所以1 & 10的結果為0000,對應的十進制數為0。20的二進制數為10100,30的二進制數為11110,所以20 & 30的結果為10100,對應的十進制數為20。
2. 按位或運算符
按位或(|)運算符將給定的值對應的二進制數逐位進行邏輯或運算。當給定值對應的二進制位的數值有一個或兩個為1時,則該位返回1,否則返回0。
mysql> SELECT 1 | 10, 20 | 30;
+--------+---------+
| 1 | 10 | 20 | 30 |
+--------+---------+
| 11 | 30 |
+--------+---------+
1 row in set (0.00 sec)
1的二進制數為0001,10的二進制數為1010,所以1 | 10的結果為1011,對應的十進制數為11。20的二進制數為10100,30的二進制數為11110,所以20 | 30的結果為11110,對應的十進制數為30。
3. 按位異或運算符
按位異或(^)運算符將給定的值對應的二進制數逐位進行邏輯異或運算。當給定值對應的二進制位的數值不同時,則該位返回1,否則返回0。
mysql> SELECT 1 ^ 10, 20 ^ 30;
+--------+---------+
| 1 ^ 10 | 20 ^ 30 |
+--------+---------+
| 11 | 10 |
+--------+---------+
1 row in set (0.00 sec)
1的二進制數為0001,10的二進制數為1010,所以1 ^ 10的結果為1011,對應的十進制數為11。20的二進制數為10100,30的二進制數為11110,所以20 ^ 30的結果為01010,對應的十進制數為10。
再舉例:
mysql> SELECT 12 & 5, 12 | 5,12 ^ 5 FROM DUAL;
+--------+--------+--------+
| 12 & 5 | 12 | 5 | 12 ^ 5 |
+--------+--------+--------+
| 4 | 13 | 9 |
+--------+--------+--------+
1 row in set (0.00 sec)
可能這樣還是很懵,可以看看這張圖理解一下,位運算會先把數字轉換成二進制,然后逐位進行運算
4. 按位取反運算符
按位取反(~)運算符將給定的值的二進制數逐位進行取反操作,即將1變為0,將0變為1。
mysql> SELECT 10 & ~1;
+---------+
| 10 & ~1 |
+---------+
| 10 |
+---------+
1 row in set (0.00 sec)
由于按位取反(~)運算符的優先級高于按位與(&)運算符的優先級,所以10 & ~1,首先,對數字1進行按位取反操作,結果除了最低位為0,其他位都為1,然后與10進行按位與操作,結果為10。
5. 按位右移運算符
按位右移(>>)運算符將給定的值的二進制數的所有位右移指定的位數。右移指定的位數后,右邊低位的數值被移出并丟棄,左邊高位空出的位置用0補齊。
mysql> SELECT 1 >> 2, 4 >> 2;
+--------+--------+
| 1 >> 2 | 4 >> 2 |
+--------+--------+
| 0 | 1 |
+--------+--------+
1 row in set (0.00 sec)
6. 按位左移運算符
按位左移(<<)運算符將給定的值的二進制數的所有位左移指定的位數。左移指定的位數后,左邊高位的數值被移出并丟棄,右邊低位空出的位置用0補齊。
按位左移和上面的右移是一樣道理,這里就不說了。
mysql> SELECT 1 << 2, 4 << 2;
+--------+--------+
| 1 << 2 | 4 << 2 |
+--------+--------+
| 4 | 16 |
+--------+--------+
1 row in set (0.00 sec)
三、 排序和分頁
1.排序
使用order by進行排序
ASC(ascend): 升序
DESC(descend):降序
-
如果沒有使用排序操作,默認情況下查詢返回的數據是按照我們添加的順序顯示。
-
如果在ORDER BY后沒有顯示的指明排序順序,則默認為升序排列。
-
可以使用列的別名進行排序。
-
列的別名只能ORDER BY中使用,不能在WHERE 當中使用來進行篩選。
-
ORDER BY的字段不一定是要查詢的字段。
-
強調格式:WHERE 需要聲明在FROM后,ORDER BY之前。
可以使用不在SELECT列表中的列排序。 在對多列進行排序的時候,首先排序的第一列必須有相同的列值,才會對第二列進行排序。如果第一列數據中所有值都是唯一的,將不再對第二列進行排序。
2.分頁
使用LIMIT進行分頁
什么是分頁呢,我們來看一下下面的圖片,其實分頁很常見的
我們在瀏覽器輸入要查找的數據,瀏覽器就會返回一些數據給我們,當我們點擊下一頁,或者是指定也是頁數的時候,它就會跳轉到相應頁面。
那么我們為什么要進行分頁呢,理由其實很簡單
假如現在,我們想要查找一些信息,然后瀏覽器把所有的信息都返回給我們,那這樣的話,服務器的壓力就會很大,因為數據很龐大,而且對于用戶來說,我們可能在前面幾條信息就已經得到了我們想要的答案,那我們就不會浪費時間繼續往下看。那么后面的那些數據是不是就浪費掉了呢?而且這樣也很影響效率,速度很慢,而且你想想把所有數據返回,網站相應速度就會很慢的,用戶等了好久也等不到網站的響應,那用戶可能就等不下去了,這樣長久以往,這個網站就會失去很多的用戶。
再來舉個例子:以我們在淘寶買東西為例,我們想買東西,我們點擊下一頁,才返回一些物品信息給我們,我們如果沒有點擊下一頁,就沒有必要返回物品信息給我們了。
格式:LIMIT [位置偏移量,] 行數
第一個“位置偏移量”參數指示MySQL從哪一行開始顯示,是一個可選參數,如果不指定“位置偏移量”,將會從表中的第一條記錄開始(第一條記錄的位置偏移量是0,第二條記錄的位置偏移量是1,以此類推);第二個參數“行數”指示返回的記錄條數。
--前10條記錄:
SELECT * FROM 表名 LIMIT 0,10;
或者
SELECT * FROM 表名 LIMIT 10;--第11至20條記錄:
SELECT * FROM 表名 LIMIT 10,10;--第21至30條記錄:
SELECT * FROM 表名 LIMIT 20,10;
MySQL 8.0中可以使用“LIMIT 3 OFFSET 4”,意思是獲取從第5條記錄開始后面的3條記錄,和“LIMIT 4,3;”返回的結果相同。
- 分頁顯式公式 :(當前頁數-1)*每頁條數,每頁條數
SELECT * FROM table LIMIT(PageNo - 1)*PageSize,PageSize;- 注意:LIMIT 子句必須放在整個SELECT語句的最后!
使用 LIMIT 的好處
約束返回結果的數量可以
減少數據表的網絡傳輸量,也可以提升查詢效率。如果我們知道返回結果只有 1 條,就可以使用LIMIT 1,告訴 SELECT 語句只需要返回一條記錄即可。這樣的好處就是 SELECT不需要掃描完整的表,只需要檢索到一條符合條件的記錄即可返回。
下一篇我會更新數據庫的高級查詢,比如多表查詢,子查詢等,數據庫的CRUD語句中,最重要的就是select語句了,希望對大家有幫助
下一篇MySQL查詢進階
總結
以上是生活随笔為你收集整理的MySQL基础之select基本查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Servlet完成单表的CRUD
- 下一篇: MySQL查询进阶之多表查询