一.創建表:
1.1 建表陳述句的語法格式:
create table 表名(
欄位名1 資料型別,
欄位名2 資料型別,
欄位名3 資料型別,
....
);
1.2 關于MySQL當中欄位的資料型別?以下只說常見的:
int 整數型(java中的int)
bigint 長整型(java中的long)
float 浮點型(java中的float double)
char 定長字串(String)
varchar 可變長字串(StringBuffer/StringBuilder)
date 日期型別 (對應Java中的java.sql.Date)
BLOB 二進制大物件(存盤圖片、視頻等流媒體資訊) Binary Large OBject (對應java中的Object)
CLOB 字符大物件(存盤較大文本,比如,可以存盤4G的字串,) Character Large OBject(對應java中的Object)
......
1.3 char和varchar怎么選擇?
在實際的開發中,當某個欄位中的資料長度不發生改變的時候,是定長的,例如:性別、生日等都是采用char,
當一個欄位的資料長度不確定,例如:簡介、姓名等都是采用varchar,
1.4 BLOB和CLOB型別的使用?
電影表: t_movie
id(int) name(varchar) playtime(date/char) haibao(BLOB) history(CLOB)
----------------------------------------------------------------------------------------
1 蜘蛛俠
2
3
表名在資料庫當中一般建議以:t_或者tbl_開始;
創建學生表:
學生資訊包括:
學號、姓名、性別、班級編號、生日
學號:bigint
姓名:varchar
性別:char
班級編號:int
生日:char
create table t_student(
no bigint,
name varchar(255),
sex char(1),
classno varchar(255),
birth char(10)
);
1.5 表的復制語法:
create table 表名 as select陳述句;
//將查詢結果當做表創建出來
二.插入資料:
2.1 語法格式:
insert into 表名(欄位名1,欄位名2,欄位名3,....) values(值1,值2,值3,....)
要求:欄位的數量和值的數量相同,并且資料型別要對應相同,
insert into t_student(no,name,sex,classno,birth) values(1,'zhangsan','1','gaosan1ban');
ERROR 1136 (21S01): Column count doesn't match value count at row 1
insert into t_student(no,name,sex,classno,birth) values(1,'zhangsan','1','gaosan1ban', '1950-10-12');
mysql> select * from t_student;
+------+----------+------+------------+------------+
| no | name | sex | classno | birth |
+------+----------+------+------------+------------+
| 1 | zhangsan | 1 | gaosan1ban | 1950-10-12 |
+------+----------+------+------------+------------+
insert into t_student(name) values('wangwu'); // 除name欄位之外,剩下的所有欄位自動插入NULL,
mysql> select * from t_student;
+------+----------+------+------------+------------+
| no | name | sex | classno | birth |
+------+----------+------+------------+------------+
| 1 | zhangsan | 1 | gaosan1ban | 1950-10-12 |
| 2 | lisi | 1 | gaosan1ban | 1950-10-12 |
| NULL | wangwu | NULL | NULL | NULL |
+------+----------+------+------------+------------+
drop table if exists t_student; // 當這個表存在的話洗掉
create table t_student(
no bigint,
name varchar(255),
sex char(1) default 1, // 設定默認值“1”
classno varchar(255),
birth char(10)
);
insert into t_student(name) values('zhangsan');
mysql> select * from t_student;
+------+----------+------+---------+-------+
| no | name | sex | classno | birth |
+------+----------+------+---------+-------+
| NULL | zhangsan | 1 | NULL | NULL |
+------+----------+------+---------+-------+
2.2 注意:
當一條insert陳述句執行成功之后,表格當中必然會多一行記錄,即使多的這一行記錄當中某些欄位是NULL,后期也沒有辦法在執行insert陳述句插入資料了,只能使用update進行更新,
// 欄位可以省略不寫,但是后面的value對數量和順序都有要求,
insert into t_student values(1,'jack','0','gaosan2ban','1986-10-23');
mysql> select * from t_student;
+------+----------+------+------------+------------+
| no | name | sex | classno | birth |
+------+----------+------+------------+------------+
| NULL | zhangsan | 1 | NULL | NULL |
| 1 | jack | 0 | gaosan2ban | 1986-10-23 |
+------+----------+------+------------+------------+
insert into t_student values(1,'jack','0','gaosan2ban');
ERROR 1136 (21S01): Column count doesn't match value count at row 1
// 一次插入多行資料
insert into t_student
(no,name,sex,classno,birth)
values
(3,'rose','1','gaosi2ban','1952-12-14'),(4,'laotie','1','gaosi2ban','1955-12-14');
mysql> select * from t_student;
+------+----------+------+------------+------------+
| no | name | sex | classno | birth |
+------+----------+------+------------+------------+
| NULL | zhangsan | 1 | NULL | NULL |
| 1 | jack | 0 | gaosan2ban | 1986-10-23 |
| 3 | rose | 1 | gaosi2ban | 1952-12-14 |
| 4 | laotie | 1 | gaosi2ban | 1955-12-14 |
+------+----------+------+------------+------------+
2.3 將查詢結果插入到一張表中?
mysql> insert into dept1 select * from dept;
mysql> select * from dept1;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
三.修改資料:
3.1 語法格式:
update 表名 set 欄位名1=值1,欄位名2=值2... where 條件;
注意:沒有條件整張表資料全部更新,
案例:將部門10的LOC修改為SHANGHAI,將部門名稱修改為RENSHIBU
update dept1 set loc = 'SHANGHAI', dname = 'RENSHIBU' where deptno = 10;
mysql> select * from dept1;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | RENSHIBU | SHANGHAI |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 10 | RENSHIBU | SHANGHAI |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
3.2 更新所有記錄
update dept1 set loc = 'x', dname = 'y';
mysql> select * from dept1;
+--------+-------+------+
| DEPTNO | DNAME | LOC |
+--------+-------+------+
| 10 | y | x |
| 20 | y | x |
| 30 | y | x |
| 40 | y | x |
| 10 | y | x |
| 20 | y | x |
| 30 | y | x |
| 40 | y | x |
+--------+-------+------+
四.洗掉資料:
4.1 語法格式:
delete from 表名 where 條件;
注意:沒有條件全部洗掉;
洗掉“10部門”資料?
delete from dept1 where deptno = 10;
洗掉所有記錄?
delete from dept1;
4.2 怎么洗掉大表中的資料?(重點)
truncate table 表名; // 表被截斷,不可回滾,永久丟失,
4.3 洗掉表?
drop table 表名; // 通用寫法
drop table if exists 表名; // oracle不支持這種寫法
4.4 在實際開發中表一旦設計好之后,對表結構的修改是很少的,修改表結構就是對之前的設計進行了否定,即使需要修改表結構,我們也可以直接使用工具操作;修改表結構的陳述句不會出現在Java代碼當中,出現在java代碼當中的sql包括:insert delete update select(這些都是表中的資料操作);
五.約束(Constraint):
楔子:
什么是約束?常見的約束有哪些呢?
在創建表的時候,可以給表的欄位添加相應的約束,添加約束的目的是為了保證表中資料的合法性、有效性、完整性,
常見的約束有哪些呢?
非空約束(not null):約束的欄位不能為NULL;
唯一約束(unique):約束的欄位不可重復;
主鍵約束(primary key):約束的欄位既不能為NULL,也不能重復(簡稱PK);
外鍵約束(foreign key):...(簡稱FK);
檢查約束(check):注意Oracle資料庫有check約束,但是mysql沒有,目前mysql不支持該約束;
5.1、非空約束 not null
drop table if exists t_user;
create table t_user(
id int,
username varchar(255) not null,
password varchar(255)
);
insert into t_user(id,password) values(1,'123');
ERROR 1364 (HY000): Field 'username' doesn't have a default value //報錯資訊
5.2、唯一性約束(unique)
* 唯一約束修飾的欄位具有唯一性,不能重復,但可以為NULL;
* 案例:給兩個列或者多個列添加unique
// 表級約束:
drop table if exists t_user;
create table t_user(
id int,
usercode varchar(255),
username varchar(255),
unique(usercode,username)
);
insert into t_user values(1,'111','zs');
insert into t_user values(2,'111','ls');
insert into t_user values(4,'111','zs');
ERROR 1062 (23000): Duplicate entry '111-zs' for key 'usercode'//雙欄位同時重復才報錯
//列級約束:
drop table if exists t_user;
create table t_user(
id int,
usercode varchar(255) unique,
username varchar(255) unique
);
insert into t_user values(1,'111','zs');
insert into t_user values(2,'111','ls');
ERROR 1062 (23000): Duplicate entry '111' for key 'usercode' //一個欄位重復就報錯
* 注意:not null約束只有列級約束,沒有表級約束,
5.3、主鍵約束:
* 主鍵相關的術語?
主鍵約束:primary key
主鍵欄位:id欄位添加primary key之后,id叫做主鍵欄位
主鍵值: id欄位中的每一個值都是主鍵值,
* 主鍵有什么作用?
- 表的設計三范式中有要求,第一范式就要求任何一張表都應該有主鍵;
- 主鍵的作用:主鍵值是這行記錄在這張表當中的唯一標識;
* 主鍵的分類?
根據主鍵欄位的欄位數量來劃分:
單一主鍵(推薦,常用)
復合主鍵(多個欄位聯合起來添加一個主鍵約束不建議使用,因為復合主鍵違背三范式)
根據主鍵性質來劃分:
自然主鍵:主鍵值最好就是一個和業務沒有任何關系的自然數(推薦)
業務主鍵:主鍵值和系統的業務掛鉤,例如:拿著銀行卡的卡號做主鍵,拿著身份證號碼作為主鍵(不推薦用)
*注意:最好不要拿著和業務掛鉤的欄位作為主鍵,因為以后的業務一旦發生改變的時候,主鍵值可能也需要隨著發生變化,但有的時候沒有辦法變化,因為變化可能會導致主鍵值重復,
5.4 定義主鍵:
drop table if exists t_user;
create table t_user(
id int primary key, //列級約束方式定義主鍵
username varchar(255),
email varchar(255)
primary key(id) //表級約束方式定義主鍵
);
insert into t_user(id,username,email) values(1,'zs','[email protected]');
insert into t_user(id,username,email) values(2,'ls','[email protected]');
insert into t_user(id,username,email) values(3,'ww','[email protected]');
select * from t_user;
+----+----------+------------+
| id | username | email |
+----+----------+------------+
| 1 | zs | [email protected] |
| 2 | ls | [email protected] |
| 3 | ww | [email protected] |
+----+----------+------------+
insert into t_user(id,username,email) values(1,'jack','[email protected]');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
insert into t_user(username,email) values('jack','[email protected]');
ERROR 1364 (HY000): Field 'id' doesn't have a default value
主鍵的特點:不能為NULL,也不能重復
根據以上的測驗得出:id符合主鍵的特點,所以id是此表的主鍵,
* 注意:一張表的主鍵約束只能有1個;
* mysql提供主鍵值自增:(重要)
drop table if exists t_user;
create table t_user(
id int primary key auto_increment, //id欄位自動維護一個自增的數字,從1開始遞增
username varchar(255)
);
*PS:Oracle當中也提供了一個自增機制,叫做:序列(sequence)物件
六.外鍵約束:
6.1 關于外鍵約束的相關術語:
外鍵約束: foreign key;
外鍵欄位:添加有外鍵約束的欄位;
外鍵值: 外鍵欄位中的每一個值;
6.2 業務背景:
請設計資料庫表,用來維護學生和班級的資訊?
第一種方案:一張表存盤所有資料
no(pk) name classno classname
-------------------------------------------------------------------------------------------
1 zs1 101 北京大興區經濟技術開發區亦莊二中高三1班
2 zs2 101 北京大興區經濟技術開發區亦莊二中高三1班
3 zs3 102 北京大興區經濟技術開發區亦莊二中高三2班
4 zs4 102 北京大興區經濟技術開發區亦莊二中高三2班
5 zs5 102 北京大興區經濟技術開發區亦莊二中高三2班
缺點:冗余,【不推薦】
第二種方案:兩張表(班級表和學生表)【推薦】
t_class 班級表
cno(pk) cname
--------------------------------------------------------
101 北京大興區經濟技術開發區亦莊二中高三1班
102 北京大興區經濟技術開發區亦莊二中高三2班
t_student 學生表
sno(pk) sname classno(該欄位添加外鍵約束fk)
------------------------------------------------------------
1 zs1 101
2 zs2 101
3 zs3 102
4 zs4 102
5 zs5 102
* 將以上表的建表陳述句寫出來:
t_student中的classno欄位參考t_class表中的cno欄位,此時t_student表叫做子表,t_class表叫做父表,
順序要求:
洗掉資料的時候,先洗掉子表,再洗掉父表
添加資料的時候,先添加父表,在添加子表
創建表的時候,先創建父表,再創建子表
洗掉表的時候,先洗掉子表,在洗掉父表
drop table if exists t_student;
drop table if exists t_class;
create table t_class( //先創建父表
cno int,
cname varchar(255),
primary key(cno)
);
create table t_student(
sno int,
sname varchar(255),
classno int,
primary key(sno),
foreign key(classno) references t_class(cno) //參考
);
insert into t_class values(101,'xx'); //先添加父表
insert into t_student values(1,'zs1',101);
insert into t_student values(7,'lisi',103); //報錯:不能添加父表中的cno所沒有的classno
6.3 注意:外鍵可以為NULL;
外鍵欄位參考其他表的某個欄位的時候,被參考的欄位不一定是主鍵,但至少具有unique約束;
七.事務(Transaction):
7.1、一個事務是一個完整的業務邏輯單元,不可再分,
銀行賬戶轉賬,從A賬戶向B賬戶轉賬10000.需要執行兩條update陳述句:
update t_act set balance = balance - 10000 where actno = 'act-001';
update t_act set balance = balance + 10000 where actno = 'act-002';
以上兩條DML陳述句必須同時成功,或者同時失敗,不允許出現一條成功,一條失敗,而要想保證以上的兩條DML陳述句同時成功或者同時失敗,那么就需要使用資料庫的“事務機制”;
7.2、和事務相關的陳述句只有:DML陳述句(insert delete update)
為什么?因為它們這三個陳述句都是和資料庫表當中的“資料”相關的;事務的存在是為了保證資料的完整性,安全性,
7.3、假設所有的業務都能使用1條DML陳述句搞定,還需要事務機制嗎?
那就不需要了;但實際情況不是這樣的,通常一個“事兒(事務/業務)”需要多條DML陳述句共同聯合完成,
7.4、事務的特性?
事務包括四大特性:ACID
A: 原子性:事務是最小的作業單元,不可再分;
C: 一致性:事務必須保證多條DML陳述句同時成功或者同時失敗;
I:隔離性:事務A與事務B之間具有隔離;
D:持久性:持久性說的是最終資料必須持久化到硬碟檔案中,事務才算成功的結束;
7.5、關于事務之間的隔離性
事務隔離性存在隔離級別,理論上隔離級別包括4個:
第一級別:讀未提交(read uncommitted)
對方事務還沒有提交,我們當前事務可以讀取到對方未提交的資料;
讀未提交存在臟讀(Dirty Read)現象:表示讀到了臟的資料,
第二級別:讀已提交(read committed)
對方事務提交之后的資料我方可以讀取到;這種隔離級別解決了“臟讀現象”;
讀已提交存在的問題是:不可重復讀,
第三級別:可重復讀(repeatable read)
這種隔離級別解決了“不可重復讀問題”;
這種隔離級別存在的問題是:讀取到的資料是幻象,
第四級別:序列化讀/串行化讀(serializable)
解決了所有問題;但效率低,需要事務排隊,
oracle資料庫默認的隔離級別 --- 讀已提交(2);
mysq l資料庫默認的隔離級別 --- 可重復讀(3);
7.6、演示事務
* mysql事務默認情況下是自動提交的,
(什么是自動提交?只要執行任意一條DML陳述句則提交一次)怎么關閉自動提交 --- start transaction;
* 準備表:
drop table if exists t_user;
create table t_user(
id int primary key auto_increment,
username varchar(255)
);
* 演示:mysql中的事務是支持自動提交的,只要執行一條DML,則提交一次,
mysql> insert into t_user(username) values('zs');
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
+----+----------+
mysql> rollback; // 回滾(撤回未提交的操作)
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
+----+----------+
* 演示:使用start transaction 關閉自動提交機制:
mysql> start transaction;
mysql> insert into t_user(username) values('lisi');
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
| 2 | lisi |
+----+----------+
mysql> insert into t_user(username) values('wangwu');
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
| 2 | lisi |
| 3 | wangwu |
+----+----------+
mysql> rollback;
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
+----+----------+
--------------------------------------------------------------------
mysql> start transaction;
mysql> insert into t_user(username) values('wangwu');
mysql> insert into t_user(username) values('rose');
mysql> insert into t_user(username) values('jack');
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
| 4 | wangwu |
| 5 | rose |
| 6 | jack |
+----+----------+
mysql> commit; // 提交
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
| 4 | wangwu |
| 5 | rose |
| 6 | jack |
+----+----------+
mysql> rollback;
mysql> select * from t_user;
+----+----------+ //滾不回來已經提交的操作
| id | username |
+----+----------+
| 1 | zs |
| 4 | wangwu |
| 5 | rose |
| 6 | jack |
+----+----------+
* 演示兩個事務,假如隔離級別
演示第1級別:讀未提交:
set global transaction isolation level read uncommitted;
演示第2級別:讀已提交:
set global transaction isolation level read committed;
演示第3級別:可重復讀:
set global transaction isolation level repeatable read;
* mysql遠程登錄:mysql -h192.168.151.18 -uroot -p444
八.索引:
8.1、索引就相當于一本書的目錄,通過目錄可以快速的找到對應的資源;
在資料庫方面,查詢一張表的時候有兩種檢索方式:
第一種方式:全表掃描(效率低);
第二種方式:根據索引檢索(效率很高);
索引為什么可以提高檢索效率呢?
最根本的原理是縮小了掃描的范圍,
索引雖然可以提高檢索效率,但是不能隨意的添加索引,因為索引也是資料庫當中的物件,也需要資料庫不斷的維護,是有維護成本的;比如,表中的資料經常被修改這樣就不適合添加索引,因為資料一旦修改,索引需要重新排序,進行維護,
添加索引是給某一個欄位,或者說某些欄位添加索引;
8.2、怎么創建索引物件?怎么洗掉索引物件?
創建索引物件:
create index 索引名稱 on 表名(欄位名);
洗掉索引物件:
drop index 索引名稱 on 表名;
8.3、什么時候考慮給欄位添加索引?
* 資料量龐大(根據客戶的需求,根據線上的環境);
* 該欄位很少的DML操作(因為欄位進行修改操作,索引也需要維護);
* 該欄位經常出現在where子句中(經常根據哪個欄位查詢);
8.4、注意:主鍵和具有unique約束的欄位自動會添加索引;由于根據主鍵查詢效率較高,所以盡量根據主鍵檢索,
8.5、給薪資sal欄位添加索引:
mysql> create index emp_sal_index on emp(sal);
mysql> explain select ename,sal from emp where sal = 5000;
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
| 1 | SIMPLE | emp | ref | emp_sal_index | emp_sal_index | 9 | const | 1 | Using where |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
8.6、索引底層采用的資料結構是:B + Tree
8.7、索引的實作原理?
通過B Tree縮小掃描范圍,底層索引進行了排序,磁區,索引會攜帶資料在表中的“物理地址”,最終通過索引檢索到資料之后,獲取到關聯的物理地址,通過物理地址定位表中的資料,效率是最高的,
select ename from emp where ename = 'SMITH';
通過索引轉換為:
select ename from emp where 物理地址 = 0x3;
8.8、索引的分類?
單一索引:給單個欄位添加索引
復合索引: 給多個欄位聯合起來添加1個索引
主鍵索引:主鍵上會自動添加索引
唯一索引:有unique約束的欄位上會自動添加索引
....
8.9、索引什么時候失效?
select ename from emp where ename like '%A%';
模糊查詢的時候,第一個通配符使用的是%,這個時候索引是失效的;
九.視圖(view):
9.1、視圖:站在不同的角度去看到資料(同一張表的資料,通過不同的角度去看待),
9.2、怎么創建視圖?怎么洗掉視圖?
create view myview as select empno,ename from emp;
drop view myview;
注意:只有DQL陳述句才能以視圖物件的方式創建出來,
9.3、對視圖進行增刪改查,會影響到原表資料,(通過視圖影響原表資料的,不是直接操作的原表)
可以對視圖進行CRUD操作,
9.4、面向視圖操作?
create table emp_bak as select * from emp;
create view myview1 as select empno,ename,sal from emp_bak;
update myview1 set ename='hehe',sal=1 where empno = 7369; // 通過視圖修改原表資料
delete from myview1 where empno = 7369; // 通過視圖洗掉原表資料
9.5、視圖的作用?
視圖可以隱藏表的實作細節,保密級別較高的系統,資料庫只對外提供相關的視圖,java程式員只對視圖物件進行CRUD;
十.資料庫設計三范式(重點):
7.1、設計范式:設計表的依據,按照這個三范式設計的表不會出現資料冗余,
7.2、三范式都是哪些?
第一范式:任何一張表都應該有主鍵,并且每一個欄位原子性不可再分;
第二范式:建立在第一范式的基礎之上,所有非主鍵欄位完全依賴主鍵,不能產生部分依賴;
口訣;多對多?三張表,關系表兩個外鍵
t_student學生表
sno(pk) sname
-------------------
1 張三
2 李四
3 王五
t_teacher 講師表
tno(pk) tname
---------------------
1 王老師
2 張老師
3 李老師
t_student_teacher_relation 學生講師關系表
id(pk) sno(fk) tno(fk)
----------------------------------
1 1 3
2 1 1
3 2 2
4 2 3
5 3 1
6 3 3
第三范式:建立在第二范式的基礎之上,所有非主鍵欄位直接依賴主鍵,不能產生傳遞依賴,
口訣:一對多?兩張表,多的表加外鍵
班級t_class
cno(pk) cname
--------------------------
1 班級1
2 班級2
學生t_student
sno(pk) sname classno(fk)
---------------------------------------------
101 張1 1
102 張2 1
103 張3 2
104 張4 2
105 張5 2
注意:在實際的開發中,以滿足客戶的需求為主,有的時候會拿冗余換執行速度,
7.3、一對一怎么設計?
第一種設計方案 --- 主鍵共享
t_user_login 用戶登錄表
id(pk) username password
--------------------------------------
1 zs 123
2 ls 456
t_user_detail 用戶詳細資訊表
id(pk+fk) realname tel ....
------------------------------------------------
1 張三 1111111111
2 李四 1111415621
第二種設計方案 --- 外鍵唯一
t_user_login 用戶登錄表
id(pk) username password
--------------------------------------
1 zs 123
2 ls 456
t_user_detail 用戶詳細資訊表
id(pk) realname tel userid(fk+unique)....
-----------------------------------------------------------
1 張三 1111111111 2
2 李四 1111415621 1
隨筆:
1.增刪改查有一個術語:CRUD操作
Create(增) Retrieve(檢索) Update(修改) Delete(洗掉)
2.復合主鍵(不需要掌握):
drop table if exists t_user;
create table t_user(
id int,
username varchar(255),
password varchar(255),
primary key(id,username)
);
insert .......
3、DBA命令
3.1、將資料庫當中的資料匯出
在windows的dos命令視窗中執行:(匯出整個庫)
mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p333
在windows的dos命令視窗中執行:(匯出指定資料庫當中的指定表)
mysqldump bjpowernode emp>D:\bjpowernode.sql -uroot –p123
3.2、匯入資料
create database bjpowernode;
use bjpowernode;
source D:\bjpowernode.sql
4.存盤引擎:(了解)
4.1、完整的建表陳述句
CREATE TABLE `t_x` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
注意:在MySQL當中,凡是識別符號是可以使用飄號括起來的,最好別用,不通用,
建表的時候可以指定存盤引擎,也可以指定字符集,
mysql默認使用的存盤引擎是InnoDB方式,
默認采用的字符集是UTF8
4.2、什么是存盤引擎呢?
存盤引擎這個名字只有在mysql中存在,(Oracle中有對應的機制,但是不叫做存盤引擎,Oracle中沒有特殊的名字,
就是“表的存盤方式”)
mysql支持很多存盤引擎,每一個存盤引擎都對應了一種不同的存盤方式,
每一個存盤引擎都有自己的優缺點,需要在合適的時機選擇合適的存盤引擎,
4.3、查看當前mysql支持的存盤引擎?
show engines \G
mysql 5.5.36版本支持的存盤引擎有9個:
*************************** 1. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 9. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
4.4、常見的存盤引擎?
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
MyISAM這種存盤引擎不支持事務,
MyISAM是mysql最常用的存盤引擎,但是這種引擎不是默認的,
MyISAM采用三個檔案組織一張表:
xxx.frm(存盤格式的檔案)
xxx.MYD(存盤表中資料的檔案)
xxx.MYI(存盤表中索引的檔案)
優點:可被壓縮,節省存盤空間,并且可以轉換為只讀表,提高檢索效率,
缺點:不支持事務,
-----------------------------------------------------------------------------
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
優點:支持事務、行級鎖、外鍵等,這種存盤引擎資料的安全得到保障,
表的結構存盤在xxx.frm檔案中
資料存盤在tablespace這樣的表空間中(邏輯概念),無法被壓縮,無法轉換成只讀,
這種InnoDB存盤引擎在MySQL資料庫崩潰之后提供自動恢復機制,
InnoDB支持級聯洗掉和級聯更新,
-------------------------------------------------------------------------------------
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
缺點:不支持事務,資料容易丟失,因為所有資料和索引都是存盤在記憶體當中的,
優點:查詢速度最快,
以前叫做HEPA引擎,
5.索引實作原理:

資料出處:https://www.bilibili.com/video/BV1fx411X7BD
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/379489.html
標籤:MySQL
