1、Mysql數據庫的操做命令mysql
一、登陸:mysql -h 服務器地址 -u 登陸名 -p 密碼sql
mysql -h 127.0.0.1 -u root -p root
二、數據庫備份:mysqldump -h 服務器地址 -p 數據庫名 > 文件名數據庫
三、數據恢復:mysql -h服務器地址 -u登陸名 -p 數據庫名 < 文件名編程
四、建立數據庫:create database 數據庫名稱 【charset 數據庫編碼】 【collate 排序規則】服務器
五、刪除數據庫:drop database 【 if exists 】 數據庫名稱 ide
六、修改數據庫:alter database 數據庫名稱 charset 新的編碼名 collate 新的排序規則名函數
七、顯示全部數據庫:show databases編碼
八、顯示數據庫建立語句:show create database 數據庫名稱spa
九、進入數據庫:use 數據庫名稱code
2、字段類型
3、表操做命令
auto_increment:自動增加
primary key:設置爲主鍵
unique key:設置惟一索引
not null:設置不爲空
default 某值:設置默認值
comment:設置字段說明
一、建立表:creat table 表名稱(字段名稱 類型 字段屬性) 【表選項】
create table a ( id int auto_increment primary key, username varchar(32) not null unique key, password varchar(32) not null comment '密碼', age tinyint default 18 )charset=utf8,engine=myisam;
二、索引
key(字段名)
就是一個索引而已,沒有其餘做用,只能加快查找速度
unique key(字段名)
是一個索引,並且還能夠設定其字段的值不能重複(惟一性)
primary key(字段名稱)
是一個索引,並且,還具備區分該表中的任何一行數據的做用(其實也是惟一性)它其實比惟一性索引多一點功能:惟一性能夠爲空null,而主鍵不能爲空;
fulltext(字段名)
foreign key (字段名) references 其餘表 (對應其餘表中的字段名)
create table a ( id int auto_increment, username varchar(32) not null, password varchar(32) not null comment '密碼', age tinyint default 18, primary key(id), --建立索引 unique key(username) )charset=utf8,engine=myisam;
三、修改表
添加字段:alter table 表名 add [column] 新字段名 字段類型 [字段屬性列表]
alter table a add date_entered datetime;
修改字段(並可更名):alter table 表名 change [column] 舊字段名 新字段名 新字段類型 [新字段屬性列表];
alter table a change date_entered addtime int;
刪除字段:alter table 表名 drop [column] 字段名;
alter table a drop addtime;
添加普通索引:alter table 表名 add key [索引名] (字段名1[,字段名2,...]);
alter table a add key date_entered (date_entered);
添加惟一索引(約束):alter table 表名 add unique key (字段名1[,字段名2,...]);
alter table a add unique key (username);
添加主鍵索引(約束):alter table 表名 add primary key (字段名1[,字段名2,...]);
alter table a add primary key (id);
修改表名:alter table 舊錶名 rename [to] 新表名;
alter table a rename b;
四、刪除表
drop table 【if exists】 表名;
其餘表的相關語句:
顯示當前數據庫中的全部表: show tables;
顯示某表的結構: desc 表名; 或:describe 表名;
顯示某表的建立語句:show create table 表名;
重命名錶:rename table 舊錶名 to 新表名;
從已有表複製表結構:create table [if not exists] 新表名 like 原表名;
4、定義視圖
一、語法:create view 視圖名 【(字段名1,字段名2,字段名3,....)】 as select語句;
create view view_b as select * from b where id > 10;
二、刪除視圖:drop view 【if exists】 視圖名;
drop view if exists view_b;
5、操做數據語句
一、插入數據:
insert [into] 表名 [(字段名1,字段名2,....)] values (值表達式1,值表達式2,....)
replace [into] 表名 [(字段名1,字段名2,....)] values (值表達式1,值表達式2,....)
其跟insert into幾乎同樣:惟一區別是,若是插入的數據的主鍵或惟一鍵「有重複」,則此時就會變成「修改該行數據」
insert into b (username, password, age) values ('yy', '123', 18);
二、修改數據:update 表名 set 字段1=值1,字段2=值2,...... 【where 條件】 【order by排序字段】 【limit 限定行數】;
update b set username = 'yang' where id = 1;
三、刪除數據:delete from 表名 【where 條件】 【order by排序字段】 【limit 限定行數】;
delete from b where id = 1;
四、查詢數據:select [all | distinct] 字段或表達式列表 [from子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句];
all 和 distinct用於設定select出來的數據,是否消除「重複行」,能夠不寫,那就是默認值all:
all:表示不消除,即全部都出來,默認值;
distinct:表示會消除;使用all(跟不使用結果是同樣的)
6、高級查詢
一、鏈接查詢
鏈接查詢分類:
一、內鏈接:select * from 表1 【inner】 join 表2 on 鏈接條件;
二、左鏈接:select * from 表1 left join 表2 on 鏈接條件;
三、右鏈接:select * from 表1 right join 表2 on 鏈接條件;
二、子查詢
select * from product where price = (select max(price) from product );
使用in的子查詢
select * from product where protype_id in( select protype_id from product_type where protype_name like ‘%電%’);
使用any的子查詢
select * from tab1 where id > any (select f1 from tab2);
使用all的子查詢
select * from tab2 where f1 > all ( select id from tab1 );
使用exists的查詢
select * from product where exists (select * from product_type where like '%電%' and protype_id = product.protype_id);
三、聯合查詢union
語法:
select 語句1
union 【all | distinct】
select 語句2
一、要求多條查詢語句的查詢列數是一致的!
二、要求多條查詢語句的查詢的每一列的類型和順序最好一致
三、union關鍵字默認去重,若是使用union all 能夠包含重複項
7、用戶管理
一、刪除用戶:drop user ‘用戶名’@’容許登陸的地址或服務器名’;
二、修改本身的密碼:set password = password('密碼');
三、修改他人密碼:set password for '用戶名'@'容許登陸的地址' = password('密碼');
四、受權:grant 權限列表 on 某庫.某個對象 to ‘用戶名’@’容許登陸的位置’ 【identified by ‘密碼’】;
五、取消權限:revoke 權限列表 on 某庫.某個對象 from ‘用戶名’@’容許登陸的位置’
8、事務
事務執行的基本流程
1,開啓一個事務:start transaction; //也能夠寫成:begin;
2,執行多條增刪改語句; //也就是至關於但願這多條語句要做爲一個「不可分割」的總體去執行的任務
3,判斷這些語句執行的結果狀況,並進行提交或回滾:
if( 沒有出錯 ){
commit; //提交事務;此時就是一次性完成;
}else{
rollback; //回滾事務;此時就是所有撤銷;
}
數據庫引擎Innodb有效
start transaction; insert into test(name, age) values ('yang', 18); commit;
9、存儲過程、觸發器
一、定義變量:
賦值形式:set 變量名 = 值;
取值:就直接使用變量名;
注:只能在存儲過程或者函數內申明變量
set @變量名 = 值;
注:基本上哪裏均可以用
二、函數:
create function 函數名 (參數1 類型1,參數2 類型2,。。。) returns 返回類型
begin
#這裏寫函數內容
return 返回值
end
注意事項:
1, 在函數內容,能夠有各類變量和流程控制的使用;
2, 在函數內部,也能夠有各類增刪改語句;
3, 在函數內部,不能夠有select或其餘「返回結果集」的查詢類語句;
create function test() returns int begin return 1; end;
調用:select 函數 as 別名
刪除函數:drop function 函數名
三、存儲過程:
create procedure test(【in | out | inout】 a int)
begin
--這裏寫完整的過程當中語句
--其中能夠有各類流程控制
--還能夠是增刪改查等
--其中查詢語句會做爲存儲過程調用的結果
end;
說明:
1,in:用於設定該變量是用來「接收實參數據」的,即「傳入」;默認不寫,就是in
2,out:用於設定該變量是用來「存儲存儲過程當中的數據」的,即「傳出」,即函數中必須對他賦值;
3,inout:是in和out的結合,具備雙向做用;
4,對於,out和inout設定,對應的實參,就「必須」是一個變量,由於該變量是用於「接收傳出數據」;
create procedure test(in a int) begin insert into test (name, age) values ('haha', 18); end;
調用存儲過程:call 存儲過程名 (實參1,實參2);
call test(1);
刪除存儲過程:drop procedure 過程名稱;
三、觸發器:
create trigger 觸發器名 觸發時機 觸發事件 on 表名 for each row as
begin
//這裏,纔是編程的位置,也就是觸發器的內部語句
end;
說明:
1,觸發時機,只有2個: before(在....以前), after(在....以後);
2,觸發事件,只有3個:insert, update, delete
3,即其含義是:在某個表上進行insert(或update,或delete)以前(或以後),會去執行其中寫好的代碼(語句);即每一個表只有6個情形會可能調用該觸發器;
4,一般,觸發器用於在對某個表進行增刪改操做的時候,須要同時去作另一件事情的情形;
5,在觸發器的內部,有2個關鍵字表明某種特定的含義,能夠用於獲取有關數據:
new:它表明當前正要執行的insert或update的時候的「新行」數據;經過它,能夠獲取這一新行數據的任意一個字段的值,形式爲:
set @v1 = new.id; //得到該新插入或update行的id字段的值(前提是有該id)
set @v2 = new.age; //同上;
old:它表明當前正要執行的delete的時候的「舊行」數據,經過它,能夠獲取這一舊行數據的任意一個字段的值,形式爲:
set @v1 = old.id; //得到該插入或update行的id字段的值(前提是有該id)
set @v2 = old.age; //同上;
CREATE TRIGGER SumOfSalary BEFORE INSERT ON tb_emp8 FOR EACH ROW SET @sum=@sum+NEW.salary;
CREATE TRIGGER double_salary AFTER INSERT ON tb_emp6 FOR EACH ROW INSERT INTO tb_emp7 VALUES (NEW.id,NEW.name,deptId,2*NEW.salary);