python數據庫-MySQL單表查詢基本操作(50)


 

一、條件查詢

1、查詢的基本語法

select * from 表名;
  • from關鍵字后面寫表名,表示數據來源於是這張表
  • select后面寫表中的列名,如果是*表示在結果中顯示表中所有列
  • 在select后面的列名部分,可以使用as為列起別名,這個別名出現在結果集中
  • 如果要查詢多個列,之間使用逗號分隔

2、消除重復行

  在select后面列前使用distinct可以消除重復的行

elect distinct h_gender from hero;

 

3、使用where子句對表中的數據篩選,結果為true的行會出現在結果集中  

select * from 表名 where 條件;

4、比較運算符

  • 等於=
  • 大於>
  • 大於等於>=
  • 小於<
  • 小於等於<=
  • 不等於!=或<>
4.1、查詢表中全部數據(這個表是我提前創建好的)
mysql> select *from hero; +------+-----------+--------------+---------+----------+------------+----------+--------+
| h_id | h_name    | h_skill      | h_blood | h_attack | h_isdelete | h_gender | h_type |
+------+-----------+--------------+---------+----------+------------+----------+--------+
|    1 | 李白      | 青蓮劍歌     |    1000 |     1000 |            |        1 | 刺客   |
|    2 | 魯班      | 空中支援     |     950 |     1000 |            |        1 | 射手   |
|    3 | 王昭君    | 凜冬已至     |     950 |      950 |            |        0 | 法師   |
|    4 | 虞姬      | 樹神護佑     |     900 |      950 |            |        0 | 射手   |
|    5 | 甄姬      | 洛神降臨     |     900 |      900 |            |        0 | 法師   |
|    6 | 庄周      | 天人合一     |     850 |      900 |            |        1 | 輔助   |
|    7 | 韓信      | 國士無雙     |     850 |      850 |            |        1 | 刺客   |
|    8 | 孫尚香    | 窮極弩炮     |     800 |      850 |            |        0 | 射手   |
|    9 | 孫策      | 長帆破浪     |     800 |      800 |            |        1 | 戰士   |
|   10 | 公孫離    | 孤鶩斷霞     |     750 |      800 |            |        0 | 射手   |
+------+-----------+--------------+---------+----------+------------+----------+--------+
10 rows in set (0.00 sec)
4.2、查詢h_attack大於900的
mysql> select *from hero where h_attack>900; +------+-----------+--------------+---------+----------+------------+----------+--------+
| h_id | h_name    | h_skill      | h_blood | h_attack | h_isdelete | h_gender | h_type |
+------+-----------+--------------+---------+----------+------------+----------+--------+
|    1 | 李白      | 青蓮劍歌     |    1000 |     1000 |            |        1 | 刺客   |
|    2 | 魯班      | 空中支援     |     950 |     1000 |            |        1 | 射手   |
|    3 | 王昭君    | 凜冬已至     |     950 |      950 |            |        0 | 法師   |
|    4 | 虞姬      | 樹神護佑     |     900 |      950 |            |        0 | 射手   |
+------+-----------+--------------+---------+----------+------------+----------+--------+

5、邏輯運算符

  • and
  • or
  • not

5.1、查詢h_attack大於950並且h_blood大於900的hero

mysql> select *from hero where h_attack>950 and h_blood>900; +------+--------+--------------+---------+----------+------------+----------+--------+
| h_id | h_name | h_skill      | h_blood | h_attack | h_isdelete | h_gender | h_type |
+------+--------+--------------+---------+----------+------------+----------+--------+
|    1 | 李白   | 青蓮劍歌     |    1000 |     1000 |            |        1 | 刺客   |
|    2 | 魯班   | 空中支援     |     950 |     1000 |            |        1 | 射手   |
+------+--------+--------------+---------+----------+------------+----------+--------+

5.2、查詢h_attack大於950或者h_blood大於900的hero

mysql> select *from hero where h_attack>950 or h_blood>900; +------+-----------+--------------+---------+----------+------------+----------+--------+
| h_id | h_name    | h_skill      | h_blood | h_attack | h_isdelete | h_gender | h_type |
+------+-----------+--------------+---------+----------+------------+----------+--------+
|    1 | 李白      | 青蓮劍歌       |    1000 |     1000 |            |        1 | 刺客   |
|    2 | 魯班      | 空中支援       |     950 |     1000 |            |        1 | 射手   |
|    3 | 王昭君    | 凜冬已至       |     950 |      950 |            |        0 | 法師   |
+------+-----------+--------------+---------+----------+------------+----------+--------+

二、模糊查詢

  • like
  • %表示任意多個任意字符
  • _表示一個任意字符

1、查詢名字里姓‘孫’的

