一.入門基礎html
1.鏈接MYSQL:前端
格式: mysql -h主機地址 -u用戶名 -p用戶密碼
1.一、例1:鏈接到本機上的MYSQL。
首先在打開DOS窗口,而後進入目錄 mysqlbin,再鍵入命令mysql -uroot -p,回車後提示你輸密碼,若是剛安裝好MYSQL,超級用戶root是沒有密碼的,故直接回車便可進入到MYSQL中了,MYSQL的提示符是:mysql>
1.二、例2:鏈接到遠程主機上的MYSQL。假設遠程主機的IP爲:110.110.110.110,用戶名爲root,密碼爲abcd123。則鍵入如下命令:
mysql -h110.110.110.110 -uroot -pabcd123
(注:u與root能夠不用加空格,其它也同樣)
1.三、退出MYSQL命令: exit (回車)mysql
2.修改密碼web
格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼
2.一、例1:給root加個密碼ab12。首先在DOS下進入目錄mysqlbin,而後鍵入如下命令
mysqladmin -uroot -password ab12
注:由於開始時root沒有密碼,因此-p舊密碼一項就能夠省略了。
2.二、例2:再將root的密碼改成djg345。
mysqladmin -uroot -pab12 password djg345redis
3.增長新用戶sql
格式:grant select on 數據庫.* to 用戶名@登陸主機 identified by "密碼"數據庫
3.1 例一、增長一個用戶test1密碼爲abc,讓他能夠在任何主機上登陸,並對全部數據庫有查詢、插入、修改、刪除的權限。首先用以root用戶連入MYSQL,而後鍵入如下命令:
grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";
3.2 例1增長的用戶是十分危險的,你想如某我的知道test1的密碼,那麼他就能夠在internet上的任何一臺電腦上登陸你的mysql數據庫並對你的數據能夠隨心所欲了,解決辦法:express
例二、增長一個用戶test2密碼爲abc,讓他只能夠在localhost上登陸,並能夠對數據庫mydb進行查詢、插入、修改、刪除的操做(localhost指本地主機,即MYSQL數據庫所在的那臺主機),這樣用戶即便用知道test2的密碼,他也沒法從internet上直接訪問數據庫,只能經過MYSQL主機上的web頁來訪問了。
grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";
若是你不想test2有密碼,能夠再打一個命令將密碼消掉。
grant select,insert,update,delete on mydb.* to test2@localhost identified by "";編程
4.查閱版本
後端
1 mysql> select version(),current_date(); 2 +----------------+-----------------+
3 | version() | current_date() |
4 +----------------+-----------------+
5 | 3.23.25a-debug | 2001-05-17 |
6 +----------------+-----------------+
7 1 row in set (0.01 sec) 8 mysql>
此命令要求mysql服務器告訴你它的版本號和當前日期。嘗試用不一樣大小寫操做上述命令,看結果如何。
結果說明mysql命令的大小寫結果是一致的。
練習以下操做:
1 mysql>Select (20+5)*4; 2 mysql>Select (20+5)*4,sin(pi()/3); 3 mysql>Select (20+5)*4 AS Result,sin(pi()/3); (AS: 指定假名爲Result)
5.一條命令能夠分紅多行輸入,直到出現分號「;」爲止:
1 mysql> select
2 -> USER() 3 -> , 4 -> now() 5 ->; 6 +--------------------+---------------------+
7 | USER() | now() |
8 +--------------------+---------------------+
9 | ODBC@localhost | 2001-05-17 2215 |
10 +--------------------+---------------------+
11 1 row in set (0.06 sec) 12 mysql>
13 注意中間的逗號和最後的分號的使用方法。
6.一行多條命令
1 輸入以下命令: 2 mysql> Select USER(); Select NOW(); 3 +------------------+
4 | USER() |
5 +------------------+
6 | ODBC@localhost |
7 +------------------+
8 1 row in set (0.00 sec) 9
10 +---------------------+
11 | NOW() |
12 +---------------------+
13 | 2001-05-17 23:06:15 |
14 +---------------------+
15 1 row in set (0.00 sec) 16 mysql>
17 注意中間的分號,命令之間用分號隔開。
7.顯示當前存在的數據庫
使用SHOW語句找出在服務器上當前存在什麼數據庫:
1 mysql> show databases; 2 +----------+
3 | Database |
4 +----------+
5 | mysql|
6 | test |
7 +----------+
8 2 row in set (0.06 sec) 9 mysql>
7.選擇數據庫並顯示當前選擇的數據庫
1 mysql> USE mysql 2 Database changed 3 mysql>
4 (USE 和 QUIT 命令不須要分號結束。) 5 mysql> select database(); 6 +---------------+
7 | database()|
8 +---------------+
9 | mysql |
10 +---------------+
11 1 row in set (0.00 sec)
8.顯示當前數據庫中存在的表
1 mysql> SHOW TABLES;
9.顯示錶(db)的內容
1 mysql>select * from db;
10.命令的取消
當命令輸入錯誤而又沒法改變(多行語句情形)時,只要在分號出現前就能夠用 c來取消該條命令
1 mysql> select
2 -> user() 3 -> c 4 mysql>
11.建立一個數據庫abccs
1 mysql> Create DATABASE abccs; 2 注意不一樣操做系統對大小寫的敏感。
12.顯示錶的結構:
1 mysql> DESCRIBE mytable; 2 +-------------+-------------+------+-----+---------+-------+
3 | Field | Type| Null | Key | Default | Extra |
4 +-------------+-------------+------+-----+---------+-------+
5 | name| varchar(20) | YES | | NULL| |
6 | sex | char(1) | YES | | NULL| |
7 | birth | date| YES | | NULL| |
8 | deathaddr | varchar(20) | YES | | NULL| |
9 +-------------+-------------+------+-----+---------+-------+
10 4 rows in set (0.00 sec)
二 .基本操做
1.建立,刪除和最基本查詢:
1 顯示數據庫 mysql->show databases; 2 建立數據庫 mysql->create database db; 3 刪除數據庫 mysql->drop database db; 4 選擇數據庫 mysql->use db; 此時你已經進入你剛纔所創建的數據庫db 5 建立表 mysql->create table mytable(name varchar(20),sex(char(1),birth date); 6 刪除表 mysql->drop table mytable; 7 顯示錶的內容 mysql->show tables; 8 顯示錶的結構 mysql->describe mytable;
2.對列的操做
1 在一個表中增長一條字段 mysql->alter table yourtable add name varchar(20)not null; 2 刪除一個字段 mysql->alter table yourtable drop name ;
3.選擇特定列
假如你想查看錶中的全部人的姓名,則能夠這樣操做:
mysql> Select name FROM mytable;
+----------+
| name |
+----------+
| abccs |
| mary |
| tom |
+----------+
3 row in set (0.00 sec)
若是想列出姓名和性別兩列,則能夠用逗號將關鍵詞name和birth分開:
myaql> select name,birth from mytable;
3.對行的操做
1 插入一條記錄 mysql->insert into mytable values('summer','m','1983-08-24'); 2 刪除一條記錄 mysql->delete from mytable where name='summer'; 3 修改一條記錄 mysql->update mytable set sex='vm' where name='summer'; 4 插入多條記錄 mysql->insert into mytable select *from yourtable;( 這種形式的INSERT 語句中,新行的數據值不是在語句正文中明確地指定的.而是語句中指定的一個數據庫查詢. 該查詢的邏輯限制: »查詢不能含有ORDER BY子句. »查詢結果應含有與INSERT語句中列數目相同的列,且數據類型必須逐列兼容. )
4.在查詢結果中顯示列名
1 用as關鍵字:select name as '姓名' from students order by age 2 直接表示:select name '姓名' from students order by age
5.精確查找
1 用in限定範圍:select * from students where native in ('湖南', '四川') 2 用between...and:select * from students where age between 20 and 30
3 用 比較測試符:(包括=,<>,<,<=,>,>=)select * from students where name = '李山'
4 用like:select * from students where name like '李%' (注意查詢條件中有「%」,則說明是部分匹配,並且還有前後信息在裏面,即查找以「李」開頭的匹配項。因此若查詢有「李」的全部對象,應該命令:'% 李%';如果第二個字爲李,則應爲'_李%'或'_李'或'_李_'。) 5 用[]匹配檢查符:select * from courses where cno like '[AC]%' (表示或的關係,與"in(...)"相似,並且"[]"能夠表示範圍,如:select * from courses where cno like '[A-C]%')注:關於這個字符我在mysql裏用的時候mysql把它當兩個普通自符處理的。 6 [^]stockname like '[^F-M]%' --------- (^排除指定範圍)
6.
1 count()求總數,如:select count(*) from students (求學生總人數) 2 avg(列)求平均,如:select avg(mark) from grades where cno=’B2’ 3 max(列)和min(列),求最大與最小
7.用文本方式將數據裝入一個數據庫表
若是一條一條地輸入,很麻煩。咱們能夠用文本文件的方式將全部記錄加入你的數據庫表中。
建立一個文本文件「mysql.txt」,每行包含一個記錄,用定位符(tab)把值分開,而且以在
Create TABLE語句中列出的列次序給出,例如:
abccs f 1977-07-07 china
mary f 1978-12-12 usa
tom m 1970-09-02 usa
使用下面命令將文本文件「mytable.txt」裝載到mytable表中:
1 mysql> LOAD DATA LOCAL INFILE "mytable.txt" INTO TABLE pet;
再使用以下命令看看是否已將數據輸入到數據庫表中:
1 mysql> select * from mytable;
8.對行進行排序
1 咱們能夠對錶中的記錄按生日大小進行排序: 2 mysql> Select name, birth FROM mytable orDER BY birth; 3 +----------+------------+
4 | name | birth |
5 +----------+------------+
6 | tom | 1973-09-02 |
7 | abccs| 1977-07-07 |
8 | mary | 1978-12-12 |
9 +----------+------------+
10 3 row in set (0.00 sec) 11
12 咱們能夠用DESC來進行逆序排序: 13 mysql> Select name, birth FROM mytable orDER BY birth DESC; 14 +----------+------------+
15 | name | birth |
16 +----------+------------+
17 | mary | 1978-12-12 |
18 | abccs| 1977-07-07 |
19 | tom | 1973-09-02 |
20 +----------+------------+
21 3 row in set (0.00 sec)
9.行計數
1 數據庫常常要統計一些數據,如表中員工的數目,咱們就要用到行計數函數COUNT()。 2 COUNT()函數用於對非NULL結果的記錄進行計數: 3 mysql> Select COUNT(*) FROM mytable; 4 +----------+
5 | COUNT(*) |
6 +----------+
7 |3 |
8 +----------+
9 1 row in set (0.06 sec) 10
11 員工中男女數量: 12 mysql> Select sex, COUNT(*) FROM mytable GROUP BY sex; 13 +------+----------+
14 | sex | COUNT(*) |
15 +------+----------+
16 | f|2 |
17 | m|1 |
18 +------+----------+
19 2 row in set (0.00 sec) 20
21 注意咱們使用了GROUP BY對SEX進行了分組。
10.多表查詢
1 假如咱們有兩個表: mytable 和 title。利用這兩個表咱們能夠進行組合查詢: 2 例如咱們要查詢做者abccs的姓名、性別、文章: 3 mysql> Select name,sex,title FROM mytable,title 4 -> Where name=writer AND name='abccs'; 5 +-------+------+-------+
6 | name | sex | title |
7 +-------+------+-------+
8 | abccs | f| a1|
9 | abccs | f| a2|
10 +-------+------+-------+
11
12 上面例子中,因爲做者姓名、性別、文章記錄在兩個不一樣表內,所以必須使用組合來進行查詢。必需要指定一個表中的記錄如何與其它表中的記錄進行匹配。 13 注意:若是第二個表title中的writer列也取名爲name(與mytable表中的name列相同)而不是writer時,就必須用mytable.name和title.name表示,以示區別。 14
15 再舉一個例子,用於查詢文章a2的做者、出生地和出生日期: 16 mysql> select title,writer,birthaddr,birth from mytable,title 17 -> where mytable.name=title.writer and title='a2'; 18 +-------+--------+-----------+------------+
19 | title | writer | birthaddr | birth |
20 +-------+--------+-----------+------------+
21 | a2| abccs | china | 1977-07-07 |
22 +-------+--------+-----------+------------+
11.數據庫的備份:
退回到DOS:
1 mysql> quit 2 d:mysqlbin 3 使用以下命令對數據庫abccs進行備份: 4 mysqldump --opt abccs>abccs.dbb
5 abccs.dbb就是你的數據庫abccs的備份文件。
12.用批處理方式使用MySQL:
1 首先創建一個批處理文件mytest.sql,內容以下: 2 use abccs; 3 select * from mytable; 4 select name,sex from mytable where name='abccs'; 5
6 在DOS下運行以下命令: 7 d:mysqlbin mysql < mytest.sql 8 在屏幕上會顯示執行結果。 9
10 若是想看結果,而輸出結果不少,則能夠用這樣的命令: 11 mysql < mytest.sql | more 12
13 咱們還能夠將結果輸出到一個文件中: 14 mysql < mytest.sql > mytest.out
三. Mysql存儲過程
咱們經常使用的操做數據庫語言SQL語句在執行的時候須要要先編譯,而後執行,而存儲過程(Stored Procedure)是一組爲了完成特定功能的SQL語句集,經編譯後存儲在數據庫中,用戶經過指定存儲過程的名字並給定參數(若是該存儲過程帶有參數)來調用執行它。
一個存儲過程是一個可編程的函數,它在數據庫中建立並保存。它能夠有SQL語句和一些特殊的控制結構組成。當但願在不一樣的應用程序或平臺上執行相同的函數,或者封裝特定功能時,存儲過程是很是有用的。數據庫中的存儲過程能夠看作是對編程中面向對象方法的模擬。它容許控制數據的訪問方式。
1.MySQL存儲過程的建立
MySQL存儲過程建立的格式:CREATE PROCEDURE 過程名 ([過程參數[,...]]) [特性 ...] 過程體
如:
1 mysql> DELIMITER //
2 mysql> CREATE PROCEDURE proc1(OUT s int) 3 -> BEGIN
4 -> SELECT COUNT(*) INTO s FROM user; 5 -> END
6 -> //
7 mysql> DELIMITER ;
注:
(1)這裏須要注意的是DELIMITER //和DELIMITER ;兩句,DELIMITER是分割符的意思,由於MySQL默認以";"爲分隔符,若是咱們沒有聲明分割符,那麼編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,因此要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL纔會將";"當作存儲過程當中的代碼,不會執行這些代碼,用完了以後要把分隔符還原。
(2)存儲過程根據須要可能會有輸入、輸出、輸入輸出參數,這裏有一個輸出參數s,類型是int型,若是有多個參數用","分割開。
(3)過程體的開始與結束使用BEGIN與END進行標識。
這樣,咱們的一個MySQL存儲過程就完成了,是否是很容易呢?看不懂也不要緊,接下來,咱們詳細的講解。
2.
參數
MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT,形式如:
CREATE PROCEDURE([[IN |OUT |INOUT ] 參數名 數據類形...])
IN 輸入參數:表示該參數的值必須在調用存儲過程時指定,在存儲過程當中修改該參數的值不能被返回,爲默認值
OUT 輸出參數:該值可在存儲過程內部被改變,並可返回
INOUT 輸入輸出參數:調用時指定,而且可被改變和返回
1 Ⅰ. IN參數例子 2 建立: 3 mysql > DELIMITER //
4 mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int) 5 -> BEGIN
6 -> SELECT p_in; 7 -> SET p_in=2; 8 -> SELECT p_in; 9 -> END; 10 -> //
11 mysql > DELIMITER ; 12
13 執行結果: 14 mysql > SET @p_in=1; 15 mysql > CALL demo_in_parameter(@p_in); 16 +------+
17 | p_in |
18 +------+
19 | 1 |
20 +------+
21
22 +------+
23 | p_in |
24 +------+
25 | 2 |
26 +------+
27
28 mysql> SELECT @p_in; 29 +-------+
30 | @p_in |
31 +-------+
32 | 1 |
33 +-------+
34
35 以上能夠看出,p_in雖然在存儲過程當中被修改,但並不影響@p_id的值
36
37 Ⅱ.OUT參數例子 38 建立: 39 mysql > DELIMITER //
40 mysql > CREATE PROCEDURE demo_out_parameter(OUT p_out int) 41 -> BEGIN
42 -> SELECT p_out; 43 -> SET p_out=2; 44 -> SELECT p_out; 45 -> END; 46 -> //
47 mysql > DELIMITER ; 48
49 執行結果: 50 mysql > SET @p_out=1; 51 mysql > CALL sp_demo_out_parameter(@p_out); 52 +-------+
53 | p_out |
54 +-------+
55 | NULL |
56 +-------+
57
58 +-------+
59 | p_out |
60 +-------+
61 | 2 |
62 +-------+
63
64 mysql> SELECT @p_out; 65 +-------+
66 | p_out |
67 +-------+
68 | 2 |
69 +-------+
70
71 Ⅲ. INOUT參數例子 72 建立: 73 mysql > DELIMITER //
74 mysql > CREATE PROCEDURE demo_inout_parameter(INOUT p_inout int) 75 -> BEGIN
76 -> SELECT p_inout; 77 -> SET p_inout=2; 78 -> SELECT p_inout; 79 -> END; 80 -> //
81 mysql > DELIMITER ; 82
83
84 執行結果: 85 mysql > SET @p_inout=1; 86 mysql > CALL demo_inout_parameter(@p_inout) ; 87 +---------+
88 | p_inout |
89 +---------+
90 | 1 |
91 +---------+
92
93 +---------+
94 | p_inout |
95 +---------+
96 | 2 |
97 +---------+
98
99 mysql > SELECT @p_inout; 100 +----------+
101 | @p_inout |
102 +----------+
103 | 2 |
104 +----------+
2.變量
1 Ⅰ. 變量定義 2 DECLARE variable_name [,variable_name...] datatype [DEFAULT value]; 3 其中,datatype爲MySQL的數據類型,如:int, float, date, varchar(length) 4 例如: 5 DECLARE l_int int unsigned default 4000000; 6 DECLARE l_numeric number(8,2) DEFAULT 9.95; 7 DECLARE l_date date DEFAULT '1999-12-31'; 8 DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59'; 9 DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded'; 10
11
12 Ⅱ. 變量賦值 13 SET 變量名 = 表達式值 [,variable_name = expression ...]
14
15 Ⅲ. 用戶變量 16
17 ⅰ. 在MySQL客戶端使用用戶變量 18 mysql > SELECT 'Hello World' into @x; 19 mysql > SELECT @x; 20 +-------------+
21 | @x |
22 +-------------+
23 | Hello World |
24 +-------------+
25 mysql > SET @y='Goodbye Cruel World'; 26 mysql > SELECT @y; 27 +---------------------+
28 | @y |
29 +---------------------+
30 | Goodbye Cruel World |
31 +---------------------+
32
33 mysql > SET @z=1+2+3; 34 mysql > SELECT @z; 35 +------+
36 | @z |
37 +------+
38 | 6 |
39 +------+
40 ⅱ. 在存儲過程當中使用用戶變量 41 mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World'); 42 mysql > SET @greeting='Hello'; 43 mysql > CALL GreetWorld( ); 44 +----------------------------+
45 | CONCAT(@greeting,' World') |
46 +----------------------------+
47 | Hello World |
48 +----------------------------+
49
50 ⅲ. 在存儲過程間傳遞全局範圍的用戶變量 51 mysql> CREATE PROCEDURE p1() SET @last_procedure='p1'; 52 mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_proc); 53 mysql> CALL p1( ); 54 mysql> CALL p2( ); 55 +-----------------------------------------------+
56 | CONCAT('Last procedure was ',@last_proc |
57 +-----------------------------------------------+
58 | Last procedure was p1 |
59 +-----------------------------------------------+
60
61
62 注意: 63 ①用戶變量名通常以@開頭
64 ②濫用用戶變量會致使程序難以理解及管理
3.註釋
MySQL存儲過程可以使用兩種風格的註釋
雙模槓:--
該風格通常用於單行註釋
c風格: 通常用於多行註釋
例如:
1 mysql > DELIMITER //
2 mysql > CREATE PROCEDURE proc1 --name存儲過程名
3 -> (IN parameter1 INTEGER) 4 -> BEGIN
5 -> DECLARE variable1 CHAR(10); 6 -> IF parameter1 = 17 THEN
7 -> SET variable1 = 'birds'; 8 -> ELSE
9 -> SET variable1 = 'beasts'; 10 -> END IF; 11 -> INSERT INTO table1 VALUES (variable1); 12 -> END
13 -> //
14 mysql > DELIMITER ; 15
4.
MySQL存儲過程的調用
用call和你過程名以及一個括號,括號裏面根據須要,加入參數,參數包括輸入參數、輸出參數、輸入輸出參數。具體的調用方法能夠參看上面的例子。
5.
MySQL存儲過程的查詢
咱們像知道一個數據庫下面有那些表,咱們通常採用show tables;進行查看。那麼咱們要查看某個數據庫下面的存儲過程,是否也能夠採用呢?答案是,咱們能夠查看某個數據庫下面的存儲過程,可是是令一鍾方式。
咱們能夠用
select name from mysql.proc where db=’數據庫名’;
或者
select routine_name from information_schema.routines where routine_schema='數據庫名';
或者
show procedure status where db='數據庫名';
進行查詢。
若是咱們想知道,某個存儲過程的詳細,那咱們又該怎麼作呢?是否是也能夠像操做表同樣用describe 表名進行查看呢?
答案是:咱們能夠查看存儲過程的詳細,可是須要用另外一種方法:
SHOW CREATE PROCEDURE 數據庫.存儲過程名;
就能夠查看當前存儲過程的詳細。
6.
MySQL存儲過程的修改
ALTER PROCEDURE
更改用CREATE PROCEDURE 創建的預先指定的存儲過程,其不會影響相關存儲過程或存儲功能。
7. MySQL存儲過程的刪除
刪除一個存儲過程比較簡單,和刪除表同樣:
DROP PROCEDURE
從MySQL的表格中刪除一個或多個存儲過程。
8. MySQL存儲過程的控制語句
1 (1). 變量做用域 2 內部的變量在其做用域範圍內享有更高的優先權,當執行到end。變量時,內部變量消失,此時已經在其做用域外,變量再也不可見了,應爲在存儲 3 過程外不再能找到這個申明的變量,可是你能夠經過out參數或者將其值指派 4 給會話變量來保存其值。 5
6
7 mysql > DELIMITER //
8 mysql > CREATE PROCEDURE proc3() 9 -> begin
10 -> declare x1 varchar(5) default 'outer'; 11 -> begin
12 -> declare x1 varchar(5) default 'inner'; 13 -> select x1; 14 -> end; 15 -> select x1; 16 -> end; 17 -> //
18 mysql > DELIMITER ; 19
20 (2). 條件語句 21 Ⅰ. if-then -else語句 22
23
24
25 mysql > DELIMITER //
26 mysql > CREATE PROCEDURE proc2(IN parameter int) 27 -> begin
28 -> declare var int; 29 -> set var=parameter+1; 30 -> if var=0 then
31 -> insert into t values(17); 32 -> end if; 33 -> if parameter=0 then
34 -> update t set s1=s1+1; 35 -> else
36 -> update t set s1=s1+2; 37 -> end if; 38 -> end; 39 -> //
40 mysql > DELIMITER ; 41
42 Ⅱ. case語句: 43 mysql > DELIMITER //
44 mysql > CREATE PROCEDURE proc3 (in parameter int) 45 -> begin
46 -> declare var int; 47 -> set var=parameter+1; 48 -> case var
49 -> when 0 then
50 -> insert into t values(17); 51 -> when 1 then
52 -> insert into t values(18); 53 -> else
54 -> insert into t values(19); 55 -> end case; 56 -> end; 57 -> //
58 mysql > DELIMITER ; 59
60 (3). 循環語句 61 Ⅰ. while ···· end while: 62 mysql > DELIMITER //
63 mysql > CREATE PROCEDURE proc4() 64 -> begin
65 -> declare var int; 66 -> set var=0; 67 -> while var<6 do 68 -> insert into t values(var); 69 -> set var=var+1; 70 -> end while; 71 -> end; 72 -> //
73 mysql > DELIMITER ; 74
75
76 Ⅱ. repeat···· end repeat: 77 它在執行操做後檢查結果,而while則是執行前進行檢查。 78 mysql > DELIMITER //
79 mysql > CREATE PROCEDURE proc5 () 80 -> begin
81 -> declare v int; 82 -> set v=0; 83 -> repeat 84 -> insert into t values(v); 85 -> set v=v+1; 86 -> until v>=5
87 -> end repeat; 88 -> end; 89 -> //
90 mysql > DELIMITER ; 91
92
93 Ⅲ. loop ·····end loop: 94 loop循環不須要初始條件,這點和while 循環類似,同時和repeat循環同樣不須要結束條件, leave語句的意義是離開循環。 95 mysql > DELIMITER //
96 mysql > CREATE PROCEDURE proc6 () 97 -> begin
98 -> declare v int; 99 -> set v=0; 100 -> LOOP_LABLE:loop 101 -> insert into t values(v); 102 -> set v=v+1; 103 -> if v >=5 then
104 -> leave LOOP_LABLE; 105 -> end if; 106 -> end loop; 107 -> end; 108 -> //
109 mysql > DELIMITER ; 110
111
112 Ⅳ. LABLES 標號: 113 標號能夠用在begin repeat while 或者loop 語句前,語句標號只能在合法的語句前面使用。能夠跳出循環,使運行指令達到複合語句的最後一步。 114
115 (4). ITERATE迭代 116 Ⅰ. ITERATE: 117 經過引用複合語句的標號,來重新開始複合語句 118 mysql > DELIMITER //
119 mysql > CREATE PROCEDURE proc10 () 120 -> begin
121 -> declare v int; 122 -> set v=0; 123 -> LOOP_LABLE:loop 124 -> if v=3 then
125 -> set v=v+1; 126 -> ITERATE LOOP_LABLE; 127 -> end if; 128 -> insert into t values(v); 129 -> set v=v+1; 130 -> if v>=5 then
131 -> leave LOOP_LABLE; 132 -> end if; 133 -> end loop; 134 -> end; 135 -> //
136 mysql > DELIMITER ; 137
9.MySQL存儲過程的基本函數
1 (1).字符串類 2 CHARSET(str) //返回字串字符集 3 CONCAT (string2 [,... ]) //鏈接字串 4 INSTR (string ,substring ) //返回substring首次在string中出現的位置,不存在返回0 5 LCASE (string2 ) //轉換成小寫 6 LEFT (string2 ,length ) //從string2中的左邊起取length個字符 7 LENGTH (string ) //string長度 8 LOAD_FILE (file_name ) //從文件讀取內容 9 LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定開始位置 10 LPAD (string2 ,length ,pad ) //重複用pad加在string開頭,直到字串長度爲length 11 LTRIM (string2 ) //去除前端空格 12 REPEAT (string2 ,count ) //重複count次 13 REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替換search_str 14 RPAD (string2 ,length ,pad) //在str後用pad補充,直到長度爲length 15 RTRIM (string2 ) //去除後端空格 16 STRCMP (string1 ,string2 ) //逐字符比較兩字串大小, 17 SUBSTRING (str , position [,length ]) //從str的position開始,取length個字符, 18 注:mysql中處理字符串時,默認第一個字符下標爲1,即參數position必須大於等於1 19
20 mysql> select substring('abcd',0,2); 21 +-----------------------+
22 | substring('abcd',0,2) |
23 +-----------------------+
24 | |
25 +-----------------------+
26 1 row in set (0.00 sec) 27
28 mysql> select substring('abcd',1,2); 29 +-----------------------+
30 | substring('abcd',1,2) |
31 +-----------------------+
32 | ab |
33 +-----------------------+
34 1 row in set (0.02 sec) 35 TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符 36 UCASE (string2 ) //轉換成大寫 37 RIGHT(string2,length) //取string2最後length個字符 38 SPACE(count) //生成count個空格 39 (2).數學類 40 ABS (number2 ) //絕對值 41 BIN (decimal_number ) //十進制轉二進制 42 CEILING (number2 ) //向上取整 43 CONV(number2,from_base,to_base) //進制轉換 44 FLOOR (number2 ) //向下取整 45 FORMAT (number,decimal_places ) //保留小數位數 46 HEX (DecimalNumber ) //轉十六進制 47 注:HEX()中可傳入字符串,則返回其ASC-11碼,如HEX('DEF')返回4142143 48 也能夠傳入十進制整數,返回其十六進制編碼,如HEX(25)返回19 49 LEAST (number , number2 [,..]) //求最小值 50 MOD (numerator ,denominator ) //求餘 51 POWER (number ,power ) //求指數 52 RAND([seed]) //隨機數 53 ROUND (number [,decimals ]) //四捨五入,decimals爲小數位數] 54 注:返回類型並不是均爲整數,如: 55 (1)默認變爲整形值 56 mysql> select round(1.23); 57 +-------------+
58 | round(1.23) |
59 +-------------+
60 | 1 |
61 +-------------+
62 1 row in set (0.00 sec) 63
64 mysql> select round(1.56); 65 +-------------+
66 | round(1.56) |
67 +-------------+
68 | 2 |
69 +-------------+
70 1 row in set (0.00 sec) 71
72
73 (2)能夠設定小數位數,返回浮點型數據 74 mysql> select round(1.567,2); 75 +----------------+
76 | round(1.567,2) |
77 +----------------+
78 | 1.57 |
79 +----------------+
80 1 row in set (0.00 sec) 81 SIGN (number2 ) //
82
83 (3).日期時間類 84 ADDTIME (date2 ,time_interval ) //將time_interval加到date2 85 CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //轉換時區 86 CURRENT_DATE ( ) //當前日期 87 CURRENT_TIME ( ) //當前時間 88 CURRENT_TIMESTAMP ( ) //當前時間戳 89 DATE (datetime ) //返回datetime的日期部分 90 DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或時間 91 DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式顯示datetime 92 DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上減去一個時間 93 DATEDIFF (date1 ,date2 ) //兩個日期差 94 DAY (date ) //返回日期的天 95 DAYNAME (date ) //英文星期 96 DAYOFWEEK (date ) //星期(1-7) ,1爲星期天 97 DAYOFYEAR (date ) //一年中的第幾天 98 EXTRACT (interval_name FROM date ) //從date中提取日期的指定部分 99 MAKEDATE (year ,day ) //給出年及年中的第幾天,生成日期串 100 MAKETIME (hour ,minute ,second ) //生成時間串 101 MONTHNAME (date ) //英文月份名 102 NOW ( ) //當前時間 103 SEC_TO_TIME (seconds ) //秒數轉成時間 104 STR_TO_DATE (string ,format ) //字串轉成時間,以format格式顯示 105 TIMEDIFF (datetime1 ,datetime2 ) //兩個時間差 106 TIME_TO_SEC (time ) //時間轉秒數] 107 WEEK (date_time [,start_of_week ]) //第幾周 108 YEAR (datetime ) //年份 109 DAYOFMONTH(datetime) //月的第幾天 110 HOUR(datetime) //小時 111 LAST_DAY(date) //date的月的最後日期 112 MICROSECOND(datetime) //微秒 113 MONTH(datetime) //月 114 MINUTE(datetime) //分返回符號,正負或0 115 SQRT(number2) //開平方
四.mysql索引
1 mysql> select column_name,data_type 2 -> from information_schema.columns 3 -> where table_name = 'student'; 4 +-------------+-----------+
5 | column_name | data_type |
6 +-------------+-----------+
7 | stu_id | int |
8 | stu_name | varchar |
9 | stu_tel | int |
10 | stu_score | int |
11 +-------------+-----------+
12 4 rows in set (0.01 sec)
表中原始數據:
1 mysql> select * from student; 2 +--------+----------+---------+-----------+
3 | stu_id | stu_name | stu_tel | stu_score |
4 +--------+----------+---------+-----------+
5 | 1 | a | 151 | 60 |
6 | 2 | b | 152 | 61 |
7 | 3 | c | 153 | 62 |
8 | 4 | d | 154 | 63 |
9 +--------+----------+---------+-----------+
10 4 rows in set (0.00 sec)
1 create [ <index type> ] index <index name> [ using {btree | hash} ] on table specification ( <column in index> [,<column in index> ] ) <index type> := unique | fulltext | spatial <column in index>:=<column name> [asc | desc]
建立一個最簡單的索引:
這裏建立立一個非惟一性的索引,其中默認使用asc升序排列。
若是沒有指定using聲明的話,mysql自動建立一個B樹。
1 mysql> create index stu_index 2 -> on student(stu_id); 3 Query OK, 0 rows affected (0.36 sec) 4 Records: 0 Duplicates: 0 Warnings: 0
因此上面的索引實際上是這樣子的:
1 mysql> create index stu_index using btree 2 -> on student(stu_id asc); 3 Query OK, 0 rows affected (0.19 sec) 4 Records: 0 Duplicates: 0 Warnings: 0
固然,btree索引能夠換成哈希索引。
1 mysql> create unique index stu_index using hash 2 -> on student(stu_id,stu_name); 3 Query OK, 0 rows affected (0.19 sec) 4 Records: 0 Duplicates: 0 Warnings: 0
添加索引:
1 mysql> alter table student 2 -> add unique index stu_index2 3 -> using hash (stu_tel); 4 Query OK, 0 rows affected (0.36 sec) 5 Records: 0 Duplicates: 0 Warnings: 0
刪除索引:
1 mysql> drop index stu_index on student; 2 Query OK, 0 rows affected (0.22 sec) 3 Records: 0 Duplicates: 0 Warnings: 0
建立表時定義索引:
1 mysql> create table student( 2 -> stu_id int primary key, 3 -> stu_name varchar(5) not null, 4 -> stu_tel int(5) unique, 5 -> stu_score int(2), 6 -> index stu_index(stu_id) 7 -> );
五 .Mysql視圖
建立視圖:
1 create [ or replace ] view <view name> [<column list>] as <table expression> [with [ cascaded |local ] check option ] 2 mysql> create view view1 as
3 -> (select * from student); 4 Query OK, 0 rows affected (0.16 sec)
1 mysql> select * from view1; 2 +--------+----------+---------+-----------+
3 | stu_id | stu_name | stu_tel | stu_score |
4 +--------+----------+---------+-----------+
5 | 1 | a | 151 | 60 |
6 | 2 | b | 152 | 61 |
7 | 3 | c | 153 | 62 |
8 | 4 | d | 154 | 63 |
9 +--------+----------+---------+-----------+
10 4 rows in set (0.00 sec)
建視圖時,若是視圖已存在,可用replace從新覆蓋建立。建立視圖時還能夠更改原始列名
1 mysql> create or replace view view1(id,name,tel,score) as
2 -> (select * from student); 3 Query OK, 0 rows affected (0.03 sec) 4
5 mysql> select * from view1; 6 +----+------+------+-------+
7 | id | name | tel | score |
8 +----+------+------+-------+
9 | 1 | a | 151 | 60 |
10 | 2 | b | 152 | 61 |
11 | 3 | c | 153 | 62 |
12 | 4 | d | 154 | 63 |
13 +----+------+------+-------+
14 4 rows in set (0.00 sec)
刪除視圖:
1 drop view view1;
學習參考:
http://blog.sina.com.cn/s/blog_603c27140100hqvh.html
http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html
http://www.2cto.com/database/201403/286731.html
http://laozhao.blog.51cto.com/blog/25213/7644