mysql資料庫基礎操作
摘要:
本篇文章記錄學習mysql的操作過程,不會涉及過多的理論,更多的是直接操作。環境:win10
工具:mysql命令列
0x01 連線與退出mysql
1.1 連線mysql資料庫
連線mysql有很多的途徑,可以通過客戶端軟體(又叫資料庫管理系統)連線,比如:Navicat 、MySQL-Front等。web端的有phpMyAdmin。這些都是影象化介面的。也可以通過命令列來操作,接下來就用命令列進行操作。
進入mysql的bin目錄,裡面有一個mysql.exe,在這個目錄下開啟cmd。
--連線資料庫,其中,-h == host 是mysql部署的ip地址,-P == Port:mysql服務埠,-u == username:登入使用者名稱,-p == password:登入密碼 mysql -hlocalhost -P3306 -uroot -proot -- 如果連線本地資料庫 -h可以省略 如果伺服器埠是3306,-P埠號也可以省略 mysql -uroot -proot --以安全的形式登入 mysql -uroot -p Enter password: ****(這裡輸入密碼)
1.2退出mysql命令列
mysql> exit -- 方法一
mysql> quit -- 方法二
mysql> \q -- 方法三
0x02 資料庫操作
2.1 檢視資料庫
--檢視有哪些資料庫
show databases;
2.2 建立資料庫
語法:
create database [if not exists] 資料名 [選項]
程式碼:
-- 建立資料庫 create database student; -- 建立資料庫時,如果資料庫已經存在就要報錯 # ERROR 1007 (HY000): Can't create database 'stu'; database exists -- 在建立資料庫時候,判斷資料庫是否存在,不存在就建立 create database if not exists stu; -- 特殊字元、關鍵字做資料庫名,使用反引號將資料庫名括起來 create database `create`; --create是關鍵字 create database `%$`; -- 建立資料庫時指定儲存的字元編碼,如果不指定編碼,資料庫預設使用安裝資料庫時指定的編碼:latin create database emp charset=gbk; create database SC charset=utf8; -- 檢視所有字符集語句: show character set;
2.3 資料庫的目錄
資料庫檔案的儲存路徑在安裝mysql
的時候就已經預設配置好了.我們也可以在my.ini配置檔案中更改資料庫檔案的儲存地址。(datadir = "xxx/MySQL/data/"
)
一個數據庫就對應一個資料夾,在資料夾中有一個db.opt檔案。再此檔案中設定資料庫的字符集和校對集。瞭解字符集和校對集請參考:mysql之字符集與校對集
2.4 刪除資料庫
語法:drop database [if exists] 資料庫名
程式碼:
drop database `create`;
drop database stu;
-- 判斷資料庫是否存在,如果存在就刪除
drop database if exists student;
2.5 顯示建立資料庫語句
語法:
show create database 資料庫名
程式碼:
show create database test;
2.6 修改資料庫
只能修改資料庫的選項,資料庫的選項只有字符集
語法:alter database 資料庫名 charset=字元編碼
程式碼:
alter database emp charset=utf8; -- 在mysql裡utf編碼是utf8而不是 utf-8
2.7 選擇資料庫
語法:use database_name
例如:
use test;
0x03 表操作
首先選中某一資料庫,然後在這個資料庫中執行表的相關操作。
顯示資料庫中的所有表:show tables;
3.1 建立表
語法:
create table [if not exists] `表名`(
`欄位名` 資料型別 [null|not null] [default] [auto_increment] [primary key] [comment],
`欄位名 資料型別 …
)[engine=儲存引擎] [charset=字元編碼]
-- 說明:
/*
null|not null 是否為空
default: 預設值
auto_increment 自動增長,預設從1開始,每次遞增1
primary key 主鍵,主鍵的值不能重複,不能為空,每個表必須只能有一個主鍵
comment: 備註
engine 引擎決定了資料的儲存和查詢 myisam、innodb
注意:表名和欄位名如果用了關鍵字,要用反引號引起來。
*/
例如:建立一個學生表:
create table student(
sno int auto_increment primary key comment '主鍵',
name varchar(10) not null comment '姓名',
age int comment'年齡',
sex varchar(2) comment '性別',
grade int comment '學生成績'
)engine=innodb;
/*
說明:
1.如果不指定引擎,預設是innodb
2.如果不指定字元編碼,預設和資料庫編碼一致
*/
3.2 資料表文件相關說明
一個數據庫對應一個資料夾
一個表對應一個或多個檔案
mysql裡面引擎有兩個:myisam和innodb
如果引擎是myisam,一個表對應三個檔案
.frm:儲存的是表結構
.myd:儲存的是表資料
.myi:儲存的表資料的索引
引擎是innodb,一個表對應一個表結構檔案,innodb的都有表的資料都儲存在ibdata1檔案中.
如果資料量很大,會自動的建立ibdata2,ibdata3...
innodb和myisam的區別(推薦使用innodb)
引擎 | 特點 |
---|---|
myisam | 1、查詢速度快 2、容易產生碎片 3、不能約束資料 |
innodb | 1、以前沒有myisam查詢速度快,現在已經提速了 2、不產生碎片 3、可以約束資料 |
3.3 顯示建立表的語句
語法:
show create table 表名; -- 結果橫著排列
show create table 表名 \G --結果豎著排列(便於檢視)注意沒有分號
3.4 查看錶結構
語法:desc[ribe] 表名
3.5 刪除表
語法:drop table [if exists] table1,table2,...
eg.
-- 刪除表
drop table t1;
-- 如果表存在就刪除
drop table if exists t2;
-- 一次刪除多個表
drop table t3,t4;
3.6 複製表
語法1:create table 新表 select 欄位 from 舊錶
特點:不能複製舊錶的鍵,能夠複製舊錶的資料。
語法2:create table 新表 like 舊錶
特點:只能複製表結構,不能複製表資料.
3.7 修改表
語法:alter table 表名
1.新增欄位:alter table 表名 add [column] 欄位名 資料型別 [位置]
eg.
--預設新增欄位放在最後
alter table course add cno varchar(20);
-- 在cno之後新增cpo欄位
alter table course add cpo varchar(20) after cno;
-- 新增Ccredit並將Ccredit放到表的最前面
alter table course add Ccredit int first;
2.刪除欄位:alter table 表名 drop [column] 欄位名
eg.
alter table student drop age; -- 刪除age欄位
3.修改欄位(改名):alter table 表名 change [column] 原欄位名 新欄位名 資料型別 …
-- 將name欄位改為cname varchar(20)
alter table course change name cname varchar(20);
4.修改欄位(不改名):alter table 表名 modify 欄位名 欄位屬性…
--將sex欄位的資料型別修改為varchar(1)
alter table student modify sex varchar(1);
5.修改引擎:alter table 表名 engine=引擎名
--將student表的引擎改為myisam
alter table student engine=myisam;
6.修改表名:alter table 表名 rename to 新表名
-- 將表名student改為stu
alter table student rename to stu;
7.將表移動到其他資料庫
-- 將當前資料庫中的stu表移到test資料庫中,並且改名為student
alter table stu rename to test.student;
0x04 資料操作
4.1 插入資料
語法:insert into 表名 (欄位名, 欄位名,…) values (值1, 值1,…)
eg.
/*
說明:
1.插入資料的欄位和表的欄位可以順序不一致。但是插入欄位名和插入的值一定要一一對應
2.當省略欄位列表時,等同於插入資料的順序和個數與原表相同
3.可以插入指定的欄位,其他的欄位預設為null(或者設定default)
4.可以插入預設值和空值;
5.可以一次插入多條資料,資料之間用逗號隔開,最後一條資料用分號結尾;
*/
-- 在student表中插入資料,(插入所有欄位)
insert into student (sno,name,age,sex,grade)
values
(1,'張三',18,'男',99);
-- 在student表中插入資料,(插入部分指定欄位)
insert into student (sno,name)
values
(2,'李四');
-- 插入資料的欄位和表的欄位可以順序不一致。但是插入欄位名和插入的值一定要一一對應
insert into student (name,sno)
values
('王五',3);
--如果插入的值的順序和個數與表字段的順序和個數一致,插入欄位可以省略。
insert into student
values
(4,'張偉',19,'男',98);
--可以插入預設值和空值,default用來指定預設值,null用來指定空值(空值就是不知道,不存在的值)
insert into student (sno,name,age,sex)
values
(5,'doby',default,null);
-- 一次插入多條資料,資料之間用逗號隔開,最後一條資料用分號結尾
insert into student (sno,sname,age)
values
(6,'李剛',19),
(7,'李偉',20),
(8,'張麗麗',18);
4.2 更新資料
語法:update 表名 set 欄位=值 [where 條件]
eg.
--將1號學生的年齡改為20歲
update student
set age=20
where sno=1;
-- 將1號學生的姓名改為王麗麗,性別改為女 (中間用逗號隔開)
update student
set name='王麗麗',sex='女'
where sno = 1;
4.3 刪除資料
語法:delete from 表名[where 條件]
eg.
-- 刪除6號學生
delete from student
where sno = 6;
-- 刪除名字是李四的學生
delete from student
where name='李四';
--刪除所有資料
delete from student;
delete from 和truncate table 的區別?
1.delete from 表名:遍歷表記錄,一條一條的刪除
2.truncate table 表名:將原表銷燬,再建立一個同結構的新表。就清空表而言,這種方法效率高。
4.4 查詢語句
語法:select 列明 [from 表名] [where條件]
eg.
-- 查詢sno為1的學生的資訊
select * from student where sno=1;
-- 查詢所有學生的學號和姓名
select sno,name from student ;
-- 查詢所有欄位的值
select * from sutdent;
0x05 mysql字符集與校對集
5.1 mysql字符集
概念與操作:
1.character_set_client:伺服器認為的客戶端編碼
2.character_set_connection:連線層用什麼編碼
3.character_set_results:查詢的結果用什麼編碼顯示
4.編碼範圍:ladin1<gb2312<gbk<utf8
檢視所有字符集語句:show character set;
檢視資料庫編碼情況:
更改編碼:
set character_set_client=xxx;
set character_set_connection=xxx;
set character_set_results=xxx;
執行SQL語句時資訊的路徑是這樣的一個
資訊輸入路徑:client→connection→server;
資訊輸出路徑:server→connection→results;
如圖所示:
亂碼解決方案與總結:
1.編碼集的大小要遵循:client<connection<server,否則會出現編碼部分丟失的情況。
e.g.
client:utf-8,connection:ladin1
在utf-8 => ladin1 轉換過程中,中文會因為無法在latin1字符集中表示而被轉換為“?”(0×3F)符號,以後查詢時不管連線字符集設定如何都無法恢復其內容了。
2.明確客戶端的編碼,客戶端編碼最好和character_set_client一致。
3.資料庫使用utf-8,範圍很大,其他編碼轉為utf-8時,不會出現編碼部分丟失的情況。
4.實際的客戶端編碼、character_set_result、character_set_client三者一致。
e.g
命令列的編碼是gbk(客戶端實際編碼)。
資料庫編碼情況
問題:
分析:
編碼情況
客戶端輸入的資料:張三(gbk編碼)
實際客戶端:gbk
client:utf8
connection:utf8
database:utf8
result:utf8
處理過程如下:
那麼如何解決呢?很簡單,只需要將results的編碼設定為gbk即可,如圖:
5.1 mysql校對集(開發很少用,瞭解即可)
1、概念:在某種字符集下,字元之間的比較關係,比如a和B的大小關係,如果區分大小寫a>B,如果不區分大小寫則a<B。
2、校對集依賴與字符集,不同的字符集的的比較規則不一樣,如果字符集更改,校對集也重新定義。
3、不同的校對集對同一字元序列比較的結果是不一致的。
4、 可以在定義字符集的同時定義校對集、 語法:collate=xxx
e.g.
--建立表stu1,並設定字符集為utf8、校對集為utf8_general_ci
create table stu1
(
name char(1)
)charset=utf8 collate=utf8_general_ci;
--建立表stu2,並設定字符集為utf8、校對集為utf8_bin
create table stu2
(
name char(1)
)charset=utf8 collate=utf8_bin;
-- 查詢測試,不區分大小寫
select * from stu1 order by name;
/*
+------+
| name |
+------+
| a |
| B |
+------+
*/
-- 查詢測試,區分大小寫
select * from stu2 order by name;
/*
+------+
| name |
+------+
| B |
| a |
+------+
*/
校對集規則:
_bin:按二進位制編碼比較,區別大小寫
_ci:不區分大小寫
本文到此結束!