經常使用sql語句sql
SELECT 列名(或者*,表示全部列) FROM 表名 WHERE 篩選條件;ide
FROM 表名:顧名思義,就是從表名指定的這張表格中;
WHERE 篩選條件:意思是「當知足篩選條件」的時候;
SELECT 列名:意思是選擇出這些記錄,而且展現指定的列名;函數
從tb_stu_math_score表中挑選出得分大於95分的學生姓名;
SELECT name FROM tb_stu_math_score WHERE score >= 95;code
從tb_stu_math_score表中挑選出得分小於60分的學生姓名,
SELECT name, number FROM tb_stu_math_score WHERE score < 60;排序
從tb_stu_math_score表中挑選出得分爲100分學生的全部信息(注意SELECT後面的符號,表示全部字段),
SELECT FROM tb_stu_math_score WHERE score = 100;ci
高級用法:
若有表tb_rider、tb_order兩張表字符串
IN 操做
WHERE id IN(2, 4, 7)的意思就是篩選id字段的值在2,4,7這幾個值當中的記錄,
SELECT name, level, level_city FROM tb_rider WHERE id IN(2, 4, 7);it
關係運算符 AND 和 ORdate
查詢tb_rider``表中建立時間處於2017-02-01到2017-06-01之間的數據。
SELECT * FROM tb_rider WHERE created_at >= "2017-02-01 00:00:00" AND created_at < "2017-06-01 00:00:00";sql語句
查詢tb_rider``2017-02-01(包括當天)以前,或者2017-06-01(包括當天)以後註冊的騎手全部信息。
SELECT * FROM tb_rider WHERE created_at <= "2017-02-01 00:00:00" OR created_at >= "2017-06-01 00:00:00";
查詢tb_rider``2017-02-01(包括2017-02-01當天)到2017-06-01(不包括2017-06-01當天)期間註冊的且當前是金牌等級的騎手全部信息,
SELECT * FROM tb_rider
WHERE created_at >= "2017-02-01 00:00:00"
AND created_at < "2017-06-01 00:00:00"
AND level = 3;
按照運單的建立時間倒序排序把最近建立的運單排在最前面,使用ORDER BY語法:created_at字段值遞減(DESC)的順序對查詢結果排序
SELECT order_id, created_at FROM tb_order
WHERE rider_id = 1
AND grabbed_time >= "2017-12-30 00:00:00"
AND grabbed_time < "2017-12-31 00:00:00"
AND order_state = 40
ORDER BY created_at DESC;
更加複雜的場景:假設想要查詢2017-12-30和2017-12-31兩天全部運單的全部信息,並先按照騎手id遞增,再按運單狀態遞減的順序排序展現。
SELECT * FROM tb_order WHERE created_at >= "2017-12-30 00:00:00" AND created_at < "2018-01-01 00:00:00"
ORDER BY rider_id ASC, order_state DESC;
排序是有優先級:當rider_id字段的值都相同沒法區分順序時,纔會對相同rider_id的這幾條數據再按照order_state字段的值進行排序:舉例來講,rider_id = 2且order_state = 80的數據,也依然不可能排在rider_id = 1且order_state = 40的數據前面。
查詢前20行的數據
SELECT created_at FROM tb_order WHERE rider_id = 1 LIMIT 20;
COUNT:對查詢結果集合中特定的列進行計數;
SUM:對查詢結果的某個字段進行求和;
AVG:就是average的意思,對查詢結果的某個字段計算平均值;
#### COUNT求總
COUNT通常拿來統計總數:COUNT(name):表示對name這一列進行統計如(須要注意的是COUNT不會對name=null的那一行進行計算:好比總數有20行,可是其中有一行name=null,則實際上統計出來結果是19):
SELECT COUNT() FROM tb_order;(統計表tb_order總數:單純統計表總數)
SELECT COUNT() FROM tb_order WHERE rider_id = 1;(統計表tb_order條件爲rider_id = 1總數:單純統計知足條件總數)
SELECT COUNT(name) FROM tb_order;(統計表tb_order總數:以name列爲準)
SELECT COUNT(name) FROM tb_order WHERE rider_id = 1;(統計表tb_order條件爲rider_id = 1總數:以name列爲準)
注意點:1.COUNT不會自動去重;
2.COUNT在某一條查詢結果中,用來計數的那一列的值爲「空"時,這條記錄不進行計數;
#### SUM 求和
SELECT SUM(merchant_customer_distance) FROM tb_order WHERE rider_id = 1 AND order_state = 40;
#### AVG 求和
SELECT AVG(merchant_customer_distance) FROM tb_order WHERE rider_id = 1 AND order_state = 40;
COUNT(DISTINCT name)就是對去重後的name進行計數
SELECT COUNT(DISTINCT name) FROM tb_sample_1;
SELECT rider_id, rider_name, AVG(merchant_customer_distance)
FROM tb_order WHERE order_state = 40
AND created_at >= "2017-12-30 00:00:00"
AND created_at < "2017-12-31 00:00:00"
GROUP BY rider_id;
HAVING語法的含義相似於WHERE,之因此有HAVING函數是由於WHERE語法是不能和聚合函數一塊兒使用的,所以只能使用HAVING做爲篩選條件的語法 GROUP BY rider_id將SELECT的結果根據rider_id進行分組,分組完成後HAVING AVG(merchant_customer_distance) > 1.5語句對每一組的merchant_customer_distance字段值求取平均數,而且將平均數大於1.5的結果篩選出來,做爲返回結果。 SELECT rider_id, rider_name, AVG(merchant_customer_distance) FROM tb_order WHERE order_state = 40 AND created_at >= "2017-12-30 00:00:00" AND created_at < "2017-12-31 00:00:00" GROUP BY rider_id HAVING AVG(merchant_customer_distance) > 1.5;
整型:
1:tinyint:用來表示很小很小的整數,好比經常用它做爲is_deleted、is_valid這些字段的字段類型,由於這兩個字段表示該條記錄是否有效,只存在兩個值分別是0和1;
2:smallint:比tinyint稍微大一點點的整型,能夠表示更大一點的整數,好比200、40四、401這樣的整數值;
3:int:經常使用的整型,能夠用來表示比較大的整數,好比10322(事實上int能夠表示的整數範圍遠遠比這個大);
4:bigint:用來表示很是大的整數,好比大多數表的自增id就會使用這個類型,能夠表示相似10322903這樣很是大的整數(事實上bigint能夠表示的整數範圍遠遠比這個要大);
浮點型:
1: decimal:能夠表示很是準確的小數,好比經緯度;
字符串類型
char:固定長度的字符串;
varchar:可變長度的字符串;
日期類型 date:表示一個日期,只包含日期部分,不包含時間,好比當前日期"2018-01-23"; datetime:表示一個日期,同時包含日期部分和時間部分,好比當前日期"2018-01-23 03:01:43";