1. 程式人生 > 資料庫 >mysql資料庫基礎操作

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 複製表

語法1create table 新表 select 欄位 from 舊錶
特點:不能複製舊錶的鍵,能夠複製舊錶的資料。

語法2create 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:不區分大小寫

本文到此結束!