mysql> select *from hero where h_name like '孫%'; +------+-----------+--------------+---------+----------+------------+----------+--------+
| h_id | h_name    | h_skill      | h_blood | h_attack | h_isdelete | h_gender | h_type |
+------+-----------+--------------+---------+----------+------------+----------+--------+
|    8 | 孫尚香    | 窮極弩炮       |     800 |      850 |            |        0 | 射手   |
|    9 | 孫策      | 長帆破浪       |     800 |      800 |            |        1 | 戰士   |
+------+-----------+--------------+---------+----------+------------+----------+--------+

2、查詢名字里面包含‘孫’的

mysql> select *from hero where h_name like '%孫%'
+------+-----------+--------------+---------+----------+------------+----------+--------+
| h_id | h_name    | h_skill      | h_blood | h_attack | h_isdelete | h_gender | h_type |
+------+-----------+--------------+---------+----------+------------+----------+--------+
|    8 | 孫尚香    | 窮極弩炮     |     800 |      850 |            |        0 | 射手   |
|    9 | 孫策      | 長帆破浪     |     800 |      800 |            |        1 | 戰士   |
|   10 | 公孫離    | 孤鶩斷霞     |     750 |      800 |            |        0 | 射手   |
+------+-----------+--------------+---------+----------+------------+----------+--------+

3、查詢性孫的並且名只有一個字

mysql> select *from hero where h_name like '孫_'; +------+--------+--------------+---------+----------+------------+----------+--------+
| h_id | h_name | h_skill      | h_blood | h_attack | h_isdelete | h_gender | h_type |
+------+--------+--------------+---------+----------+------------+----------+--------+
|    9 | 孫策   | 長帆破浪     |     800 |      800 |            |        1 | 戰士   |
+------+--------+--------------+---------+----------+------------+----------+--------+

 

三、范圍查詢

  • in表示在一個非連續的范圍內

例如:查找h_id為1、3、5的英雄

mysql> select *from hero where h_id in(1,3,5); +------+-----------+--------------+---------+----------+------------+----------+--------+
| h_id | h_name    | h_skill      | h_blood | h_attack | h_isdelete | h_gender | h_type |
+------+-----------+--------------+---------+----------+------------+----------+--------+
|    1 | 李白      | 青蓮劍歌       |    1000 |     1000 |            |        1 | 刺客   |
|    3 | 王昭君    | 凜冬已至       |     950 |      950 |            |        0 | 法師   |
|    5 | 甄姬      | 洛神降臨       |     900 |      900 |            |        0 | 法師   |
+------+-----------+--------------+---------+----------+------------+----------+--------+
  • between ... and ...表示在一個連續的范圍內

例如:查詢血量在900-950之間的應用

mysql> select *from hero where h_blood between 900 and 950; +------+-----------+--------------+---------+----------+------------+----------+--------+
| h_id | h_name    | h_skill      | h_blood | h_attack | h_isdelete | h_gender | h_type |
+------+-----------+--------------+---------+----------+------------+----------+--------+
|    2 | 魯班      | 空中支援       |     950 |     1000 |            |        1 | 射手   |
|    3 | 王昭君    | 凜冬已至       |     950 |      950 |            |        0 | 法師   |
|    4 | 虞姬      | 樹神護佑       |     900 |      950 |            |        0 | 射手   |
|    5 | 甄姬      | 洛神降臨       |     900 |      900 |            |        0 | 法師   |
+------+-----------+--------------+---------+----------+------------+----------+--------+

 

四、空查詢

  • 注意:null與''是不同的
  • 判空 is null

查詢isdelect沒有填寫的hero

select *from hero where h_isdelete is null;

 

五、聚合查詢

為了快速得到統計數據,提供了5個聚合函數

1、count(*)表示計算總行數,括號中寫星與列名,結果是相同的

查詢hero的總數

mysql> select count(*) from hero; +----------+
| count(*) |
+----------+
|       10 |
+----------+

2、max(列)表示求此列的最大值

查詢攻擊力最大的值

mysql> select max(h_attack) from hero; +---------------+
| max(h_attack) |
+---------------+
|          1000 |
+---------------+

3、min(列)表示求此列的最小值

查詢攻擊力最小的值

mysql> select min(h_attack) from hero; +---------------+
| min(h_attack) |
+---------------+
|           800 |
+---------------+

4、sum(列)表示求此列的和

查詢所有hero的攻擊力之和

mysql> select sum(h_attack) from hero; +---------------+
| sum(h_attack) |
+---------------+
|          9000 |
+---------------+

5、avg(列)表示求此列的平均值

查詢所有hero的攻擊力平均值

mysql> select avg(h_attack) from hero;
+---------------+
| avg(h_attack) |
+---------------+
|      900.0000 |
+---------------+ 

 

六、分組查找

  • 按照字段分組,表示此字段相同的數據會被放到一個組中
  • 分組后,只能查詢出相同的數據列,對於有差異的數據列無法出現在結果集中
  • 可以對分組后的數據進行統計,做聚合運算
select 列1,列2,聚合... from 表名 group by 列1,列2,列3...

 1、查詢男hero和女hero的總數

