好記性不如爛筆頭,每次看了忘,忘了看,這次做一個記錄!
檢視存在的資料庫
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;
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
建立表示例
注意:
(1) NULL值就是沒有值或者缺值,NOT NULL值的列不接受該列沒有值得行,即插入時該列必須有值
(2)主鍵必須是唯一的,主鍵用于單獨列,則值必須唯一,如果多個列為主鍵,則組合必須唯一
(3)AUTO_INCERENT表示每進行一次insert操作時,自動對該列增量,select last_insert_id()傳回最後自增的id值
(4)使用預設值,可以通過設定default設定預設值
(5) InnoDB是一個可靠的事務處理引擎,不支援全文本搜尋;MEMORY資料存儲在記憶體,速度特别快; MyISAM是一個性能極高的引擎,支援全文本搜尋,不支援事務處理。
預設值
更新表 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 '\\.';
特殊字元表
建立計算字段
(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
文本函數
文本函數
#輸出和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'
日期處理函數
數值處理函數
聚集函數
聚集函數
(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;
時間是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;
時間總行數大于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)