mySql常用操作
一、SQL語句分類
1、DDL語句(資料庫定義語言): 資料庫、表、檢視、索引、儲存過程,例如:CREATE、DROP、ALTER
2、DML語句(資料庫操縱語言): 插入資料INSERT、刪除資料DELETE、更新資料UPDATE、查詢資料SELECT
3、DCL語句(資料庫控制語言): 控制使用者的訪問許可權GRANT、REVOKE
二、操作庫
mysql自帶的庫:
information_schema: 虛擬庫,不佔用磁碟空間,儲存的是資料庫啟動後的一些引數,如使用者表資訊、列資訊、許可權資訊、字元資訊等
performance_schema: MySQL 5.5開始新增一個數據庫:主要用於收集資料庫伺服器效能引數,記錄處理查詢請求時發生的各種事件、鎖等現象
mysql: 授權庫,主要儲存系統使用者的許可權資訊
test: MySQL資料庫系統自動建立的測試資料庫
連線資料庫,檢視已有的資料庫,show databases;
建立庫
指定編碼:create database zss charset utf8;
使用資料庫:use zss;
查詢庫
show create database zss;
show databases; 展示所有的資料庫
檢視庫位置:find / -name zss
檢視當前所在的庫:select database();
改庫
修改編碼: alter database zss charset gbk;
刪庫
drop database zss;
三、操作表及列
切換資料庫:use zss;
檢視當前所在資料庫(資料夾):select database();
增加表
create table 表名(
欄位名
1
型別[(寬度) 約束條件],
欄位名
2
型別[(寬度) 約束條件],
欄位名
3
型別[(寬度) 約束條件]
);
create table test(id int, name varchar(255));
增加後,多了一個test.frm檔案,frm是表結構
查詢表
show create table test \G; \G表示按行顯示錶的詳細結構
show tables;
desc test; # 等價於describe test;
插入資料:insert test(id,name) values(1,'tom'),(2,'jack'),(3,'tony');
複製表 複製表結構+記錄:create table test2 select * from test;只複製表結構:create table test3 select * from test where 1=2;
或者:create table test4 like test;
改表
ALTER TABLE 表名
# 修改表名
RENAME 新表名;
# 增加欄位
ADD 欄位名 資料型別 [完整性約束條件…];
ADD 欄位名 資料型別 [完整性約束條件…] FIRST;
# 新增到第一個欄位
ADD 欄位名 資料型別 [完整性約束條件…] AFTER 欄位名;
# 新增到某個欄位之後
# 刪除字典
DROP 欄位名;
# 修改欄位
MODIFY 欄位名 資料型別 [完整性約束條件…];
CHANGE 舊欄位名 新欄位名 舊資料型別 [完整性約束條件…];
CHANGE 舊欄位名 新欄位名 新資料型別 [完整性約束條件…];
說明:
MODIFY,可以改欄位屬性
CHANGE,可以改欄位名、欄位屬性
例如:
alter table test modify name varchar(256);
desc test;
alter table test change name NAME varchar(257);
desc test;
刪除表
drop table test;
四、操作記錄資料
增資料
全欄位插入:INSERT INTO 表名(欄位
1
,欄位
2
,欄位
3
…欄位n) VALUES(值
1
,值
2
,值
3
…值n);
多條資料逗號分隔INSERT INTO 表名 VALUES
(值
1
,值
2
,值
3
…值n),
(值
1
,值
2
,值
3
…值n),
(值
1
,值
2
,值
3
…值n);
指定欄位插入:INSERT INTO 表名(欄位
1
,欄位
2
,欄位
3
…) VALUES (值
1
,值
2
,值
3
…);
例如:
create table test(id int, name varchar(255));
insert test(id,name) values(1,'tom'),(2,'jack'),(3,'tony');
刪資料
delete from test where id=3;
delete,用於刪除資料,自增長欄位的值未重置
truncate,用於清空表,自增長欄位的值也被重置
改資料
UPDATE 表名
SET
欄位
1
=
值
1
WHERE 約束條件;
update test set name='meimei' where id=2;
查資料
select * from test;
如果在其它庫查test,表前必須加庫作為字首。select * from zss.test;
五、資料型別
數字型別
參考:https://www.runoob.com/mysql/mysql-data-types.html
日期型別
例如:create table student(
id
int
,
name char(
6
),
# 最大儲存6個字元
born_year year,
# 年
birth_date date,
# 年月日
class_time time,
# 時分秒
reg_time datetime
# 年月日時分秒
);
插入資料
insert into student values(
1
,
'jack'
,now(),now(),now(),now());
insert into student values(
2
,
'tom'
,
"2022"
,
"2022-5-1"
,
"00:00:00"
,
"2022-5-1 00:00:00"
);
now()是mysql提供的函式,當前時間
字元型別
# 寬度指的是字元的個數
create table test(name char(
5
));
create table test(name varchar(
5
));
char:按指定長度存,存取速度快,但是當存的資料的長度小於欄位定義的長度時浪費空間
varchar:存資料更精簡,更加節省空間(是在存的資料的長度小於欄位定義的長度時),缺點,存取速度慢,要先存頭,再存資料;先取頭,再取資料;
現如今,儲存空間已經不是限制了,要追求存取速度,大部分用char,與查詢無關的用varchar
建表的時候,定長的資料往前放,變長的往後放,而且,一張表中,不要char和varchar混用
列舉及集合型別
enum 單選,只能在給定的範圍內選一個值,如性別
sex enum('male','female','other'),
set 多選,在給定的範圍內可以選擇一個或一個以上的值(愛好1,愛好2,愛好3...)
hobbies set('play','music','read','run')
drop table test;
create table test(
id
int
,
name char(
16
),
sex enum(
'male'
,
'female'
,
'other'
),
hobbies
set
(
'play'
,
'music'
,
'read'
,
'run'
)
);
插入資料:
insert into test values(1,'jack','male','music,read'); # 集合多個值用逗號分隔
六、儲存引擎
分類:
InnoDB 儲存引擎
MyISAM 儲存引擎
NDB 儲存引擎
Memory 儲存引擎
Infobright 儲存引擎
NTSE 儲存引擎
BLACKHOLE
七、約束
作用:保證資料的完整性和一致性
分類:PRIMARY KEY (PK),標識該欄位為該表的主鍵,可以唯一的標識記錄
FOREIGN KEY (FK),標識該欄位為該表的外來鍵
NOT NULL,標識該欄位不能為空
UNIQUE KEY (UK),標識該欄位的值是唯一的
AUTO_INCREMENT, 標識該欄位的值自動增長(整數型別,而且為主鍵)
DEFAULT, 為該欄位設定預設值
primary key
#方法一:在某一個欄位後用primary key
create table test(
id
int
primary key,
name char(
255
)
);
#方法二:not null+unique
建立表時未指定主鍵,會找不為空且唯一的欄位作為主鍵
create table test(
id
int
not
null unique,
name char(
255
)
);
#方法三:在所有欄位後單獨定義primary key
create table test(
id
int
,
name varchar(
255
),
constraint pk_name primary key(
id
)
);
foreign key
建立表之間的關係
create table student(
id
int
primary key,
name char(
255
),
age
int
);
# 關聯的表
create table
class
(
id
int
primary key,
name char(
255
),
stu_id
int
,
foreign key(stu_id) references student(
id
)
on delete cascade
# 刪除同步
on update cascade
# 修改同步
);
not null 與default
create table test(
id
int
,
name char(
255
),
sex enum(
'male'
,
'female'
)
not
null default
'male'
);
unique key
方式一、
create table test(
id
int
unique,
name char(
255
) unique
);
方式二、
create table test(
id
int
,
name char(
255
),
unique(
id
),
unique(name)
);
聯合唯一
create table test(
id
int
,
name char(
255
),
unique(
id
,name)
);
複合主鍵
create table test(
id
int
,
name char(
255
),
primary key(
id
, name)
);
auto_increment
約束欄位為自動增長,增長欄位必須設定為primary key,unique key
create table test(
id
int
primary key auto_increment,
name char(
255
)
);
八、表和表之間的關係
一對一
一對多
多對多
select distinct 欄位1,欄位2,欄位3 # 要查詢的欄位或者分組欄位聚合函式
from 庫.表 # 從哪個表查,如果當前所在的庫不是這個表所在的庫,表的前面需要加上庫名
where # 約束條件
group by # 分組
having # 過濾
order by # 排序
limit # 限制條數
如果是多表,加個join及連線條件就可以了,很簡單。
說明:where
where是分組之前過濾,後面是普通條件
1.
比較運算子:><>
=
<
=
<> !
=
2.
邏輯運算子:在多個條件直接可以使用邏輯運算子
and
or
not
3.between
10
and
100
值在
10
到
100
之間
4.in
(
80
,
90
) 值是
80
或
90
5.like
'qzcsbj%'
,除了
%
還可以_,
%
表示任意多字元,_表示一個字元
having
having是分組之後過濾,後面是聚合條件
聚合函式(以組為單位進行統計)
max,最大
min,最小
avg,平均
sum,和
count,數量
order by
預設升序,asc
降序,desc
也可以先按某個欄位升序,再按某個欄位降序,例如:select * from test order by id asc, name desc;
limit
limit n,預設初始位置為0,從1開始取,取n條,如果不足n條記錄,那麼有多少條就取多少條
limit m,n,表示位置m,從m+1開始取,取n條記錄,如果不足n條記錄,那麼有多少條就取多少條
執行順序
5
select <br>
6
distinct
1
from
庫.表
2
where
3
group by
4
having
7
order by
8
limit
九、多表查詢
內連線:只取兩張表的共同部分,join on
左外連線:顯示左表全部記錄,在內連線的基礎上增加左邊有右邊沒有的結果,left join on
右外連線:顯示右表全部記錄,在內連線的基礎上增加右邊有左邊沒有的結果,right join on
全外連線:
顯示左右兩個表全部記錄,在內連線的基礎上增加左邊有右邊沒有的和右邊有左邊沒有的結果,
union,其與union all的區別是,union會去掉相同的紀錄,另外,mysql不支援full join on
十、內建函式
數值函式
字串函式
日期時間函式
流程控制函式
系統資訊函式
十一、賬號許可權管理
建立新使用者:CREATE USER 'test'@'localhost' IDENTIFIED BY '123456';
新使用者授權:GRANT ALL PRIVILEGES ON *.* TO 'test'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
重新整理授權:flush privileges;