1. 程式人生 > >mysql必知必會——常用mysql基礎語句

mysql必知必會——常用mysql基礎語句

連線、檢視資料庫:

sudo mysql show databases; use learn; show tables from learn;返回所有表 show columns from customers;返回所有列的屬性 describe customers;同show columns show grants;用來顯示授予使用者的安全許可權

檢索資料:

select distinct vend_id from products;distinct用於顯示不同的行,同樣值的行將不顯示,注意:distinct不能只針對於一個列,將被應用於所有被選擇的列,只有一個列相同仍舊會被選擇 select vend_id from products limit 5;limit

用於只顯示前面n行 select vend_id from products limit 5,5;5,5意為從第5行之後(即第6行)開始的5行select vend_id from products limit 2 offset 4; 意為從第5行開始的2行 select products.vend_id from learn.products; 同時使用表名和列字

排序:

select prod_id,prod_price,prod_name from products order by prod_price,prod_name; 多個列排序,先對第一個列排序,當第一個列相同時,才按照第二個列排序 select prod_id,prod_price,prod_name from products order by prod_price desc,prod_name;desc,asc

只對前面的列進行相應排序,預設按照升序(不加),如果想對多個列進行降序,只能在每個列後加上desc select prod_id as id,prod_price as price from products order by prod_price desc limit 1; 選擇按照降序排列的第一位資料,order by需要位於from子句之後,limit子句需要位於order by子句之後

過濾資料:

select cust_email from customers where cust_email is null;is null條件判斷某一記錄列的值是否為空 select prod_id,vend_id from products where prod_id = 'ANV01' or vend_id = 1003;or

返回任一列滿足條件的記錄 select prod_name,prod_price from products where vend_id = 1002 or vend_id = 1003 and prod_price >= 10;and的優先順序高於or的優先順序,所以此語句會優先操作and左右的兩個語句,並將結果返回與or左邊的語句進行判斷,所以返回的結果是id=1002或者 id=1003且大於10的資料,結果中包含id=1002但是價格小於10的記錄,為了避免出現錯誤,應用圓括號將需要組合的條件括在一起,因為括號具有比and>和or更高的優先順序 select prod_name,prod_price from products where (vend_id = 1002 or vend_id = 1003) and prod_price >= 10; select * from products where vend_id in (1002,1003,1005);in操作符,功能與or功能相同,選擇括號中任一匹配條件 select * from products where vend_id not in (1002,1003);not操作符,對後方的判斷條件取反 select * from products where prod_name like '%jet%';%表示任意字元出現任意次數(0次) select * from products where prod_name like '_ ton anvil';_表示該位置可以為任何字元

正則表示式:

select * from products where vend_id regexp '1001';regexp表示後方使用正則表示式,對於正則表示式,如果匹配字元在列中出現,則返回,不需要整個串全部匹配 mysql中正則表示式不區分大小寫,為區分大小寫,需要使用binary關鍵字,如:where prod_name regexp binary 'Je';.表示任一字元|表示或者,相當於or select * from products where prod_name regexp '[12] ton';[12]內部元素表示或,相當於[1|2]^作用之1:表示否定,[^12]表示匹配除這些字元外的任何東西(注意:如果包含了1或2,但是有其餘字元,則也會被匹配) select * from products where prod_name regexp '[1-5] ton';[1-5]表示範圍內的匹配 select * from vendors where vend_name regexp '\\.';\\轉義符,表示查詢.這個符號*表示前一個字元有0個或多個匹配+表示前一個字元有1個或多個匹配?表示前一個字元有0個或1個匹配{n} 指定數目的匹配{n,} 不少於指定數目的匹配{n,m} 匹配範圍內的數目 select * from products where prod_name regexp 's+'; [:alnum:]任意字母和數字 [:digit:]任意數字 [:lower:][:upper:]任意小寫字母,任意大寫字母 select * from products where prod_name regexp '0{3}'; 表示匹配出現3次0 select * from products where prod_name regexp '[[:digit:]]{3}'; 表示匹配連續出現3次數字的記錄^表示文字的開始$表示文字的結尾select * from products where prod_name regexp '^[0-9\\.]'; 表示匹配首字母為數字或者小數點的記錄([]中表示或者)like和regexp的區別在like匹配整個字串,regexp匹配子串,利用定位符^和$開始和結尾,則regexp和like作用相同

建立計算欄位:

select concat(vend_name,'(',vend_country,')') from vendors;concat()拼接串,每個串之間用逗號分隔 select rtrim(vend_name) from vendors;rtrim去掉資料右側多餘的空格,ltrim去掉資料左邊的空格,trim去掉串左右兩邊的空格 select prod_id,item_price,quantity,item_price*quantity as total_price from orderitems where order_num = 20005; 使用+-*/進行計算

函式:

字串函式: select vend_name,upper(vend_name) as BIG from vendors;upper lower:將字串全部轉換成大、小寫字母 ltrim rtrim trim:去掉串左邊、右邊、左右兩邊的空格left right:返回串左右兩邊的字元length:返回串的長度locate:找出串的一個子串,返回子串第一次出現的位置substring:返回子串的字元substring(str, pos)substring(str, pos, length)說明:substring(被擷取欄位,從第幾位開始擷取) substring(被擷取欄位,從第幾位開始擷取,擷取長度) select substring(content,5) as abstract from my_content_t select substring(content,5,200) as abstract from my_content_tsoundex:返回串的soundex值,返回語音相似的記錄 select * from vendors where soundex(vend_state) = soundex('me'); soundex('me')返回了記錄中發音相似的‘mi’的記錄 日期函式:now:返回當前日期和時間date:返回時間的日期部分(年月日)time:返回時間的時間部分(時分秒)dayofweek:返回對應日期是星期幾 select * from orders where order_date = '2005-09-12'; 當日期時分秒不為00:00:00時,即使日期正確,也不會返回 select * from orders where date(order_date) = '2005-09-01'; select * from orders where time(order_date) = '00:00:00';year month day:返回日期中的年份、月份、日hour minute second:返回時間的小時、分鐘、秒 select * from orders where date(order_date) between '2005-09-01' and '2005-09-30'; select * from orders where year(order_date) = 2005 and month(order_date) = 9; 以上兩句均可以返回2005年9月份的訂單curdate curtime:返回當前日期、時間datediff:計算兩個日期之差select datediff(curdate(),'2005-06-02'); 返回今天和之後日期的相差天數timediff:計算時間之差(小時分鐘秒) select timediff(now(),'2018-10-17 00:00:00'); 數值處理函式abs:絕對值exp:一個數的指數cos sin tan:正餘弦正切mod:餘數rand:隨機數sqrt:數的平方根 聚集函式:avg:返回某列的平均值count:返回某列的行數,用於確定符合條件記錄的數目max:返回某列的最大值,可用於返回最大日期數min:返回某列的最小值sum:返回某列值之和 select sum(orderitems.quantity*orderitems.item_price) as allmoney from orderitems; 返回總的訂單金額

資料分組:

group by:分組,子句可以包含多個列,select中的每個列需要在group by子句中給出,出現在where子句之後,order by子句之前 select vend_id,count(*) as number from products group by vend_id;having:類似於where,但是having可用於過濾分組,where只用於過濾行;where在分組前過濾,having在分組後過濾 select vend_id,count(*) from products where prod_price > 5 group by vend_id having count(*) > 2;一般使用count時,都需要進行分組

select子句順序: select from where group by having order by limit

使用子查詢:

select cust_id from orders where order_num in (select order_num from orderitems where prod_id = 'TNT2'); 子查詢一般與in操作符結合使用select cust_name,cust_state,(select count(*) from orders where orders.cust_id = customers.cust_id) as number from customers order by cust_id;

聯結:

內部聯結: select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id = products.vend_id;from A inner join B on 條件 select prod_name,vend_name from orderitems,products,vendors where products.vend_id = vendors.vend_id and orderitems.prod_id = products.prod_id and order_num = 20005; 聯結的表越多,效能下降的越厲害as給表起別名: select cust_name from customers as c where c.cust_name regexp '^C';自聯結:使用多個相同的表,取不同的別名進行聯結select p1.prod_id,p1.vend_id,p1.prod_name from products as p1,products as p2 where p1.vend_id = p2.vend_id and p2.prod_id = 'DTNTR'; 一般自聯結比子查詢要快很多 外部聯結: select cust_name,customers.cust_id,order_num from customers left outer join orders on customers.cust_id = orders.cust_id; 左外聯結:from A left outer join B on A.a = B.a選擇左邊表所有的行,以及右邊表對應的行 右外聯結:from A right outer join B on 選擇右邊表所有的行,以及左邊表對應的行union:由兩條或兩條以上的select語句組成,語句之間用union分隔 查詢必須包含相同的列、表示式或聚集函式 union會自動取消重複的行,但是unoin all不會取消重複的行,同一行可能出現多次 對於union使用排序時,在最後一個查詢後加上order by

資料插入:

insert into customers(cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country) values('A','B','C','D','E','F'); 可以不再表名後加型別,但是加了後會更加安全,不需要插入的列的值可設為NULL或插入時不填寫列名和對應的value值(將使用定義的預設值,如果未設定預設值,將產生錯誤資訊) 插入多行語句:insert into table(……)values(……),(……) insert into customers(cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country) values('A','B','C','D','E','F'),('A','A','A','A','A','A'); 插入檢索出的資料:insert select,例如將一個表檢索出插入另一個表,也可以使用where過濾插入的資料insert into customers(cust_name,cust_address) select order_num,cust_id from orders where cust_id = 10001;

更新資料:

update set whereupdate customers set cust_email = "[email protected]" where cust_id = 10005; update customers set cust_name = "fanjiuding",cust_email = "1394754501" where cust_id = 10005; 更新多列,用逗號隔開ignore:如果更新時出現錯誤,則整個更新會取消,使用update ignore customers時,即使發生錯誤,也會繼續更新 為了刪除某個列的值,可以將其設為NULL:update ignore customers set cust_name = NULL,cust_email = "1394754501" where cust_id = 10005;delete:刪除行,如果刪除列,可以使用update不新增where條件delete from customers where cust_id = 10018; delete刪除表的行或所有行,但不刪除表本身truncatetruncate table語句可以從表中刪除所有行,相對於delete更快,因為它是刪除原來的表並重新建立一個表,而不是逐行刪除表中的資料

建立和操縱表:

create table test      (key1 int not null,      key2 char(50) null,      key3 char(10) not null,      primary key (key1));create建立表名,列名和型別,宣告每個列或者為null或者為not null,允許null值的列允許在插入時不給出該列的值,不允許null的列在插入或更新時該列必須有值 主鍵值必須唯一,即單個主鍵值或者多個列組成的主鍵組合必須唯一,且不能為nullprimary key宣告主鍵在最後,建立多個列組成的主鍵,應當為:primary key(order_num,order_item)auto_increment:每個表允許一個auto_increment列,而且它必須被索引(通過使它成為主鍵),作用為每次插入資料時自動增加1 create table test1 (key1 int not null auto_increment, key2 char(50) not null, key3 char(10) not null, primary key (key1,key2)); 對於auto_increment的值,也可以顯示宣告為具體的值,則之後的插入記錄如果未宣告,則在前一個的記錄基礎上+1default:當插入行沒有給出值時,允許指定預設值 create table test2 (key1 int not null auto_increment, key2 char(50) not null default '1', key3 char(10) not null, primary key (key1));alter:更新表 alter table vendors add vend_phone char(20); 新增一個列 alter table vendors drop column vend_phone; 刪除一個列 alter table orderitems       add constraint fk_orderitems_orders       foreign key (order_num) references orders (order_num); 建立外來鍵drop:刪除表 drop table test;rename:重命名錶 rename table test1 to testagain; 可以同時對多個表進行重新命名:rename table a to b,c to d,e to f;

檢視:

create view:建立檢視drop view:刪除檢視 更新檢視時,可使用drop然後create,也可以直接用create or replace view(有則替換,沒有則建立) create view customerorder as select cust_name,cust_contact from customers,orders where customers.cust_id = orders.cust_id; select * from customerorder; 建立檢視後,可以重複使用,簡化複雜的sql操作

觸發器:

在表發生更改時(delete insert update)自動處理。

事務:

指一組sql語句 事務處理:一組操作為整體執行,或者完全執行,或者發生錯誤,進行回退以完全不執行 作為兩種常用的引擎,myisam不支援明確的事務處理管理,innodb支援事務管理start transaction:表示事務的開始rollback:回退 select * from testagain;start transaction;delete from testagain;select * from testagain;rollback;select * from testagain; 最後因為回退了,所以資料未改變commit:事務處理塊中,提交不會像其他sql語句一樣自動隱含提交,commit可進行明確的提交 start transaction;delete from testagain where key1 = 4;delete from testagain where key1 = 7;commit;savepoint delete1;設定保留點,回退時可以回退到保留點的位置rollback to delete1;

建立使用者賬號:

create user ding identified by '123456';使用者名稱ding,password:1223456 select user from user; 可檢視所有使用者 rename user ding to ding1;drop user ding1; 刪除使用者及其許可權show grants for ding;檢視一個使用者的許可權,usage on *.*表示沒有許可權grant select,insert on learn.* to ding; 授予許可權,以上為授予在資料庫上select,insert的許可權,learn.* 表示learn資料庫上的所有表revoke select on learn.* from ding; revoke撤銷許可權 grant all和revoke all對整個伺服器,on database.*對整個資料庫,on database.table對特定的表set password for ding = password('aaaa'); 更改密碼