一、命令行操作
1、顯示所有庫:
show databases;
2、要操作某個庫,比如庫名:
db_book:use db_book;
3、查看錶的基本結構,比如表名:
t_book:desc t_book;
4、查看某個表的創建sql語句:
show create table t_book;
二、數據類型
1、char和varchar的區別:
char是定長的,比如char(10)如果存的2位字符,給該字段分配的空間還是10個字符,varchar(10)存的就是2個字符,char性能好耗空間,varchar空間好耗性能
2、BLOB:
如果數據庫要存圖片和視頻,用BLOB數據類型
3、int:
10億級別的數據量是可以承載的,如果大於10億就要用BIGINT,看項目大小
4、decimal(5,2):
表示有5位數字,其中小數位2位
三、表操作
1、創建表:
CREATE TABLE `sign_guest` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`realname` VARCHAR(64) NOT NULL,
`phone` VARCHAR(16) NOT NULL,
`email` VARCHAR(254) NOT NULL,
`sign` TINYINT(1) NOT NULL,
`create_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間' ,
`event_id` INT(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `sign_guest_event_id_fa7638b3_fk_sign_event_id` (`event_id`),
CONSTRAINT `sign_guest_event_id_fa7638b3_fk_sign_event_id` FOREIGN KEY (`event_id`) REFERENCES `sign_event` (`id`),
UNIQUE KEY (`phone`,`event_id`) -----兩個字段聯合添加唯一性約束,(應用場景:一場發佈會不能有相同的號碼,不同的發佈會可以有相同的號碼)
) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
2、如何寫外鍵關聯兩個表
CREATE TABLE t_book(
id int primary key auto_increment, ----auto_increment表示自增,一般聲明主鍵時用到
bookName varchar(20),
author varchar(10),
price decimal(6,2),
bookTypeId int,
constraint `fk` foreign key (`bookTypeId`) references `t_bookType`(`id`) ----聲明外鍵,這裏不能用單引號和雙引號,要用tab鍵上面的那個鍵
)
3、修改表:
1> 修改表給某個字段加上唯一性約束:
ALTER TABLE `sign_guest` ADD UNIQUE(`phone`);
2> 修改表名:
alter table t_book rename t_book2; ----把t_book表名字從t_book改成t_book2
3> 修改字段:
alter table t_book change author newAuthor varchar(20); ---舊字段名author,改成新字段名newAuthor再給新字段名加屬性
4> 增加字段:
alter table t_book add publishDate date not null first; -----加個字段,字段要有數據類型,這裏給了date,再給上完整性約束條件(是否主外鍵,是否自增,是否唯一非空等),first表示在第一行插入
alter table t_book add publishDate date not null after price; ---after price表示在price字段後面插入
5> 刪除字段:
alter table t_book drop author;
4、查詢表:
1> 常用條件有
1) IN 和 NOT IN
2) between A and B
3) Like 和 not like %匹配多個字符 _匹配單個字符
4) is null 和 is not null
5) distinct
2> 重點是掌握group by:
2.1> 跟group_concat()函數一起使用:
select gradeName, group_concat(stuName) From t_student group by gradeName; ----根據年級名稱分組後把每個年級的學生名字全部列出來
2.2> 跟having一起使用:
select gradeName , count(stuName) from t_student group by gradeName having count(stuName)>3;
2.3> 使用with rollup在最後加一行合計行
select gradeName , count(stuName) from t_student group by gradeName having count(stuName)>3 with rollup;
3> 分頁查詢:
select * from t_student limit 0, 5; ----0是初始位置的下標,表示查第一條數據(id爲1),5表示每頁多少條
4> 連接查詢:
4.1>內連接:
select * from t_book, t_bookType where t_book.bookTypeId=t_bookType.id;
4.2> 外連接:
select * from t_book left join t_bookType on t_book.bookTypeId = t_bookType.id -----左連接查出表1的全部的數據,查出表2根據條件匹配的數據
select * from t_book right join t_bookType on t_book.bookTypeId = t_bookType.id ------右連接查出表2的全部的數據,查出表1根據條件匹配的數據
5> Exists關鍵字:
如果子查詢查詢到有記錄,則執行外查詢 ,not exist則相反
select * from t_book where exists (select * from t_bookType);
6> Any關鍵字:
滿足任意一個條件都可以
select * from t_book where price >= any (select price from t_pricelevel); ------子查詢查出來的結果是價格的集合,本來不能用>=跟集合來比較,但是加個any後,意思成了跟任意一個集合裏的價格進行比較,只要滿足 條件的記錄外查詢都查詢出來
7> All關鍵字:
要滿足所有條件
select * from t_book where price >= all (select price from t_pricelevel); ------子查詢查出來的結果是價格的集合,本來不能用>=跟集合來比較,但是加個all後,意思成了跟集合裏所有的價格逐個進行比較,要滿足所 有條件的記錄外查詢才查詢出來
8> union 和 union all:
把兩條查詢語句的查詢結果合併,union在合併後會distinct,union all顯示合併結果不distinct
四、索引
索引由表中一列或多列組合而成,作用提高查詢速度;分爲普通索引、唯一性索引(unique)、全文索引(fulltext)、單列索引、多列索引和空間索引(spatial)
1、創建索引:
1.1> 創建表的時候創建索引
語法: CREATE TABLE 表名(屬性名 數據類型[完整性約束條件],
.....
[UNIQUE|FULLTEXT|SPATIAL]|INDEX|KEY[別名](屬性名[(長度)][ASC|DESC]));
CREATE TABLE t_user (id int,
userName varchar(20),
index(userName) -----創建單列索引,字段用的是userName
);
CREATE TABLE t_user (id int,
userName varchar(20),
unique index index_userName(userName) -----創建唯一索引,字段用的是userName,同時給userName取了別名index_userName
);
CREATE TABLE t_user (id int,
userName varchar(20),
index index_userName_password(userName,password) -----創建多列索引
);
1.2> 表已經存在,給表創建索引:
CREATE index index_userName on t_user(userName); ----在表t_user的字段userName上創建索引同時取別名 index_userName
CREATE unique index index_userName on t_user(userName); ---在index全面加unique創建唯一索引
CREATE index index_userName_password on t_user(userName,password); ---創建多列索引
1.3> 更改表的時候創建索引:
ALTER TABLE t_user Add index index_userName(userName); ---創建單列索引,字段用的是userName
ALTER TABLE t_user Add unique index index_userName(userName); ---唯一索引
ALTER TABLE t_user Add index index_userName_password(userName,password); ---多列索引
2、刪除索引:
drop index 索引名 on 表名;
五、編碼
操作修改默認編碼方式
1、顯示編碼方式:
show variables like 'character%';
2、修改編碼方式:
要保證客戶端,服務器和連接過程編碼都一樣
SET character_set_client = utf8 ;
SET character_set_connection = utf8 ;
SET character_set_database = utf8 ;
SET character_set_results = utf8 ;
SET character_set_server = utf8 ;
3、重啓mysql服務
停止:net stop mysql
啓動:net start mysql
六、視圖
創建語法:
CREATE [ALGORITHM={UNDEFIEND|MERGE|TEMPTABLE}]
VIEW 視圖名 [(屬性清單)]
AS SELECT 語句
[WITH [CASCADED|LOCAL] CHECK OPTION];
describe 視圖名; ---查看視圖基本信息
show table status 視圖名; ---查看錶(包括視圖)基本信息
show create view 視圖名; ----查看錶或視圖的詳細信息
1、修改視圖
1.1> CREATE OR REPLACE VIEW語句:
CREATE OR REPLACE [ALGORITHM={UNDEFIEND|MERGE|TEMPTABLE}]
VIEW 視圖名 [(屬性清單)]
AS SELECT 語句
[WITH [CASCADED|LOCAL] CHECK OPTION];
1.2> ALTER語句
ALTER [ALGORITHM={UNDEFIEND|MERGE|TEMPTABLE}]
VIEW 視圖名 [(屬性清單)]
AS SELECT 語句
[WITH [CASCADED|LOCAL] CHECK OPTION];
2、視圖是虛擬的表,數據來源於原表,對視圖當作表來執行insert into、update和delete語句操作的是原表的數據
3、刪除視圖:DROP VIEW [IF EXISTS] 視圖名列表 [RESTRICT|CASCADE];
七、觸發器
1、創建只有一個執行語句的觸發器:
CREATE trigger 觸發器名 before | after 觸發事件
on 表名 for each row 執行語句
示例:create trigger trig_book after insert ------觸發事件有insert 、 update和delete,這裏用insert觸發
on t_book for each row
update t_bookType set bookNum = bookNum+1 where new.bookTypeId = t_booktype.id; -----過渡變量有new 和 old, insert和update操作使用new,表示更新的那條數據,delete操作用old,表示刪除的那條數據
2、創建有多個執行語句的觸發器:
CREATE trigger 觸發器名 before | after 觸發事件
on 表名 for each row
begin
執行語句
end
示例:
delimiter | -----delimiter的作用是防止mysql遇到第一個分號就當作一個語句開始執行
create trigger trig_book2 after delete
on t_book for each row
begin
update t_bookType set bookNum = bookNum -1 where old.bookTypeId = t_bookType.id;
insert into t_log values(null,now(),'在book表裏刪除了一條數據');
delete from t_test where old.bookTypeId = t_test.id;
end
|
delimiter ;
3、查看觸發器:
3.1> show triggers;
3.2> 在系統庫information_schema的triggers表裏面查看
4、刪除觸發器:
drop trigger 觸發器名 ;
八、Mysql常用函數
1、日期和時間函數:
curdate() ---返回當前日期
curtime() --返回當前時間
month(date) ---返回date中的月份,範圍是1~12
2、字符串函數 :
char_length(str) --返回字符串str長度
upper(str) ---返回str全部大寫
lower(str) ---返回str全部小寫
3、數學函數:
ABS(X) ---求X的絕對值
SQRT(x) ---求x的平方根
MOD(x) ---求x的餘數
4、加密函數:
PASSWORD(str) ---一般對用戶的密碼加密 不可逆
MD5(str) ---普通加密 不可逆
ENCODE(str, pswd_str) ---加密函數,結果是一個二進制數,必須使用BLOB類型的字段來保存它
DECODE(crypt_str,pswd_str) ---解密函數 加解密要用同一個pswd_str
九、存儲過程和函數
1、創建存儲過程:
CREATE PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
存儲過程示例:
delimiter &&
create procedure pro_book (in bT int, out count_num int)
reads sql data
begin
select count(*) from t_book where bookTypeId=bT;
end
&&
delimiter;
call procedure(1,@total) ----調用存儲過程,@total指明是全局變量,不指明就是局部變量
2、創建函數:
CREATE FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
func_parameter:
param_name type
type:
Any valid MySQL data type
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
routine_body:
Valid SQL procedure statement or statements
函數示例:
delimiter &&
create procedure func_book (bookId, int)
returns varchar(20)
begin
return (select bookName from t_book where id=bookId);
end
&&
delimiter;
select func_book(1); ---調用函數
3、查看存儲過程和函數
3.1> show status語句查看狀態
show {procedure|function} status [like 'pattern'];
3.2> show create語句查看定義
show create {procedure|function} sp_name;
4、刪除存儲過程和函數
drop {procedure|function} sp_name;
十、變量
1、變量的使用:
DECLARE var_name[,.....] type[default value]
示例:
delimiter&&
CREATE PROCEDURE pro_user()
BEGIN
declare a, b varchar(20);
insert into t_user values(null, a, b);
END
&&
delimiter ;
2、爲變量賦值:
2.1> 方式1:
SET var_name = expr[,var_name=expr]...
示例:
delimiter&&
CREATE PROCEDURE pro_user()
BEGIN
declare a, b varchar(20);
set a='good good study', b='day day up';
insert into t_user values(null, a, b);
END
&&
delimiter ;
2.2> 方式2:
SELECT col_name[,...] INTO var_name[,...] FROM table name where condition
示例:
delimiter&&
CREATE PROCEDURE pro_user()
BEGIN
declare a, b varchar(20);
select userName2,password2 into a, b from t_user2 where id2=1;
insert into t_user values(null, a, b);
END
&&
delimiter ;
十一、遊標
1、使用過程爲聲明--》打開---》使用---》關閉
1.1> 聲明:
DECLARE cursor_name CURSOR FOR select_statement;
1.2> 打開:
OPEN cursor_name;
1.3> 使用:
FETCH cursor_name INTO var_name[,var_name.....];
1.4> 關閉遊標:CLOSE cursor_name;
2、示例:
delimiter&&
CREATE PROCEDURE pro_user()
BEGIN
declare a, b varchar(20);
declare cursor_user_2 cursor for select userName2,password2 from t_user2; ---聲明遊標
open cursor_user_2; ---打開遊標
fetch cursor_user_2 into a, b; ---通過遊標取數據賦值給變量
insert into t_user values(null, a, b);
close cursor_user_2;
END
&&
delimiter ;
十二、流程控制
1、IF語句:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list]...
[ELSEIF statement_list]
END IF
示例:
delimiter &&
create procedure pro_user5(IN bookId int)
begin
select count(*) into @num from t_user where id = bookId;
if @num>0 then update t_user set userName='lower' where id= bookId;
else
insert into t_user values(null,'hkdfd','dsfs');
end if;
end
&&
delimiter ;
2、CASE語句:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]....
[ELSE statement_list]
END CASE
示例:
delimiter &&
create procedure pro_user5(IN bookId int)
begin
select count(*) into @num from t_user where id = bookId;
case @num
where 1 then update t_user set userName='lower' where id= bookId;
where 0 then insert into t_user values(null,'hkdfd','dsfs');
else insert into t_user values(null,'hkdfd','dsfs');
end case;
end
&&
delimiter ;
3、LOOP, LEAVE語句
[begin_label:]LOOP
statement_list
END LOOP[end_label]
LEAVE label ----跳出循環
示例:
delimiter &&
create procedure pro_user5(IN totalNum int)
begin
loop1:loop
set totalNum=totalNum-1;
if totalNum=0 then leave loop1;
else insert into t_user values(totalNum,'hkdfd','dsfs');
end if;
end loop loop1;
end
&&
delimiter ;
4、iterate語句 跳出本次循環,直接執行下一次循環
delimiter &&
create procedure pro_user5(IN totalNum int)
begin
loop1:loop
set totalNum=totalNum-1;
if totalNum=0 then leave loop1;
elseif totalNum=3 then iterate loop1;
end if;
insert into t_user values(totalNum,'hkdfd','dsfs');
end loop loop1;
end
&&
delimiter ;
5、repeat語句:重複執行語句直到滿足某個條件後跳出循環
[begin_label:]repeat
statement_list
until search_condition
end repeat[end_label]
示例:
delimiter &&
create procedure pro_user5(IN totalNum int)
begin
repeat
set totalNum=totalNum-1;
into t_user values(totalNum,'hkdfd','dsfs');
until totalNum=1;
end repeat;
end
&&
delimiter ;
6、 while語句:
[begin_label]while search_condition do
statement_list
end while[end_label]
示例:
delimiter &&
create procedure pro_user5(IN totalNum int)
begin
while totalNum>0 do
into t_user values(totalNum,'hkdfd','dsfs');
set totalNum=totalNum-1;
end while;
end
&&
delimiter ;
十三、Mysql設置時間類型的字段默認值爲系統時間的方法
1、方法一:把字段類型設置爲timestamp,再把值設置成默認的current_timestamp,示例如下
1.1> 添加CreateTime 設置默認時間 CURRENT_TIMESTAMP
ALTER TABLE `table_name`
ADD COLUMN `CreateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間' ;
1.2> 修改CreateTime 設置默認時間 CURRENT_TIMESTAMP
ALTER TABLE `table_name`
MODIFY COLUMN `CreateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間' ;
1.3> 添加UpdateTime 設置 默認時間 CURRENT_TIMESTAMP 設置更新時間爲 ON UPDATE CURRENT_TIMESTAMP (修改記錄時,該字段值自動更新爲系統時間)
ALTER TABLE `table_name`
ADD COLUMN `UpdateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間' ;
1.4> 修改 UpdateTime 設置 默認時間 CURRENT_TIMESTAMP 設置更新時間爲 ON UPDATE CURRENT_TIMESTAMP
ALTER TABLE `table_name`
MODIFY COLUMN `UpdateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間' ;
2、方法二:使用觸發器
create table test_time (
id int(11),
create_time datetime
);
delimiter |
create trigger default_datetime before insert on test_time
for each row
if new.create_time is null then
set new.create_time = now();
end if;|
delimiter ;
十四、數據備份和還原
1、數據備份
方式一:使用mysqldump命令備份(命令行切換目錄到mysql安裝目錄的bin目錄,該目錄下有mysqldump.exe可執行文件)
mysqldump -u username -p dbname table1,table2... > BackUpName.sql
方式二:使用sqlyon圖形工具
2、數據還原
方式一:mysql -u username -p [dbname] < backup.sql
十五、Mysql數據庫的各種事務
1、SET AUTOCOMMIT=0 -----取消事務自動提交處理,開啓事務處理
2、SET AUTOCOMMIT=1 -----打開事務自動提交處理,關閉事務處理
3、START TRANSACTION -----啓動事務
4、BEGIN -----啓動事務, 跟START TRANSACTION 相當
5、COMMIT -----提交事務
6、ROLLBACK -----回滾全部事務
7、SAVEPOINT 事務保存點名稱 --------設置事務保存點
8、ROLLBACK TO SAVEPOINT 保存點名稱 ---------回滾操作到保存點
十六、安裝卸載
1、安裝比較簡單,注意安裝mysql時字符編碼格式要選擇utf8
2、完全卸載mysql方法:
2.1>先在程序管理卸載mysql,
2.2>在regedit註冊表以下兩個路徑把mysql文件夾內容刪除:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL
2.3>刪除安裝目錄下所有文件
2.4> 刪除C:\ProgramData\MySQL文件夾下文件