天天看點

mysql統計age大于20的數_資料庫指令記錄

好記性不如爛筆頭,每次看了忘,忘了看,這次做一個記錄!

檢視存在的資料庫

mysql > show databases;

轉到自己需要檢視的資料庫

mysql > use 資料庫名;

檢視資料庫中的表

mysql >show tables;

顯示表列

mysql >show columns from 表名;

從example表中,檢索名為id的列(輸出結果的順序是雜亂無章的)

mysql >select id from example;

從example表中,檢索名為id的列,title的列,time的列

mysql >select id , title ,time from example;

time這一列的日期很多都是重複的,現在隻需要每個日期傳回一次,列名前加關鍵字distinct

mysql >select distinct time from example;

限制輸出五行,限制加關鍵字:limit 數字 (顯示的結果是select的基礎上限制的,select傳回的是無序的,第一行是0)

mysql >select id from example limit 5;

限制輸出的從XX到XX行,如,限制輸出搜尋結果的第2到8行

mysql >select id from example limit 2,8;

排序輸出關鍵字:order by 列名,列名,列名(前邊的檢索結果将會按照by後邊的列名排序輸出 )預設升序

mysql >select id from example order by id; #按照id排序輸出

mysql >select id from example order by time;#按照time排序輸出

mysql >select id , title ,time from example order by id , title ;

#檢索三列,按照前兩列結果排序,先按照id排序,然後按照tilte排序

降序排列,關鍵字:desc ,想降序哪個字段就寫在那個字段後邊

mysql >select id , title ,time from example order by id desc, title ;

#搜尋結果按照id降序排序,降序對title無效

過濾條件搜尋,加關鍵字where。

如果同時使用order by和where,order by 在where的後邊

where =" 字元串" ,字元串不區分大小寫

#搜尋id = 18的有關字段

mysql >select id , title ,time from example where id = 18;

#可以用表中任意的字段通過where字段顧慮

mysql >select id , title ,time from example where name = "hahahha"

#id為1到20之間的資料

mysql >select id , title ,time from example where id between 1 and 20;

#傳回time為空的

mysql >select id , title ,time from example where time IS NULL;

mysql統計age大于20的數_資料庫指令記錄

where

and操作符 /or操作符

and操作符的優先級大于or,是以,設定條件時最好加括号

每額外添加一條過濾語句就增加一個and或者or

#id小于18 且 time等于time = "2019-01-01"的資料

mysql >select id , title ,time from example where id < 18 and time = "2019-01-01";

#id小于18 或者 time等于time = "2019-01-01"的資料

mysql >select id , title ,time from example where id < 18 or time = "2019-01-01";

in操作符

in (限定,限定,限定),就是限定過濾的條件範圍,範圍就在in後邊的括号裡

比如:

“where id in(1001,1002) 等價于:where id = 1001 and id =1002

#輸出id為1,2,3的資料

mysql >select id , title ,time from example where id in (1,2,3);

not操作符 比對除了後邊的條件的一切

#輸出除了id為1,2,3的所有資料

mysql >select id , title ,time from example where id not in (1,2,3);

插入操作 insert into

這種方法不推薦

插入一條完整的資料,如果某一列沒有值,應該給NULL,各個列必須使用他們在表定義中出現的次序填充

#插入一行完整的資料到costomer表,

#注意,id雖然是自增的,但是必須要給值,給的值起一個占位作用,實際id依然值自增之後的值,

#insert into customer values('id','name','age');

#給NULL占位

mysql >insert into customer values(NULL,'bob','18');

推薦的方法

比較繁瑣,但是安全,id自然自增

插入省略某些行的條件是:

(1)該列定義允許為NULL

(2)在表定義給出預設值,如果不給預設值,将使用預設值

mysql >insert into customer (name,age)values('bob','18');

如果插入資料的列名相同,一次插入多條資料,每組值括起來,用逗号分開就行

mysql >insert into customer (name,age)values('bob','18'),('Tom','20'),('Mark','30');

插入檢索的資料 insert ....select

#從custnew 檢索年齡大于20的資料插入到customers表

mysql >insert into customers(name,age) select name age from custnew where age > 20

更新資料:update,更新時注意where的使用

基本形式:update 表名 set 列名 = "新值" (where 條件)如果沒where條件,表中這一列全部被更新

多個列更新,set後邊用逗号隔開

(1)更新特定的行

(2)更新所有的行

#更新id 為1005的人的郵箱

mysql >update customers set email = '[email protected]' where id = 1005;

#更新郵箱、名字、工作。其中工作設定為空(假如表允許job為NULL)

mysql >update customers set email = '[email protected]',name = 'Bob',job = NULL where id = 1005;

注意:update如果更新多行,隻要有一行出現錯誤,所有的更新被取消,如果想忽略出現的錯誤,繼續更新則使用關鍵字update ignore

