注:MySql 中的 sql 語句是以“;”爲結束點的,即只要遇到“;”時編譯器就認爲其上的所有語句就是一整句 sql 語句
但是結束標籤可以更改:mysql>delimiter //
基本常用語法:
1、mysql> select version(),current_date; =======》 獲得服務器的版本號和當前日期
2、mysql> show databases; ====》找出服務器上當前存在什麼數據庫:(mysql是必需的,因爲它描述用戶訪問權限,test數據庫經常作爲用戶試身手的工作區。)
3、mysql> select distinct name from student ======> 查詢所有的不重複的學員名字
4、mysql> create database MyBookShop ======》創建數據庫
5、mysql> show tables ======》顯示當前使用的數據庫中的表
6、mysql> describe student =====》顯示此表的列的信息,類似於SqlServer中設計表的模式
7、要想找出正好包含5個字符的名字,使用“_”模式字符:
mysql> SELECT * FROM pet WHERE name LIKE '^.....$';
mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$'; ====>可以使用“{n}”“重複n次”操作符重寫前面的查詢
8、mysql提供了些函數:
Year(date)、Month(date)、DayOfMonth(date)分別用來獲取時間的某個部分。返回 int 類型的數據
eg:Month(2010-06-08)=6;
9、Mod(5,2)=1 , Mod(4,2)=0 ====>取模函數
10、mysql> show variables like 'character_set_client'; ======>客戶端字符集
mysql> show variables like 'character_set_database'; =======》數據庫字符集
mysql> show variables like 'character_set_server'; =======》服務器字符集
11、
mysql> SELECT * FROM pet WHERE name regexp '^b'; =============>找出以“b”開頭的名字
mysql> SELECT * FROM pet WHERE name regexp 'fy$'; ===============>找出以“fy”結尾的名字
mysql> SELECT * FROM pet WHERE name regexp 'w'; ============>找出包含一個“w”的名字
mysql> select username form user where age>20 limit 3; =============>limit 限定一次最多顯示的行數,也就是說查詢出前三個年齡大於20的人的名字
12、利用自定義變量
1> mysql> set @age = 20; ======》必須直接對其賦值,且不用標定其類型
mysql> set @name = 'Issac';
mysql> select * from user where age = @age and name = @name;
2> mysql> select @age2:=avg(age) from user;
mysql> update user set age=@age2 where id=2;
13、mysql> select * from
-> \c ========》結束本次mysql語句的執行,進行下條語句
mysql>
14、特殊數值 null 的比較應用
mysql> select 0 is null, 0 is not null, '' is null, '' is not null;
+-----------+---------------+------------+----------------+
| 0 is null | 0 is not null | '' is null | '' is not null |
+-----------+---------------+------------+----------------+
| 0 | 1 | 0 | 1 |
+-----------+---------------+------------+----------------+
15、mysql> select sin(pi()/4),(4+1)*5; ========》mysql用作一個簡單的計算器:
+------------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+------------------+---------+
| 0.70710678118655 | 25 |
+------------------+---------+
1 row in set (0.02 sec)
16、創建表的時候直接添加主外鍵約束:
mysql> create table person(
-> id smallint unsigned not null auto_increment,
-> name char(60) not null,
-> primary key (id)
-> );
mysql> create table shirt(
-> id smallint unsigned not null auto_increment,
-> style enum('t-shirt','polo','dress') not null, ===》切注意此處:mysql是不支持check
-> color enum('red','blue','orange','white','black') not null,
-> owner smallint unsigned not null references person(id),
-> primary key (id)
-> );
事務:
一項事務是指由一條或多條對數據庫更新的sql語句所組成的一個不可分割的工作單元。只有當事務中的所有操作都正常完成了,整個事務才能被提交到數據庫,如果有一項操作沒有完成,就必須撤消整個事務。
mysql> start transaction;
mysql> select @a:=avg(age) from user;
mysql> update user set age=@a where name='Jim';
mysql> commit/rollback;
視圖
mysql> create view view_user as select name , age from user;
mysql> select * from view_user;
存儲過程:
在數據庫系統開發過程中,如果能夠應用存儲過程,可以使整個系統的運行效率有明顯的提高
MySQL中存儲過程的建立(MySQL的存儲過程名稱不區分大小寫)
create procedure + procName(參數列表)
存儲過程的參數一般由3部分組成。第一部分可以是in、out或inout。in表示向存儲過程中傳入參數;out表示向外傳出參數;inout表示定義的參數可傳入存儲過程,並可以被存儲過程修改後傳出存儲過程,存儲過程默認爲傳入參數,所以參數in可以省略。第二部分爲參數名。第三部分爲參數的類型,該類型爲MySQL數據庫中所有可用的字段類型,如果有多個參數,參數之間可以用逗號進行分割。
MySQL存儲過程的語句塊以begin開始,以end結束。語句體中可以包含變量的聲明、控制語句、SQL查詢語句等。由於存儲過程內部語句要以分號結束,所以在定義存儲過程前應將語句結束標誌“;”更改爲其他字符
mysql>delimiter //
存儲過程創建之後,可用如下語句進行刪除,參數proc_name指存儲過程名。
drop procedure proc_name
實現過程:
1)更改語句結束符號,本實例將語句結束符更改爲“//”。代碼如下:
delimiter //
2)創建存儲過程前應首先選擇某個數據庫。代碼如下:
use db_name
3)創建存儲過程。
如何創建傳入參數的存儲過程,實現代碼如下:
delimiter //
create procedure pro_reg (in @age int, in @name varchar(50))
begin
insert into user (age,name)
values (@age,@name);
end;
//
4)通過call語句調用存儲過程。
mysql> call pro_reg(3,'Tom');
5) 刪除已經存在的 procedure
drop procedure if exists pr_param_in;
觸發器:
觸發器在數據庫系統開發過程中具有非常重要的作用,例如可以防止有害數據錄入數據庫,可以改變或取消insert、update和delete語句的執行及在一個會話中監聽數據庫中的數據的改變。
如果用戶打算在數據庫中通過觸發器實現某一動作的監聽,那麼首先應該創建觸發器,觸發器是在“命令提示符”下創建的,
MySQL數據庫創建觸發器的格式如下:
create trigger <觸發器名稱> // 創建一個新觸發器,並指定觸發器的名稱 user_tri。
before | after // 用於指定在insert、update或delete語句執行前觸發還是在語句執行後觸發。
insert | update | delete on <表名> // 用於指定響應該觸發器的表名。
for each row // 觸發器的執行間隔,for each row 通知觸發器每隔一行執行一次動作,而不是對整個表執行一次。
<觸發器SQL語句> // 觸發器要執行的SQL語句,如果該觸發器要執行多條SQL語句,要將多條語句放在begin…end塊中。
實現過程
(1)修改結束字符
delimiter //
(2)創建觸發器,實現無論用戶向表 user 添加什麼數據都使字段 name 的內容爲“Issac”。
mysql> create trigger user_tri
-> before insert on user
-> for each row
-> set new.name='Issac'
-> //
(4)向表 user 添加一條記錄,並查看添加後的結果。
insert into user(name) values('aaaaa');//
select * from tb_test 此時發現插入的結果不是‘aaaa’而是‘Issac'。
在MySQL數據庫中,創建觸發器前應先查看數據庫中的觸發器,這樣既可以使開發人員對指定的數據庫中的所有觸發器及功能有一個直觀的把握,而且又可以避免創建同名或類似功能的觸發器。
查看MySQL數據庫中的觸發器詳細信息,可以通過如下語句實現:
show triggers
使用show triggers語句前應先指明要查看的數據庫。
刪除:drop trigger 觸發器名稱
eg:
mysql> create trigger test_tri
-> before insert
-> on test
-> for each row
-> update person set name='bbbb' where id=1;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from person;
+----+---------------------+
| id | name |
+----+---------------------+
| 1 | Jim |
| 3 | Tom |
| 4 | Issac |
| 5 | lilliana Angelovska |
+----+---------------------+
4 rows in set (0.00 sec)
mysql> insert into test(id,username,city,age)
-> values(1,'Jim','wh',23);
Query OK, 1 row affected (0.06 sec)
mysql> select * from person;
+----+---------------------+
| id | name |
+----+---------------------+
| 1 | bbbb |
| 3 | Tom |
| 4 | Issac |
| 5 | lilliana Angelovska |
+----+---------------------+
索引:
索引是快速搜索的關鍵。在數據庫表中,對字段建立索引可以大大提高查詢速度。MySQL索引的建立對於MySQL的高效運行是很重要的。
下面是幾種常見的MySQL索引類型。
創建了一個 user 表:
create table user(id int not null , username varchar(20) not null);
我們隨機向裏面插入了10000條記錄,其中有一條:5555, admin。
在查找username="admin"的記錄 select * from user where username='admin';時,如果在username上已經建立了索引,MySQL無須任何掃描,即準確可找到該記錄。相反,MySQL會掃描所有記錄,即要查詢10000條記錄。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。
一》創建普通索引的不同方法
(1)創建普通索引
語法:create index index_name on table (filed(length));
eg: create index index_user on user (username(length)); 如果是 char 和 varchar 類型,length可以小於字段實際長度;如果是 blod 和 text 類型,必須指定 length 下同。
(2) 修改表結構,即向已經創建好的表中添加索引
語法:alter tableName add index indexName on (filed(length));
eg: alter user add index index_user on (username(20));
(3) 創建表的時候直接指定
mysql> create table test(
-> id int not null,
-> username varchar(20) not null,
-> index ix_test(username(20))
-> );
(4) 刪除索引:
drop index indexName on table;
eg: drop index ix_test on test;
二》創建唯一索引的不同方法
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一
(1)創建索引
create unique index indexName on table(filed(length));
eg:create unique index ix_test on test(username(20));
(2)修改表結構,即向已經創建好的表中添加索引
alter table add unique indexName on (filed(length));
eg:alter test add unique ix_test on (username(20));
(3) 創建表的時候直接指定
mysql> create table test(
-> id int not null,
-> username varchar(20) not null,
-> unique ix_test(username(20))
-> );
三》創建主鍵索引
它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創建主鍵索引:
mysql> create table test(
-> id int not null,
-> username varchar(20) not null,
-> primary key(id)
-> );
當然也可以用 ALTER 命令。記住:一個表只能有一個主鍵。
四》創建組合索引
爲了形象地對比單列索引和組合索引,爲表添加多個字段:
mysql> create table test(
-> id int not null,
-> username varchar(20) not null,
-> city varchar(20) not null,
-> age int not null
-> );
爲了進一步提高MySQL的效率,就要考慮建立組合索引。就是將 name, city, age建到一個索引裏:
alter table test add index ix_name_city_age(name(10),city,age);
這裏指明的長度必須小於或等於其創表時設定的長度,這樣會加速索引查詢速度,還會減少索引文件的大小,提高INSERT的更新速度。
如果單獨分別在 usernname,city,age上建立單列索引,讓該表有3個單列索引,但查詢時並不比組合索引快,因爲mysql只會自動選擇其中效率最高的一個。
上面的組合索引就相當於創建了usernname,city,age usernname,city usernname 這三組組合索引
這裏沒有 city,age這樣的組合索引,是因爲MySQL組合索引“最左前綴”的結果。簡單的理解就是隻從最左面的開始組合。並不是只要包含這三列的查詢都會用到該組合索引。
下面的幾個SQL就會用到這個組合索引:
select * from test where username='admin' and city='武漢‘ ;
select * frm test where username='admin' ;
而下面幾個則不會用到:
select * from test where age=20 and city='武漢’ ;
select * from test where city='武漢‘
五》什麼時候創建索引最適合呢
一般來說,在 where 和 Join 中出現的列需要建立索引,但也不完全如此,因爲MySQL只對<,<=,=,>,>=,between,in ,以及某些時候的 like 纔會使用索引。例如:
eg:select user.username ,exam.score from user left join exam on user.id=exam.uId where user.username like 'Jim%’ and age<30;
此時就需要對 username 和 age 建立索引,由於 mytable 表的 userame 也出現在了JOIN子句中,也有對它建立索引的必要。
剛纔提到只有某些時候的LIKE才需建立索引。因爲在以通配符%和_開頭作查詢時,MySQL不會使用索引。
select * from test where username like 'admin%' ; 此句會使用索引
select * from test where username like '%admin'; 此句就不會使用因此
六》使用索引的注意事項
◆索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。所以我們在數據庫設計時不要讓字段的默認值爲NULL。
◆索引列排序
MySQL查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此數據庫默認排序可以符合要求的情況下不要使用排序操作;儘量不要包含多個列的排序,如果需要最好給這些列創建複合索引列
◆like語句操作
一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引。
◆不要在列上進行運算
select * from users where YEAR(adddate)<2007; 將在每個行上進行運算,這將導致索引失效而進行全表掃描,因此我們可以改成
select * from users where adddate<‘2007-01-01’;
◆不使用NOT IN和<>操作
以上,就對其中MySQL索引類型進行了介紹。