‘mysql’不是內部或外部命令,也不是可運行的程序或批處理文件。
解決:
- 配置壞境變量,指定mysql\bin目錄
- 第次進入到mysql\bin目錄,再運行mysql
如何鏈接服務器
服務器地址(可用IP域名):端口(3306) 用戶名 密碼
Mysql -h localhost -u UserName -p password
如: mysql -h localhost -u root -p
mysql -h localhost -u root -p 123456
mysql -hlocalhost -uroot -p123456
-h如果不寫,則默認連localhost
如:mysql -u root -p
顯示數據庫 :show databases
information_schema 數據庫的一些基本信息;mysql 關於用戶的一些信息;performace_schema 性能優化的一些基本信息。
新建數據庫:create database myDatabase chartset utf8;
選中某個數據庫:use myDatabase
- 刪除一個數據庫:drop database test; mysql的數據庫名字不能修改
- 顯示表:show tables;
- 新建一個表:create table class (ID int,name varchar(20),age tinyint(M),area varchar(20));
- 刪除一個表:drop database table1;
- 修改一個表的名字:rename table oldName to newName;
- 顯示表的所有字段:desc tableName;
\c退出當前語句
解決字符集問題:默認建表一般用utf-8,而我們在windows下窗口是GBK的,因些需要聲音字符集:set names gbk;
給表插入一條數據:如 insert into msg (id,title,content) values (1,'標題","內容“);
整型
- tinyint:默認是帶符號位的(-128 到127);
- tinyint unsigned: 不帶符號位(0到255);
- tinyint(M): 在0填充的時候才有意義, 只有在zerofill設置時才有意義,不影響數據泛微;
- tinyint zerofill:0填充,默認無符號;
- defalut:默認值;
- not null:不能為空;
如:alert table msg add ages tinyint(5) zerofill not null default 0;
creat table msg (id tinyint(4) zerofill not null default 0,title varchar(20),content varchar(20)) charset utf8;
浮點數
- float(M,D):M代到總位數,D 代表小數位;
- decimal(M,D):M代到總位數,D 代表小數位;decimal的精確度更高
如:float(4,2) 表示(99.99到 -99.99),float(4,2)unsigned 表示(0 到99.99);
字符型 char、vachar、text
- char(M):指定長M,
- varchar(M):是變長M,最長為M;速度上char更快些;
- text:文本類型,可以存比較大的文本段,搜索速度稍慢。text不用加時默認值,加了也沒用。
日期時間類型
- year 年;(1901-2155年),如果輸入2位,‘00-69’表示2000-2069,‘70-99’表示1970-1999
- data類型:日期類型1000-01-01 到9999-12-31
- time類型:典型格式 hh:mm:ss,日期類型范圍:“-838:59:59”到“+838:59:59”
- datatime類型:yyyy-MM-DD hh:mm:ss,范圍:1000-01-01 00:00:00到9999-12-31 23:59:59
- 時間戳:是1970-01-01:00:00:00到當前的秒數。一般存注冊時間,商品發布時間等,羡慕不是用datetime存儲,而是用時間戳。
注意:
在開發中,很少用日期時間類型來表示一個需要的精確到秒的列
原因:日期時間類型能精確到秒,而且 方便查看,但是不方便計算。用int存時間戳更方便計算
枚舉類型enum(’男‘,’女‘);
id primary key auto_increment :主鍵、自動增長;
左鏈接
select * from tba left join tbb on tba.catId=tbb.catId;左鏈接以左邊表為主表,當不能在tbb表里面匹配到相關信息時,顯示NULL.
UNION
將兩個表連接起來,要求連接的兩個表列數一樣,每列的類型一致。
select * from ta union select * from tb
視圖
視圖是表的查詢結果,自然表的數據改變了,影響視圖結果;
視圖改變了,影響表,但是視圖並不總是能增刪改,只有當視圖的數據與表的數據一一對應時才可以更改
注:插入視圖時,視圖必須包含表中沒有默認值的列
- 創建:create algorithm= temptable view 視圖名 as select 語句;
- 使用: select * from 視圖名;
- 刪除:drop view 視圖名
視圖的 algorithm=merge/temptable/undefined
- merge:當引用視圖時,引用視圖的語句與定義視圖的語句合並。merge意味着視圖只是一個規則,語句規則,當查詢視圖時,把查詢視圖的語句與創建時的語句where子句等合並,分析形成一條select語句。
- templtable:當引用視圖時,根據視圖的創建語句建立一個臨時表
- undefined:未定義,自動、讓系統幫你選。
字符集和校對集
某一個級別沒有指定字符集則集成上一級的字符集。
- 服務器,我給你發送的數據是什么編碼的:set character_set_client=gbk;
- 轉換器,轉換成什么編碼:set character_set_connection=gbk;
- 查詢的結果是用什么編碼:set character_set_results=gbk;
注:如果以上3者都為字符集N,則可以簡寫為set names N
出現亂碼的情況:client聲明與事實不符,results與客戶端字符集不符的時候
校對集 collation
create table tem(name varchar(10) ) charset utf8 collate utf8_bin; 指字符集的排序規則,一種字符集可以有一個或者多個排序規則。
注:聲明的校對集必須是字符集合法的校對集
觸發器
四要素:監視地點、監視事件、觸發時間、觸發事件。
創建:create trigger triggerName after|before insert|update|delete on 表名
for each row #行觸發器,mysql里面是固定的
begin sql語句 end;
注: delimiter $ 將結束符由‘;’改成‘$’符,修改語句不用加結束符
刪除: drop trigger triggerName;
查看: show triggers ;
- 對於insert而言,新增的行用 new來表示,行中每一列的值用new.列名來表示。
- 對於delete而言,刪除的行用old來表示,行中的每一列的值用old.列名來表示。
- 對於update而言,修改的行,修改前的用old來表示,修改后的值用new來表示。
delimiter $ //更改結束符為$,不用加結束符
create trigger tg1 after insert on goods for each row
begin
update tb2 set num=num-1 where tb2.id=new.id;
end $
before例子:
create trigger tg2 befor insert on goods for each row
begin
if new.num >5 then
set new.much=5
end if ;
update g set num =num-new.muchh where id=new.gid;
end$
事務
事務指:一組操作,要么都成功執行,要么都不執行。
事物的ACID特性:
- 原子性(atomicity):原子意為最小的粒子,或者說不能再分的事物。數據庫事務的不可再分的原則即為原子性;組成事務的所有查詢必須:要么全部執行,要么全部取消(就像上面的銀行例子)。
- 一致性(consistency):指數據的規則,在事務前/后應保持一致。
- 隔離性(Isolation):簡單點說,某個事務的操作對其他事務不可見的。
- 持久性(Durability):當事務完成后,其影響應該保留下來,不能撤消。
存儲引擎的種類和特點
顯示所有的存儲引擎:show engines;
指定存儲引擎:create table tb (id int primary key auto_increment ) engine=innodb|myisam charset utf8;
支持事務案例的數據庫引擎才有事務
開啟事務:start transaction ; 注意:兩個start transaction,前面的那個就隱式的提交了
sql語句......
commit提交、 rollback回滾 //當一個事務commit\rollback就結束 了
備份與恢復
增量備份、整體備份
系統自帶的備份工具:mysqldump.exe,可以導出庫也可以導出表
- 導出一個庫下面的所有表:mysqldump -u 用戶名 -p 密碼 庫名> 地址/備份的文件名稱
- 備份多個庫的方法:mysqldump -u 用戶名 -p 密碼 庫名1 庫名2 庫名3 > 地址/備份的文件名稱
如:mysqldump -uroot -p111111 mydatabase goods > D:\\goods.sql // 導出mydatabase數據庫下的goods表,會在D盤下生成一個SQL文件
- 執行恢復:source D:\\mydatabase.sql;
- 對於表級的備份:use 庫名 --------source 備份的文件地址
索引
- 好處:加快了查詢速度;
- 壞處:降低了增、刪、改的速度,增大了表的文件大小(索引文件甚至可能比數據文件還大)。
注意:大數據處理辦法:先去掉索引,再導入,最后再統一加索引。
- 不能過度索引;
- 索引條件列(where 后面最頻繁的條件比較適宜索引)
- 索引散列值,過於集中的值不要索引;如性別加索引,意義不大;
索引的類型:
- 普通索引(index):僅僅是加快查詢速度;
- 主鍵索引(primary key):不能重復;主鍵必唯一,唯一索引不一定是主鍵,一張表只能有一個主鍵,可以有一個或多個唯一索引;
- 唯一索引(unique):行上的值不能重復;
- 全文索引(fulltext)
查看索引:
show index from 表名;
show index from 表名 \G //用另一種格式顯示
建立索引:
alter table 表名 add index|unique|fulltext【索引名】(列名);
alter table 表名 add primary key (列名); //添加主鍵索引
刪除索引:
alter table 表名 drop index 索引名;
alter table 表名 drop primary key; //刪除主鍵
查詢索引:
select * from member where match (pro) against ("china");
查詢匹配度 select id,email, match (pro ) against ("china") from member;
注:全文索引不針對非常頻繁的詞做索引,全文索引對中文意義不大
存儲過程
概念類似於函數,就是把一段代碼封裝起來,在封裝語句里面,可以用if/else,case,while等控制結構,可以進行sql編程。
- 查看:show procedure status 或 show procedure status \G;
- 刪除:drop procedure 存儲過程名字 ;
- 使用:call 存儲過程名字;
delimiter $ create procedure p(n int) begin
declare i int;
declare s int;
set i=1;
set s=0;
while i<=n do
set s=s+i;
set i=i+i;
end while;
select s;
end$
call p(5)$ //調用