#作者:允砸兒
#日期:乙巳青蛇年? 四月初九
筆者繼續帶朋友們了解mysql數據庫中篇的內容。多了不說,少了不嘮,咱們直接就開寫。
書接上回筆者在上篇中介紹了什么是數據庫和數據庫的一些基礎的概念,以及mysql數據庫的內容。接下來筆者以navicat作為工具來編輯數據庫和最重要的增刪查改的命令語句。
表約束
什么是表約束:是對表中的數據進行限定,保證數據的正確性、有效性和完整性。
1、主鍵約束:確保主鍵列的每一個值都唯一,主鍵列不能為NULL(空)。主鍵primary? key :用于確保表中的每一行都有可以識別自己的一列或多列。
2、外鍵約束:是用來維護數據庫表之間數據一致性和完整性的一種機制。它指定了一個表中的列(或列的組合)必須在另一個表的主鍵或唯一鍵列中有對應的值。
通過外鍵約束可以確保在一個表(稱為子表或從表)中的值在另一個表(稱為父表或主表)中已經存在,從而防止孤立數據的產生。外鍵foreign? key:是一個主表聯系另一張表中以做聯結,可以一對一,一對多,多對多。
索引
什么是索引?
為了在一個數據表里檢索某個特定的記錄,或者提取一系列數據記錄,MySQL必須把這個數據表里的所有數據記錄都搜索一遍。如果數據表的體積比較龐大,在遇到這樣一些查詢的時候性能就會顯著的下降。為解決性能下降的問題可以為查詢所涉及的數據列創建并使用一個索引。
#比如:為了解決查詢速度慢的問題,我們會使用索引,加快檢索速度的操作數據修改變得更快。就像書籍的目錄一樣。
索引的分類
1、普通索引:不唯一的可以為唯空
2、唯一索引:可以唯空的但是唯一的
3、主索引:又唯一又不能唯空
選項和屬性
1、AUTO _INCREMENT(自增):用于為表中的某一列(通常是主鍵列)自動生成唯一的遞增值。
2、NULL(為空)
3、NOT NULL(不為空)非空約束,用于約束該字段的值不能為空。
4、DEFAULT(默認)
SQL介紹
首先用Windows自帶的黑窗口連接? mysql -u root -p,或者直接用navicat直接連接
SQL-結構化查詢語言
1、數據定義語言(DDL):用于創建和修改數據庫對象(如表和索引)的結構,如creat、alter、drop等語句。
2、數據操縱語言(DML):用于數據據庫中的數據進行新增、修改、刪除等操作,如:insert、update、delete等語句。
3、數據查詢語言(DQL):用于對數據進行查詢操作。如:select語句。
4、數據控制語言(DCL):用于控制用戶對數據的訪問權限,如:grant和revoke語句。
一、數據定義語言(DDL)
1、注釋:單行注釋:? ?#? ?
? ? ? ? ? ? ? ? ?單行注釋:-- (減減空格)
? ? ? ? ? ? ? ? ?多行注釋:/*? ?內容? */
(筆者在學習的時候我的老師告訴我注釋內容很重要,要養成一個好習慣,還有一個sql漏洞就是關于注釋的,筆者會在后面講。)
2、新建數據庫:
creat database (數據庫名);創建數據庫
creat database if not exists (數據庫名); if判斷,如果不存在則創建庫
#筆者在這里犯過很多小錯誤,1、database沒有s。2、utf-8 _ci是可以不區分大小寫3、記住必須得有;結尾,但是如果只運行一行可以不加;(分號)4、一定要是英文,字符、語句都必須是英文的。
3、字符集:
字符集(Character Set)在MySQL中是指一套用于存儲、處理和檢索文本數據的字符和編碼規則。它定義了數據庫中可以使用的字符集合,以及這些字符如何映射到數字編碼上。
筆者將創建數據庫和指定字符集結合一下
create database (數據庫名)characterset(字符集);
修改數據庫的字符集:
alter database? (數據庫名) characterset(字符集);
4、查看數據庫的字符集:
show create database (數據庫名);
? ? ?刪除數據庫(刪庫跑路):
drop database (數據庫名);
? ? 使用數據庫:
use (數據庫名);
以上內容筆者簡單寫一下,下面我們就先創建一個數據庫,隨后在數據庫里面創建表。
在數據庫里面創建表
筆者在這里講一下如何用命令創建數據表,也可以直接在navicat直接創建(可視化的還是比較簡單的),筆者在寫一下建表要用到的概念,數字(int),漢字,英文(字符串varchar),數值,價格(double),日期 (data)......
-- 查詢所有的數據表
show databases ;
-- 創造一個名字為xuesheng的表
create database xuesheng;
-- 查詢一下所有的表
show databases ;
-- 改變數據表的字符類型
alter database xuesheng characterset set utf8mb4;
-- 創建字段,在xuesheng數據表中.注意需要給varachar后面添加長度
creat table product (
id int,
p_name varachar(20),
price double,
stock int,
insert_time data
);
-- 查看表結構
desc product;
-- 修改表名字
alter table product rename to tet;
-- 修改數據類型
alter table tet modify p_name varachar(20)
-- 如果沒有設置主鍵需要在編輯器里面留一個id位置
insert into tet (name,price,stock,insert time) values('電腦’,99,50,'2025-9-10’),('顯示器’,199.99,50,'2025-9-18'),(智能手表’,99.599,58,'2025-9-10')('鼠標',99.899,50,'2025-9-10');
-- 添加所有字段
insert into tet values?('電腦',99,50,'2025-9-10');
-- 如果給一個字段寫不同值,讓每一個值都是不同行的,用,(逗號)隔開是分行。
insert into tet(name)values('ss''bb')
select * from tet
-- 修改數據,update 表名字 set 修改后的東西 條件 where id=2這是唯一的數據因為他是主鍵(這里面寫唯一的數據)
update tet set name='電冰箱’where id=2
update tet set price=10 where id=4
select * from tet
-- 刪除數據
delete from tet where id=6;
-- 查詢表
select * from tet;
select id,name,price from tet
簡單的建完了一張表,然后把數據存在了數據庫表中,這里面有一個小知識,不能有一樣的名字,出現一樣的名字會報錯。
二、數據庫操縱語言(DML)
1、insert into 插入數據
insert into(字段) values();#字段是mysql服務器架構第一層,#字段不能用單引號去加,應該用反引號``。
數據庫的架構第一層是dbms,第二層是數據庫,第三層是數據表,最后是字段。表名、字段名都可以是反引號,值需要單引號雙引號去做
2、updata? 修改數據
3、delete? 刪除數據
三、數據查詢語言(DQL)
-- 查詢數據表
select (列名) from (表名);
--?查詢整個表
select * from `tet`
-- 條件查詢
select (列名) from(表名) where (條件);
-- 模糊查詢
select (列名) form (表名)where (列名) like ‘’(%:匹配零個或多個字符:_:匹配單個字符。)
-- 聚合查詢
1、count():計算行數
比如:查詢整個表的行數直接會寫在后面
? ? ? ?select count(*) from tet;
2、max():返回數值列中的最大值
比如:查詢表中的最高價格
select max(price) from tet;
3、min():返回數值列中的最小值
4、?sum():計算數值列的總和。
5、?avg():計算數值列的平均值。
***group_concat() ?
它是mysql當中的聚合函數,它允許我們將多行的字符串組合成一個字符串,非常方便我們輸出。
比如:查詢名字和價格合體在一起
select group_concat(name,'-',price) from tet;
-- 排序查詢
select(列) from(表) order by (列) desc/asc;(asc 為升序,desc為降序)
***group by? ?用于結合聚合函數,根據一個或多個列對結果集進行分組
-- 分頁查詢
select * from 表名 limit (頁碼-1) *每頁數量,每頁數量;
-- mysql表關系
1、一對一表關系:
一對一(1:1)表關系是一種較為特殊的表關系,表示一個表中的一條記錄與另一個表中的一條記錄有唯一的對應關系。這種關系通常用于將一個表的某些列分離到一個新的表中以便保持數據的清晰性和模塊化。
2、一對多表關系:
這意味著在一個表中,可以有多個記錄與另一個表中的單個記錄相關聯。常用于表示兩個表之間的連接,其中一個表中的多行可以與另 一個表中的單行相關聯。這種關系通常通過外鍵(ForeignKey)來實現。
-- 多表查詢
1、union查詢:
用于合并兩個或多個select語句的結果集,同時去處重復的記錄。每個select語句必須擁有相同數量的列,列的數據類型也必須兼容。union默認為union all,但union all會包含所有的重復記錄,而union會去除重復記錄。
比如:select * from person union select name,price,stock,id from tet;
2、子查詢:
子查詢是一種在sql語言中嵌套查詢下層的程序模塊。當一個查詢是另一個查詢的條件時,這個被嵌套的查詢就會被稱為子查詢。子查詢也被稱為內查詢或內部選擇,而包含的語句則被稱為主查詢或外部查詢。
比如:select name,age from person where age=(select max(age) from person);
數據庫加固
筆者用通俗的語言寫一下什么是數據庫加固,它是一個非常復雜的工作,他是去保護數據庫的安全,去解決它存在的一些安全問題,每一種安全問題做一些方案,保證業務系統穩定的運行。
怎么樣加固呢?筆者老師當時交的是6種,數據庫加固有非常多的方法,朋友們可以去其他大神那里學習一下,筆者在這里就簡單的寫一下。
1、強密碼---復雜的密碼
比如:root的密碼就是弱口令(數字大小寫密碼)
2、修改賬號名
比如:修改賬號root賬號名(但是不建議大家嘗試阿,筆者有一款游戲的安全鎖密碼給忘了手機號也換了導致交易不了東西,悲!!!)
3、禁止遠程連接數據庫
update user set host=‘localhaost’ where user=‘joker’and ?host=‘%’
4、關閉端口
默認端口3306,nmap可以掃描端口,定期修改數據庫端口or不開mysql端口
5、安裝最新補丁
select version()
6、web應用防火墻
買一些數據庫審計設備,這需要強大的財力。
總結筆者把數據庫里面最基礎的知識已經寫完,數據庫后篇內容筆者會結合php與數據庫連接。在淺淡一下sql注入。遇到了學習瓶頸不要放棄,可以聽聽紅歌,看看以前的紅書,頹廢的感覺和負能量一掃而空。最后,希望和大家一起努力,一起變得更強。