mysql> select h_gender as 性別,count(*) from hero group by h_gender; +--------+----------+
| 性別   | count(*) |
+--------+----------+
|      0 |        5 |
|      1 |        5 |
+--------+----------+

2、查詢按照英雄類型、性別分組統計

mysql> select h_type as 英雄類型,h_gender as 性別,count(*) as 個數 from hero group by h_type,h_gender;
+--------------+--------+--------+
| 英雄類型      | 性別    | 個數   |
+--------------+--------+--------+
| 刺客         |      1 |      2 |
| 射手         |      0 |      3 |
| 射手         |      1 |      1 |
| 戰士         |      1 |      1 |
| 法師         |      0 |      2 |
| 輔助         |      1 |      1 |
+--------------+--------+--------+

3、分組后的數據篩選

  having后面的條件運算符與where的相同

 例如:查詢男英雄的個數

方法一:

mysql> select count(*) from hero where h_gender = 1;
+----------+
| count(*) |
+----------+
|        5 |
+----------+

方法二:

mysql> select h_gender as 性別,count(*) from hero group by h_gender having h_gender=1;
+--------+----------+
| 性別    | count(*) |
+--------+----------+
|      1 |        5 |
+--------+----------+

對比where與having

  • where是對from后面指定的表進行數據篩選,屬於對原始數據的篩選
  • having是對group by的結果進行

 

七、排序

  為了方便查看數據,可以對數據進行排序

select * from 表名
order by 列1 asc|desc,列2 asc|desc,...
  • 將行數據按照列1進行排序,如果某些行列1的值相同時,則按照列2排序,以此類推
  • 默認按照列值從小到大排列
  • asc從小到大排列,即升序
  • desc從大到小排序,即降序
mysql> select *from hero where h_gender=1 order by h_attack asc;
+------+--------+--------------+---------+----------+------------+----------+--------+
| h_id | h_name | h_skill      | h_blood | h_attack | h_isdelete | h_gender | h_type |
+------+--------+--------------+---------+----------+------------+----------+--------+
|    9 | 孫策   | 長帆破浪       |     800 |      800 |            |        1 | 戰士   |
|    7 | 韓信   | 國士無雙       |     850 |      850 |            |        1 | 刺客   |
|    6 | 庄周   | 天人合一       |     850 |      900 |            |        1 | 輔助   |
|    1 | 李白   | 青蓮劍歌       |    1000 |     1000 |            |        1 | 刺客   |
|    2 | 魯班   | 空中支援       |     950 |     1000 |            |        1 | 射手   |
+------+--------+--------------+---------+----------+------------+----------+--------+

 

八、分頁查找

  當數據量過大時,在一頁中查看數據是一件非常麻煩的事情,而且現在很多瀏覽器也都是分頁顯示數據,例如:

語法:

select * from 表名 limit start,count
  • 從start開始,獲取count條數據
  • start索引從0開始
mysql> select *from hero limit 0,5; +------+-----------+--------------+---------+----------+------------+----------+--------+
| h_id | h_name    | h_skill      | h_blood | h_attack | h_isdelete | h_gender | h_type |
+------+-----------+--------------+---------+----------+------------+----------+--------+
|    1 | 李白      | 青蓮劍歌     |    1000 |     1000 |            |        1 | 刺客   |
|    2 | 魯班      | 空中支援     |     950 |     1000 |            |        1 | 射手   |
|    3 | 王昭君    | 凜冬已至     |     950 |      950 |            |        0 | 法師   |
|    4 | 虞姬      | 樹神護佑     |     900 |      950 |            |        0 | 射手   |
|    5 | 甄姬      | 洛神降臨     |     900 |      900 |            |        0 | 法師   |
+------+-----------+--------------+---------+----------+------------+----------+--------+
5 rows in set (0.00 sec)

mysql> select *from hero limit 5,5; +------+-----------+--------------+---------+----------+------------+----------+--------+
| h_id | h_name    | h_skill      | h_blood | h_attack | h_isdelete | h_gender | h_type |
+------+-----------+--------------+---------+----------+------------+----------+--------+
|    6 | 庄周      | 天人合一     |     850 |      900 |            |        1 | 輔助   |
|    7 | 韓信      | 國士無雙     |     850 |      850 |            |        1 | 刺客   |
|    8 | 孫尚香    | 窮極弩炮     |     800 |      850 |            |        0 | 射手   |
|    9 | 孫策      | 長帆破浪     |     800 |      800 |            |        1 | 戰士   |
|   10 | 公孫離    | 孤鶩斷霞     |     750 |      800 |            |        0 | 射手   |
+------+-----------+--------------+---------+----------+------------+----------+--------+
5 rows in set (0.00 sec)

例子二:

  • 已知:每頁顯示m條數據,當前顯示第n頁,求第n頁的數據
select * from hero limit (n-1)*m,m

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM