MySQL 学习笔记 二
生活随笔
收集整理的這篇文章主要介紹了
MySQL 学习笔记 二
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? function 函數?
函數的作用比較大,一般多用在select查詢語句和where條件語句之后。按照函數返回的結果, 可以分為:多行函數和單行函數;所謂的單行函數就是將每條數據進行獨立的計算,然后每條數據得到一條結果。 如:字符串函數;而多行函數,就是多條記錄同時計算,得到最終只有一條結果記錄。如:sum、avg等 多行函數也稱為聚集函數、分組函數,主要用于完成一些統計功能。MySQL的單行函數有如下特征: 單行函數的參數可以是變量、常量或數據列。單行函數可以接受多個參數,但返回一個值。 單行函數就是它會對每一行單獨起作用,每一行(可能包含多個參數)返回一個結果。 單行函數可以改變參數的數據類型。單行函數支持嵌套使用:內層函數的返回值是外層函數的參數。 ? 單行函數可以分為: 類型轉換函數; 位函數; 流程控制語句; 加密解密函數; 信息函數單行函數
? 1、 char_length字符長度 select char_length(tel) from user; ? 2、 sin函數 select sin(age) from user; select sin(1.57); ? 3、 添加日期函數 select date_add('2010-06-21', interval 2 month); interval是一個關鍵字,2 month是2個月的意思,2是數值,month是單位 select addDate('2011-05-28', 2); 在前面的日期上加上后面的天數 ? 4、 獲取當前系統時間、日期 select curdate(); select curtime(); ? 5、 加密函數 select md5('zhangsan'); ? 6、 Null 處理函數 select ifnull(birthday, 'is null birthday') from user; 如果birthday為null,就返回后面的字符串 ? select nullif(age, 245) from user; 如果age等于245就返回null,不等就返回age ? select isnull(birthday) from user; 判斷birthday是否為null ? select if(isnull(birthday), 'birthday is null', 'birthday not is null') from user; 如果birthday為null或是0就返回birthday is null,否則就返回birthday not is null;類似于三目運算符 ? 7、 case 流程函數 case函數是一個流程控制函數,可以接受多個參數,但最終只會返回一個結果。 select name, age, (case sex when 1 then '男' when 0 then '女' else '火星人' end ) sex from user;??
組函數
組函數就是多行函數,組函數是完成一行或多行結果集的運算,最后返回一個結果,而不是每條記錄返回一個結果。?
1、 avg平均值運算 select avg(age) from user; select avg(distinct age) from user; ? 2、 count 記錄條數統計 select count(*), count(age), count(distinct age) from user; ? 3、 max 最大值 select max(age), max(distinct age) from user; ? 4、 min 最小值 select min(age), min(distinct age) from user; ? 5、 sum 求和、聚和 select sum(age), sum(distinct age) from user; select sum(ifnull(age, 0)) from user; ? 6、 group by 分組 select count(*), sex from user group by sex; select count(*) from user group by age; select * from user group by sex, age; ? 7、 having進行條件過濾 不能在where子句中過濾組,where子句僅用于過濾行。過濾group by需要having 不能在where子句中用組函數,having中才能用組函數 select count(*) from user group by sex having sex <> 2;??
? 多表查詢和子查詢?
數據庫的查詢功能最為豐富,很多時候需要用到查詢完成一些事物,而且不是單純的對一個表進行操作。而是對多個表進行聯合查詢, MySQL中多表連接查詢有兩種規范,較早的SQL92規范支持,如下幾種表連接查詢: 等值連接 非等值連接 外連接 廣義笛卡爾積 SQL99規則提供了可讀性更好的多表連接語法,并提供了更多類型的連接查詢,SQL99支持如下幾種多表連接查詢: 交叉連接 自然連接 使用using子句的連接 使用on子句連接 全部連接或者左右外連接 ? SQL92的連接查詢 SQL92的連接查詢語法比較簡單,多將多個table放置在from關鍵字之后,多個table用“,”隔開; 連接的條件放在where條件之后,與查詢條件直接用and邏輯運算符進行連接。如果條件中使用的是相等, 則稱為等值連接,相反則稱為非等值,如果沒有任何條件則稱為廣義笛卡爾積。 廣義笛卡爾積:select s.*, c.* from student s, classes c; 等值:select s.*, c.* from student s, classes c where s.cid = c.id; 非等值:select s.*, c.* from student s, classes c where s.cid <> c.id; select s.*, c.name classes from classes c, student s where c.id = s.classes_id and s.name is not null; ? SQL99連接查詢 1、交叉連接cross join,類似于SQL92的笛卡爾積查詢,無需條件。如: select s.*, c.name from student s cross join classes c; ? 2、自然連接 natural join查詢,無需條件,默認條件是將2個table中的相同字段作為連接條件,如果沒有相同字段,查詢的結果就是空。 select s.*, c.name from student s natural join classes c; ? 3、using子句連接查詢:using的子句可以是一列或多列,顯示的指定兩個表中同名列作為連接條件。 如果用natural join的連接查詢,會把所有的相同字段作為連接查詢。而using可以指定相同列及個數。 select s.*, c.name from student s join classes c using(id); ? 4、 join … on連接查詢,查詢條件在on中完成,每個on語句只能指定一個條件。 select s.*, c.name from student s join classes c on s.classes_id = c.id; ? 5、 左右外連接:3種外連接,left [outer] join、right [outer] join,連接條件都是通過用on子句來指定,條件可以等值、非等值。 select s.*, c.name from student s left join classes c on s.classes_id = c.id; select s.*, c.name from student s right join classes c on s.classes_id = c.id; ? 子查詢 子查詢就是指在查詢語句中嵌套另一個查詢,子查詢可以支持多層嵌套。子查詢可以出現在2個位置: from關鍵字之后,被當做一個表來進行查詢,這種用法被稱為行內視圖,因為該子查詢的實質就是一個臨時視圖 出現在where條件之后作為過濾條件的值 ? 子查詢注意點: 子查詢用括號括起來,特別情況下需要起一個臨時名稱 子查詢當做臨時表時(在from之后的子查詢),可以為該子查詢起別名,尤其是要作為前綴來限定數據列名時 子查詢用作過濾條件時,將子查詢放在比較運算符的右邊,提供可讀性 子查詢作為過濾條件時,單行子查詢使用單行運算符,多行子查詢用多行運算符 ? 將from后面的子查詢當做一個table來用: select * from (select id, name from classes) s where s.id in (1, 2); 當做條件來用: select * from student s where s.classes_id in (select id from classes); select * from student s where s.classes_id = any (select id from classes); select * from student s where s.classes_id > any (select id from classes);? 操作符和函數?
1、 boolean只判斷 select 1 is true, 0 is false, null is unknown; select 1 is not unknown, 0 is not unknown, null is not unknown; ? 2、 coalesce函數,返回第一個非null的值 select coalesce(null, 1); select coalesce(1, 1); select coalesce(null, 1); select coalesce(null, null); ? 3、 當有2個或多個參數時,返回最大的那個參數值 select greatest(2, 3); select greatest(2, 3, 1, 9, 55, 23); select greatest('D', 'A', 'B'); ? 4、 Least函數,返回最小值,如果有null就返回null值 select least(2, 0); select least(2, 0, null); select least(2, 10, 22.2, 35.1, 1.1); ? 5、 控制流函數 select case 1 when 1 then 'is 1' when 2 then 'is 2' else 'none' end; select case when 1 > 2 then 'yes' else 'no' end; ? 6、 ascii字符串函數 select ascii('A'); select ascii('1'); ? 7、 二進制函數 select bin(22); ? 8、 返回二進制字符串長度 select bit_length(11); ? 9、 char將值轉換成字符,小數取整四舍五入 select char(65); select char(65.4); select char(65.5); select char(65.6); select char(65, 66, 67.4, 68.5, 69.6, '55.5', '97.3'); ? 10、 using改變字符集 select charset(char(0*65)), charset(char(0*65 using utf8)); ? 11、 得到字符長度char_length,character_length select char_length('abc'); select character_length('eft'); ? 12、 compress壓縮字符串、uncompress解壓縮 select compress('abcedf'); select uncompress(compress('abcedf')); ? 13、 concat_ws分隔字符串 select concat_ws('#', 'first', 'second', 'last'); select concat_ws('#', 'first', 'second', null, 'last');? 事務處理?
動作 開始事務:start transaction 提交事務:commit 回滾事務:rollback 設置自動提交:set autocommit 1 | 0 atuoCommit系統默認是1立即提交模式;如果要手動控制事務,需要設置set autoCommit 0; 這樣我們就可以用commit、rollback來控制事務了。 ? 在一段語句塊中禁用autocommit 而不是set autocommit start transaction; select @result := avg(age) from temp; update temp set age = @result where id = 2; select * from temp where id = 2;//值被改變 rollback;//回滾 select * from temp where id = 2;//變回來了 在此期間只有遇到commit、rollback,start Transaction的禁用autocommit才會結束。然后就恢復到原來的autocommit模式; ? 不能回滾的語句 有些語句不能被回滾。通常,這些語句包括數據定義語言(DDL)語句,比如創建或取消數據庫的語句, 和創建、取消或更改表或存儲的子程序的語句。 您在設計事務時,不應包含這類語句。如果您在事務的前部中發布了一個不能被回滾的語句, 則后部的其它語句會發生錯誤,在這些情況下,通過發布ROLLBACK語句不能 回滾事務的全部效果。 ? 一些操作也會隱式的提交事務 如alter、create、drop、rename table、lock table、set autocommit、start transaction、truncate table 等等, 在事務中出現這些語句也會提交事務的 事務不能嵌套事務 事務的保存點 Savepoint pointName/Rollback to savepoint pointName 一個事務可以設置多個保存點,rollback可以回滾到指定的保存點,恢復保存點后面的操作。 如果有后面的保存點和前面的同名,則刪除前面的保存點。 Release savepoint會刪除一個保存點,如果在一段事務中執行commit或rollback,則事務結束,所以保存點刪除。 ? Set Transaction設計數據庫隔離級別 SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } 本語句用于設置事務隔離等級,用于下一個事務,或者用于當前會話。 在默認情況下,SET TRANSACTION會為下一個事務(還未開始)設置隔離等級。 如果您使用GLOBAL關鍵詞,則語句會設置全局性的默認事務等級, 用于從該點以后創建的所有新連接。原有的連接不受影響。使用SESSION關鍵測可以設置默認事務等級, 用于對當前連接執行的所有將來事務。 默認的等級是REPEATABLE READ全局隔離等級。??
? 注釋?
select 1+1; # 單行注釋 select 1+1; -- 單行注釋 select 1 /* 多行注釋 */ + 1;? 基本數據類型操作?
字符串 select 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello'; select "hello", "'hello'", "''hello''", "hel""lo", "\"hello"; ? \n換行 select 'This\nIs\nFour\nLines'; ? \轉義 select 'hello \ world!'; select 'hello \world!'; select 'hello \\ world!'; select 'hello \' world!';? 設置數據庫mode模式?
SET sql_mode='ANSI_QUOTES'; create table t(a int); create table "tt"(a int); create table "t""t"(a int); craate talbe tab("a""b" int);? 用戶變量?
set @num1 = 0, @num2 = 2, @result = 0; select @result := (@num1 := 5) + @num2 := 3, @num1, @num2, @result;? 存儲過程?
創建存儲過程: delimiter // create procedure get(out result int) begin select max(age) into result from temp; end// 調用存儲過程: call get(@temp); 查詢結果: select @temp; ? 刪除存儲過程: drop procedure get; ? 查看存儲過程創建語句: show create procedure get; ? select…into 可以完成單行記錄的賦值: create procedure getRecord(sid int) begin declare v_name varchar(20) default 'jason'; declare v_age int; declare v_sex bit; select name, age, sex into v_name, v_age, v_sex from temp where id = sid; select v_name, v_age, v_sex; end; call getRecord(1);? 函數?
函數類似于存儲過程,只是調用方式不同 例如:select max(age) from temp; ? 創建函數: create function addAge(age int) returns int return age + 5; ? 使用函數: select addAge(age) from temp; ? 刪除函數: drop function if exists addAge; drop function addAge; ? 顯示創建語法: show create function addAge;? 游標?
聲明游標:declare cur_Name cursor for select name from temp; 打開游標:open cur_Name; Fetch游標:fetch cur_Name into @temp; 關閉游標:close cur_Name; ? 示例: CREATE PROCEDURE cur_show() BEGIN DECLARE done INT DEFAULT 0; DECLARE v_id, v_age INT; DECLARE v_name varchar(20); DECLARE cur_temp CURSOR FOR SELECT id, name, age FROM temp; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN cur_temp; REPEAT FETCH cur_temp INTO v_id, v_name, v_age; IF NOT done THEN IF isnull(v_name) THEN update temp set name = concat('test-json', v_id) where id = v_id; ELSEIF isnull(v_age) THEN update temp set age = 22 where id = v_id; END IF; END IF; UNTIL done END REPEAT; CLOSE cur_temp; END? 觸發器?
觸發器分為insert、update、delete三種觸發器事件類型 還有after、before觸發時間 創建觸發器: create trigger trg_temp_ins before insert on temp for each row begin insert into temp_log values(NEW.id, NEW.name); end// ? 刪除觸發器: drop trigger trg_temp_ins總結
以上是生活随笔為你收集整理的MySQL 学习笔记 二的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 架构设计:生产者/消费者模式 第3页:队
- 下一篇: linux cmake编译源码,linu