一、數據庫的搭建
如上篇文章
二、基礎了解
show命令支持模糊匹配
show databases、show tables、
show databases like “····”
“%”、“_”通配符字符串
三、MySQL數據庫表的操作
關系型數據庫都是遵循SQL語法進行數據查詢和管理的
3.1 SQL介紹
3.1.1 SQL的功能
結構化查詢語言(Structured Query Lauguage),在關系型數據庫上執行數據庫操作、數據檢索以及數據維護的標準語言;使用SQL語句,程序員和數據庫管理員可以完成如下的任務:1.改變數據庫的結構2.更改系統的安全設置3.增加用戶對數據庫或表的許可權限4.在數據庫中檢索需要信息5.對數據庫的信息進行更新
3.1.2 SQL的分類
1.DDL(data definition language):數據定義語言,定義對數據庫對象(庫、表、列、索引的操作)create、drop、alter、rename、truecate 2.DML(data manipulation language):數據操作語言 3.DQL:數據查詢語言 4.DCL:數據控制語言,定義對數據庫】表、字段、用戶的訪問權限和安全級別。
3.1.3 SQL語句的規范
在數據庫系統中,SQL語句不區分大小寫(關鍵字建議用大寫) 。但字符串常量區分大小寫。 SQL語句可單行或多行書寫,以“;”結尾。關鍵詞不能跨多行或簡寫。用空格和縮進來提高語句的可讀性。子句通常位于獨立行,便于編輯,提高可讀性。SELECT * FROM tb_table 注釋:SQL標準:/**/。多行注釋“-- ” 單行注釋MySQL注釋:“#”
3.2 MySQL的數據庫編碼
MySQL的默認編碼是Lain1的編碼,Lain1支持西歐字符、希臘字符等。 在早期MySQL為了兼容像中文這種符號,提供了utf-8編碼,第四個字節拿來存儲表情包,所以不太建議使用utf-8,建議使用真正的utf8mb4 ? MySQL自帶數據庫: Information_schema:主要存儲了系統中的一些數據庫對象信息:如用戶表信息、列信息、權限信息、字符集信息、分區信息等。(數據字典表); performance_schema:主要存儲數據庫服務器的性能參數; mysql:存儲了系統的用戶權限信息及幫助信息。sys :5.7新增,之前版本需要手工導入。這個庫是通過視圖的形式把information_schema 和performance_schema結合起來,查詢出更加令人容易理解的數據;test:系統自動創建的測試數據庫,任何用戶都可以使用。
3.3 數據庫操作
3.3.1 create創建
CREATE DATABASE 數據庫名稱
?
####創建數據庫同時指定編碼####
create database db_name default charset="utf8mb4";
create database schOOl DEFAULT CHARACTER SET utf8mb4;
create database schOOl DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
?
####查詢當前數據庫是哪個數據庫###
create database();
?
###查看創建的數據庫###
show create database 數據庫名稱;
3.3.2 drop刪除數據庫
drop database 數據庫名稱;
3.3.3 查看數據庫編碼情況
show variables like "char%";
3.4數據表的操作
數據表是一種二維表格,類似于excel,用來存儲真正的數據;
3.4.1 create創建表格
####語法結構####
create table [if not exists] t_name(###定義表結構###字段名稱1 類型 [約束條件],字段名稱2 類型 [約束條件],······####最后一個不能加逗號###字段名稱N 類型 [約束條件]
)
/**創建一個用戶表用戶的姓名用戶的年齡用戶的性別用戶的地址用戶的電話
**/create table t_user(id int,name varchar(50),age int,gender char(5),address varchar(255),tel char(11))##查詢數據
select * from t_user;
?
###插入數據
insert into t_user values(1,'肖金鳳',18,'女','四川南充','322');
insert into t_user values('小辣椒',19,'女');
注意:查詢SQL時,如果結果較多,查看不方便,則可以反轉查詢的結果,在SQL后面加上‘\g’。
3.4.2 數據類型
數據庫在MySQL中,有三種主要的類型:文本、數字和日期/時間類型。
3.4.3 char和varchar的區別
char
和varchar
是數據庫中用于存儲字符串數據的兩種數據類型,它們之間的主要區別如下:
1.存儲長度:
-
char
:是一種固定長度的字符串類型。當你定義一個char
類型字段時,你需要指定一個長度,例如char(10)
。無論你存儲的字符串實際長度如何,數據庫都會為這個字段分配固定的存儲空間(在這個例子中是10個字符的空間)。如果實際存儲的字符串長度小于定義的長度,數據庫會在字符串的末尾填充空格來達到指定的長度。 -
varchar
:是一種可變長度的字符串類型。定義varchar
類型字段時,也需要指定一個最大長度,例如varchar(10)
。但是,數據庫只為實際存儲的字符串長度分配空間,加上一個額外的字節(或兩個字節,取決于具體的數據庫實現和字符串長度)來記錄字符串的長度。如果存儲的字符串是空字符串,那么varchar
字段幾乎不占用任何空間。
2.性能:
-
char
:由于char
類型的長度是固定的,所以在某些情況下,數據庫可以更快地處理char
類型的數據,因為存儲和檢索時不需要計算實際的長度。 -
varchar
:雖然varchar
在存儲空間上更為高效,但在處理時可能需要額外的計算來確定字符串的實際長度,這可能會稍微影響性能。
3.使用場景:
-
char
:適用于存儲長度固定或幾乎總是相同長度的字符串,例如郵政編碼、電話區號等。 -
varchar
:適用于存儲長度可變的字符串,例如姓名、地址等。
4.空間利用率:
-
char
:可能會浪費存儲空間,因為即使實際數據沒有達到定義的長度,也會占用全部的空間。 -
varchar
:空間利用率較高,只占用實際數據長度加上長度記錄的空間。
5.字符串比較:
-
char
:在比較時,可能會考慮填充的空格,這可能會導致一些意外的結果。 -
varchar
:比較時通常不考慮填充的空格,更符合直觀的字符串比較邏輯。
在選擇使用`char`還是`varchar`時,應根據實際的數據特性和應用需求來決定。如果字符串長度固定或對性能有特別要求,可以考慮使用`char`。如果字符串長度變化較大,且希望節省存儲空間,則應使用`varchar`。
\G:反轉九十度
3.4.4 數據庫的約束
創建數據庫的時候,可以有多個約束。 存在如下一些數據庫表的約束:默認值、主鍵、非空、外鍵、唯一檢查約束
1.主鍵約束
-
主鍵功能上看相當于非空且唯一,一個表中只允許一個主鍵,主鍵是表中唯一確定一行數據的字段。
主鍵的值一般是沒有意義的; 并且一般會加auto_increment(只加在主鍵后!) ---- 自增
2.唯一約束
作用:是保證該字段的值是唯一的;
#唯一性約束條件確保所在的字段或者字段組合不出現重復值;
#唯一性約束條件的字段允許出現一個NULL
#同一張表內可建多個唯一約束
#唯一約束可由多列組合而成
#建唯一約束時MySQL會為之建立對應的索引---也就是唯一索引。
#如果不給唯一約束起名,該唯一約束默認與列名相同。
?
#####第一種####
mysql> create table tb_student(-> id int primary key auto_increment,-> name varchar(18) unique --- 唯一約束-> );#####第二種#####
create table t_user(id int auto_increment,name varchar(18),primary key(id),unique(name));
3.默認值約束
####comment也可以跟在后面,也就是描述信息###
mysql> create table t_user(-> id int primary key auto_increment,-> name varchar(50) unique,-> age int-> );
Query OK, 0 rows affected (0.00 sec)
?
mysql> show tables;
+-----------------+
| Tables_in_db_ck |
+-----------------+
| db_hero ? ? ? ? |
| t_user ? ? ? ? |
+-----------------+
2 rows in set (0.00 sec)
?
mysql> insert into t_user values(1,"肖金鳳",18);
Query OK, 1 row affected (0.01 sec)
?
mysql> select * from t_user;
+----+-----------+------+
| id | name ? ? | age |
+----+-----------+------+
| ?1 | 肖金鳳 ? | ? 18 |
+----+-----------+------+
1 row in set (0.00 sec)
?
?
#####加個默認值#####
mysql> create table t_user(-> id int primary key auto_increment,-> name varchar(50) unique,-> age int default 18 ? ---- 默認值約束-> );
4.非空約束
不允許字段的值為空 create table t_user(id int primary key auto_increment,name varchar(50) unique not null,age int default 18,password varchar(255) not null ?--- 非空約束);
5.外鍵約束
-
是一個獨立字段
外鍵指的是兩張或者多張表之間關聯關系的字段; 外鍵約束:是表的約束,是約束表在插入外鍵數據時能夠正確地插入。 ? #外鍵是構建于一個表的兩個字段或者兩個表的兩個字段之間的關系 #外鍵確保了相關的兩個字段的兩個關系: 子(從)表外鍵列的值必須在主表參照值的范圍內,或者為空(也可以加非空約束,強制不允許為空)。 當主表的記錄被子表參照時,主表記錄不允許被刪除。 外鍵參照的只能是主表主鍵或者唯一鍵,保證子表記錄可以準確定位到被參照的記錄。###在創建表的同時,將外鍵約束添加上 ###首先保證班級表創建成功 #插入正確的數據 create table grade(id int auto_increment,name varchar(50) unique,primary key(id)) insert into grade(name) value("english"),("python"),("biochemistry"),("network");
1.外鍵如何設計?
表的關聯:1:1 ----> 外鍵可以設計在任意一方,不會產生數據冗余1:N ----> 外鍵設計在多方N:N ----> 創建第三張表,來專門描述兩張表的關聯關系
2.如何約束外鍵,保證不出錯
需要添加外鍵約束:foreign key1.在創建數據庫表的時候添加外鍵2.通過alter指令修改[CONSTRAINT] foreign key(字段) references 表(字段) [on delete RESTRICT | cacade | set null | xxx]
?
#內連接(只查存在關聯的數據)
如果兩張或多張關聯關系表查詢時,不指定他們的關聯關系,則會出現笛卡爾積現象
select * from t_stu,t_classes;
select * from t_stu cross join t_Classes;
?
select * from t_stus /(inner)/ join t_classes on(t_stus.class.id=t_classes.id)
?
#外連接:如果要將這些沒關聯關系的數據查詢出來,則需要使用外連接
select * from t_stus right outer join t_classes on(t_stus.class_id=t_classes.id)
?
#自連接:只能查詢出存在關聯關系的數據,如果不存在關聯關系,就不行
?
# 注意:mysql不支持全連接查詢 full join
# 但是SQL存在聯合查詢 union 、union all
?
# 注意:聯合查詢,必須保證查詢的多條SQL返回的結果 結構必須一致,所以聯合查詢常見于查詢一張表
6.檢查約束
檢查約束在MySQL8之前是不生效的,也不報錯!!!
create table t_stu(id int primary key auto_increment,name varchar(50) not null unique,age int check(Age >= 18),#gender char(2) check(gender in ("男","女"))gender enum("男","女"));
3.4.5 修改表的結構
修改列的類型:alter table 表名 modify 列名 列類型; ? 增加列:alter table 表名 add 列名 列類型; ? 刪除列:alter table 表名 drop 列名;列改名:alter table 表名 change 舊列名 新列名 列類型;更改表名:① alter table 表名 rename 新表名;② rename table 表名 to 新表名;
在SQL中,提供了動態修改表結構的SQL功能。
創建表與之前的表相似
3.4.6復制表的結構
####第一種#### 在create后面加一個like #該種方式會講原表的主鍵復制過來! ? ####第二種 select后面的*也可以選擇為確定的列#### 在create table后面跟一個select * from tableName #該種方式不會將原表的主鍵這些復制過來!!
如果有主鍵限制,復制多行的數據會怎么樣?沒有主鍵限制的話,會直接都復制;
3.5 MySQL用戶授權
3.5.1 密碼策略
1.MySQL5.7為root用戶隨機生成了一個密碼,打印在error_log中,關于error_log的位置;如果安裝的是RPM包, 則默認是 /var/log/mysqld.log
開啟用戶的遠程登陸:
MySQL官方是禁止root組賬戶遠程登陸的!
3.5.2 遠程登陸解決方案:
首先開啟遠程登錄,必須保證你登陸的賬號是存在高級權限的,一般是root。 登錄MySQL之后訪問MySQL數據庫。 ###案例### use mysql select host,user from user; 等價于 select host,user from mysql.user; ? #修改 將localhost修改為%,或者改成需要的IP地址,再或者進行動態匹配。 update user set host="192.168.1.1%" where user="xjf"; update user set host="%" where user="xjf"; ? #此時修改成功,但是要讓權限生效就要重啟服務! --- 不建議!!!! #如果不行重啟服務,可以刷新權限! flush privileges;
3.5.3 用戶創建和授權
grant create alter select等都需要權限的。
MySQL8之前,MySQL的grant命令非常強大,是集授權、創建用戶、修改密碼、修改用戶、遠程登錄等等一些列功能與一體的命令。
grant all ON 表名.* TO 登錄人名字@'%' IDENTIFIED BY '123456';
1.創建用戶
create user 'zs'@'%' identified by 'zs'; %:是指允許遠程登錄
2.給創建的用戶授權
#查看是哪個用戶登錄? select user() ? grant all on db_chengke.* to zs@'%'; grant all on *.* to dba@localhost; --- 給予最高的權限!