删除資料delete

delete不能删除表

形式: delete from 表名 (where 條件) 省略where将删除表中所有資料

(1)表中删除特定的行

(2)表中删除所有的行

mysql >delelte from customer where id = 1006

建立表create table

mysql統計age大于20的數_資料庫指令記錄

建立表示例

注意:

(1) NULL值就是沒有值或者缺值,NOT NULL值的列不接受該列沒有值得行,即插入時該列必須有值

(2)主鍵必須是唯一的,主鍵用于單獨列,則值必須唯一,如果多個列為主鍵,則組合必須唯一

(3)AUTO_INCERENT表示每進行一次insert操作時,自動對該列增量,select last_insert_id()傳回最後自增的id值

(4)使用預設值,可以通過設定default設定預設值

(5) InnoDB是一個可靠的事務處理引擎,不支援全文本搜尋;MEMORY資料存儲在記憶體,速度特别快; MyISAM是一個性能極高的引擎,支援全文本搜尋,不支援事務處理。

mysql統計age大于20的數_資料庫指令記錄

預設值

更新表 alter table

(1)更改表名

(2)更改列

增加列:

#給表vendors 增加一個名為ven_phone 列,設定類型為char(200)

mysql >alter table vendors add ven_phone char(200)

删除列:

#删除表vendors 的列ven_phone

mysql >alter table vendors drop column ven_phone ;

定義外鍵:

alter table 表名 add constraint 外鍵名 foreign key (列名) references 外鍵表名(外鍵列名)

#給表orderitems 增加一個外鍵fk_orderitems_orders ,外鍵來自于表orders 的order_num字段

mysql >alter table orderitems add constraint fk_orderitems_orders foreign key(order_num) references orders (order_num)

删除表drop

drop table 表名

#删除表custormers

mysql >drop table custormers;

重命名表rename

rename table 舊表名 to 新表名

mysql >rename table customers to new_customers

like模糊查詢:

當你的查找條件不成熟時,比如你隻記得title中以中國開頭的标題等,建議少用,查

詢速度慢

(1)%百分号:比對任意多的字元

#查找title以中國開頭

mysql >select id , title ,time from example where title like '中國%';

#查找title包含中國的

mysql >select id , title ,time from example where title like '%中國%';

#查找title以中國結尾的

mysql >select id , title ,time from example where title like '%中國';

(2)_下劃線:僅且隻能比對一個字元

#比對包含 X國的title X 代表任意的:中國,美國。。等等

mysql >select id , title ,time from example where title like '_國%';

正規表達式比對:regexp 基本上和平時學的正則比對一樣的

mysql >select id , title ,time from example where title regexp '中國';

like和regrexp有個重要的差別:

假設現在的titile有兩個值:

title

time

中國

2019-08-03

我愛中國

2019-08-03

下面的like語句隻能檢索出第一條資料 如果'%中國',那麼就可以檢索出兩個了

mysql >select id , title ,time from example where title like '中國';

正規表達式可以檢索兩條資料

mysql >select id , title ,time from example where title regexp '中國';

正規表達式的or : | ,比對中國、美國

mysql >select id , title ,time from example where title regexp '中國 | 美國';

比對幾個字元之間 比對中國、美國,簡化版的 |

mysql >select id , title ,time from example where title regexp '[中美]國';

特殊字元查找:必須加雙斜線:'\\' 比如 '\\.'表示查找. '\\\' 就表示查找\

#包含.的title

mysql >select id , title ,time from example where title regexp '\\.';

mysql統計age大于20的數_資料庫指令記錄

特殊字元表

建立計算字段

(1) concat(參數,參數,參數) 将列拼接在一起。參數可以是列名或者字元串,參數的個數是任意的

#将id title 和time拼接在一起,中間填充字元串****

mysql >select concat(id , '****',title ,'****',time ) from example

(2) Rtrim()函數,去除右邊空格

LTrim()去除左邊的空格

Trim()去除兩邊的空格

mysql >select concat( rtrim (id) , '****',trim(title) ,'****', ltrim(time )) from example

(3)算術計算 關鍵字 as 算術操作符包括: + 加、 - 減、 * 乘、 / 除

# 計算每一行的 id * price ,結果作為新的一行result 輸出

#輸出結果是三清單格:一列id 一列price 一列結果

mysql >select id , price, id * price as result from example

(4)文本函數

# upper函數将文本裝換為大寫,輸出兩列,一列原始url,一列轉換的url_upper

mysql >select url , upper (url ) as url_upper from example

mysql統計age大于20的數_資料庫指令記錄

文本函數

mysql統計age大于20的數_資料庫指令記錄

文本函數

#輸出和YLei讀音相似的資料,比如Y.Lee 等 sounddex就讀音

mysql >select name from example where soundex(name) = soundex ('Y Lie');

