一、條件查詢 1、查詢的基本語法 from關鍵字後面寫表名,表示數據來源於是這張表 select後面寫表中的列名,如果是*表示在結果中顯示表中所有列 在select後面的列名部分,可以使用as為列起別名,這個別名出現在結果集中 如果要查詢多個列,之間使用逗號分隔 2、消除重覆行 在select後面列 ...
一、條件查詢
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