日期和時間處理函數:yyyy-mm-dd

#找到指定日期的資料 日期格式必須為:

mysql >select id from example where data(time) = '2019-08-03'

mysql統計age大于20的數_資料庫指令記錄

日期處理函數

mysql統計age大于20的數_資料庫指令記錄

數值處理函數

聚集函數

mysql統計age大于20的數_資料庫指令記錄

聚集函數

(1)avg()傳回列、行的平均值,avg的參數必須給出,如果求多個列平均值,則需要多次使用avg函數

avg函數忽略NULL

#傳回price這一列的平均值

mysql >select avg(price) as avg_price from example ;

(2)count()函數計數。确定表中行的數目或符合特定條件的行的數目

count(*)對于多有的都計數

count(column)排除NULL值

#傳回表總共有多少行

mysql >select count(*) as num from example ;

#傳回日期非空的有多少行

mysql >select count(time) as time_count from example;

(3)max()函數求列最大,需要指定列,列可以是文本等,忽略NULL

#找價格最大的

mysql >select max(price) as price_max from example

(4)min()函數求列最小,需要指定列

#找價格最小的

mysql >select min(price) as price_min from example

(5)sum()函數,傳回指定列隻的和,可以是計算得到,忽略NULL

#計算number列之和

mysql >select sum(number) as items_total from example

# 計算number * prices 列之和

mysql >select sum(number * price ) as items_total from example

mysql 5支援在以上五個函數裡加入 distinct,但是count(*)裡不能加入distinct。

mysql >select avg(distinct price) as avg_price from example ;

這五個函數也可以組合

mysql >select count(*) as num,

min(price) as min_price,

max(price) as max_price,

vag (price) as vag_price from example;

分組group by :就是統計一個字段有幾個值,每個值有多少個

有NULL作為單獨一組傳回,多個NULL為一組group by

group by必須使用和select相同的表達式等,不能使用别名(as後的就是别名)

group by 在where之後,order by之前

# 下面這個統計 表example中time字段包含幾個時間,每個時間總共有多少行資料

mysql >select time count(*) as num_time from example group by time;

mysql統計age大于20的數_資料庫指令記錄

時間是31号的資料有6行,29号的資料有50行

過濾分組having,where是對于行的過濾,對分組的過濾就是having,基本和where一樣,但是放在group by 後邊,

having 支援所有的where操作

where就是資料分組前過濾,having就是資料分組後過濾

#下面這個統計 表example中time字段包含幾個時間,每個時間總共有多少行資料

#然後輸出時間總數大于10的時間

mysql >select time count(*) as num_time from example group by time having count(*)> 10;

mysql統計age大于20的數_資料庫指令記錄

時間總行數大于10的就隻有29号的50行

子查詢:就是嵌套查詢,前一個查詢的結果作為後一個查詢的條件,嵌套可以一直嵌套

#先查找tilte是中國的id ,然後去這些id裡找url ,

mysql >select url from example where id in(select id from example where title = "中國")

聯結: 連接配接的條件是存在兩個表,A,B ,其中B的外鍵是A的主鍵

A表vendors:供應商id(主鍵)和名字 vendors

vend_id

vend_name

1001

華為

1002

蘋果

1003

小米

B表product,pro_id(主鍵) ,pro_name ,pro_price ,pro_vend(外鍵)

pro_id

pro_name

pro_price

pro_vend

6666

手機

8888

1001

6667

路由器

666

1001

7777

手機

5555

1002

7778

路由器

888

1002

#從兩個表中 找出供應商的名字,産品的名字和價格,其中 通過供應商id連接配接了兩個表,最後排個序

#where句子裡的就是聯結條件

mysql >select vend_name ,pro_name ,pro_price from vendors ,products

where vendors.vend_id = products.pro_vend

order by vend_name ,pro_name;

一種聯結的關鍵字:inner join .....on 其中inner join 前後是需要聯結的表名字,on後邊的條件和where一樣

#和前邊的聯結語句輸出一樣

mysql >select vend_name.por_name,pro_price from vendors inner join products

on vendors.vend_id = products.pro_id

表别名:和前邊的别名一樣都是as操作,一般聯結用的多,或者你的表名很長或者需要多次使用

#表example設定别名為e

mysql >select time ,id from example as e where e.url = '*****';

組合查詢UNION

連結多條select語句,并将結果作為一個表傳回

規則:union必須由兩條及其以上的select語句組成,之間用union分開,每個查詢必須包含相同的列。

union會主動去除重複的行 , 關鍵字union all 不會主動去除重複的行

在union使用order by時隻能在最後一條select語句使用,結果是對所有的select結果進行排序

#查找價格不大于5元的,查找id為1001和1002 的

mysql >select vend_id ,pro_id from products where pro_price <= 5 union select vend_id ,pro_id from products where vend_id in (1001,1002)