1. 程式人生 > >Mysql數據庫部分簡單整理

Mysql數據庫部分簡單整理

change lint 說明 memcache HERE mar 下載 不用 side

數據庫概述
什麽是數據(Data)
描述事物的符號記錄稱為數據

什麽是數據庫
數據庫即存放數據的倉庫,只不過這個倉庫是在計算機存儲設備上,而且數據是按一定的格式存放的
數據庫是長期存放在計算機內、有組織、可共享的數據集合。
數據庫中的數據按一定的數據模型組織、描述和儲存,具有較小的冗余度、較高的數據獨立性和易擴展性,並可為各種 用戶共享

什麽是數據庫管理系統
累了累了,自己去搜搜吧,沒啥意思

數據庫服務器、數據管理系統、數據庫、表與記錄的關系
記錄:1 xxx 324245234 22(多個字段的信息組成一條記錄,即文件中的一行內容)

表:student, scholl, class_list(即文件)
數據庫:oldboy_stu(即文件夾)
數據庫管理系統:如mysql(是一個軟件)
數據庫服務器:一臺計算機(對內存要求比較高)

總結:
數據庫服務器 -:運行數據庫管理軟件
數據庫管理軟件:管理 - 數據庫
數據庫:即文件夾,用來組織文件 / 表
表:即文件,用來存放多行內容 / 多條記錄


MySql安裝和基本管理
mysql是什麽?
mysql就是一個基於socket編寫的C/S架構的軟件

數據庫管理軟件分類
分兩大類:
  關系型:如sqllite,db2,oracle,access,sql server,MySQL,註意:sql語句通用
  非關系型:mongodb,redis,memcache
可以簡單的理解為:
關系型數據庫需要有表結構
非關系型數據庫是key-value存儲的,沒有表結構

mysql的下載安裝
自己去官網下去 用到CMD操作的建議 強烈建議用管理員運行cmd,尤其對小白來說!
下完了添加環境變量
將MySQL的bin目錄路徑追加到變值值中

初始化命令
mysqld --initialize-insecure
啟動mysql服務
mysqld #啟動MySQL服務

啟動mysql客戶端並連接mysql服務端(新開一個cmd窗口)
mysql -u root -p # 連接MySQL服務器

註意:--install前,必須用mysql啟動命令的絕對路徑
# 制作MySQL的Windows服務,在終端執行此命令:
"c:\mysql-5.6.40-winx64\bin\mysqld" --install
# 移除MySQL的Windows服務,在終端執行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --remove

註冊成服務之後,以後再啟動和關閉MySQL服務時,僅需執行如下命令:
# 啟動MySQL服務
net start mysql
# 關閉MySQL服務
net stop mysql

windows下登錄設置密碼
打開終端,輸入mysql

技術分享圖片


輸入mysql提供的函數:select user(); # 查看當前登錄的賬號

技術分享圖片


當前登錄的默認賬號為ODBC@localhost

如果想切到root賬號登錄
命令
mysql -uroot -p

再查看當前用戶:
select user();

技術分享圖片


管理員為root(擁有最高權限,管理員賬號),密碼為空,以無密碼的方式登錄了管理員賬號,是非常危險的一件事情,所以要為管理員賬號設置密碼

設置管理員root賬號密碼為123
C:\Users\mjj>mysqladmin -uroot -p password "123" #設置初始密碼 由於原密碼為空,因此-p可以不用

技術分享圖片


ps:不用管它。翻譯為:在命令行界面使用密碼不安全,暴露在終端當中。

然後再登錄賬號,不輸入密碼則會出現如下結果:

技術分享圖片


再次執行如下操作:

技術分享圖片


再查看一下當前登錄的賬號:

技術分享圖片


如果想將原始密碼123,設置新密碼為456
C:\Users\mjj>mysqladmin -uroot -p"123" password "456" #修改mysql密碼,因為已經有密碼了,所以必須輸入原密碼才能設置新密碼
依次執行如下操作:
mysql -uroot -p456
select user();

密碼忘記——破解密碼
跳過授權方式,直接登錄!!
0.以管理員身份打開cmd

技術分享圖片


2.停掉mysql服務端
C:\WINDOWS\system32>net stop mysql
MySQL 服務正在停止.
MySQL 服務已成功停止。

3.執行如下命令跳過授權表
跳過授權表
C:\WINDOWS\system32>mysqld --skip-grant-tables
2018-06-09 17:12:38 0 [Warning] Insecure configuration for --secure-file-priv: Current value does not restrict location of generated files. Consider setting it to a valid, non-empty path.
2018-06-09 17:12:38 0 [Note] mysqld (mysqld 5.6.40) starting as process 6052 ...4.

4.再次查看

技術分享圖片


5. 現在可以任意的更改密碼,執行如下命令
update mysql.user set authentication_string = password(‘‘) where User = ‘root‘;

6.刷新權限,執行命令
flush privileges;

技術分享圖片


7.退出mysql。執行命令:exit,

8.讓用戶去加載權限,以管理員身份進入cmd,查看當前mysql進程
tasklist |findstr mysql #查看當前mysql的進程

技術分享圖片


9.殺死當前的進程,執行如下命令
taskkill /F /PID 6052 # 殺死當前的進程pid

技術分享圖片


10.再次執行如下操作,還原

技術分享圖片


統一字符編碼
進入mysql客戶端,執行\s

技術分享圖片


為了統一字符編碼,請執行如下操作:
(1)my.ini文件是mysql的配置文件,
在C:\mysql-5.6.40-winx64文件下創建my.ini文件
(2)將如下代碼拷貝保存。
#mysql5.5以上:修改方式為
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

(3)以管理員身份重啟服務,執行如下命令
C:\Windows\system32>net stop MySQL
MySQL 服務正在停止..
MySQL 服務已成功停止。

C:\Windows\system32>net start MySQL
MySQL 服務正在啟動 .
MySQL 服務已經啟動成功。

(4)在cmd中輸入mysql進入mysql環境,執行\s,顯示如下信息,表示成功

技術分享圖片


基本mysql語句
操作文件夾(庫)

create database db1 charset utf8;


查看當前創建的數據庫
show create database db1;
查看所有的數據庫
show databases;


alter database db1 charset gbk;


drop database db1;


操作文件(表)
use db1; #切換文件夾
select database(); #查看當前所在文件夾


create table t1(id int,name char);


查看當前的這張t1表
show create table t1;
查看所有的表
show tables;
查看表的詳細信息
desc t1;


modify修改的意思
alter table t1 modify name char(6);
改變name為大寫的NAME
alter table t1 change name NAMA char(7);


刪除表
drop table t1;


操作文件內容(記錄)

插入一條數據,規定id,name數據leilei
insert t1(id,name) values(1,"mjj01"),(2,"mjj02"),(3,"mjj03");


select id from db1.t1;
select id,name from db1.t1;
select * from db1.t1;


update db1.t1 set name=‘zhangsan‘;
update db1.t1 set name=‘alex‘ where id=2;


delete from t1;
delete from t1 where id=2;



數據庫命名規則:
可以由字母、數字、下劃線、@、#、$
區分大小寫
唯一性
不能使用關鍵字如 create select
不能單獨使用數字
最長128位



庫的操作
庫的增刪改查
查看系統庫
show databases;

創建數據庫
create database 數據庫名 charset utf8;

數據庫相關操作
查看數據庫
show databases;
查看當前庫
show create database db1;
查看所在的庫
select database();
選擇數據庫
use 數據庫名
刪除數據庫
DROP DATABASE 數據庫名;
修改數據庫
alter database db1 charset utf8;

SQL語言分為3種類型:
DDL、DML、DCL語句 想了解的自行百度



表的操作
存儲引擎 全是概念自行百度
數據庫中的表也應該有不同的類型,表的類型不同,會對應mysql不同的存取機制,表類型又稱為存儲引擎。

mysql支持的存儲引擎
mysql> show engines\G;# 查看所有支持的引擎
mysql> show variables like ‘storage_engine%‘; # 查看正在使用的存儲引擎

重要引擎(具體描述自行百度)
InnoDB 存儲引擎
MyISAM 存儲引擎
Memory 存儲引擎
BLACKHOLE

了解引擎(具體描述自行百度)
NDB 存儲引擎
Infobright 存儲引擎
NTSE 存儲引擎

指定表類型/存儲引擎
create table t1(id int)engine=innodb;# 默認不寫就是innodb

創建表
語法:
create table 表名(
字段名1 類型[(寬度) 約束條件],
字段名2 類型[(寬度) 約束條件],
字段名3 類型[(寬度) 約束條件]
);

#註意:
1. 在同一張表中,字段名是不能相同
2. 寬度和約束條件可選
3. 字段名和類型是必須的

1.創建數據庫
create database db2 charset utf8;
2.使用數據庫
use db2;
3.創建a1表
create table a1(
  id int,
  name varchar(50),
  age int(3)
);
4.插入表的記錄
insert into a1 values
(1,‘xxx‘,18),
(2,‘ooo‘,28);
5.查詢表的數據和結構
查詢a1表中的存儲數據
select * from a1;
查看a1表的結構
desc a1;
查看表的詳細結構
show create table a1\G;

復制表
新創建一個數據庫db3
create database db3 charset utf8;
使用db3
use db3;
復制db2.a1的表結構和記錄
create table b1 select * from db2.a1;

查看db3.b1中的數據和表結構
select * from db3.b1;
只要表結構,不要記錄
create table b2 select * from db2.a1 where 1>5;

查看表結構:
desc b2;
查看表結構中的數據
select * from b2;

還有一種做法,使用like(只拷貝表結構,不拷貝記錄)
create table b3 like db2.a1;
desc b3;
select * from db3.b3;

刪除表
drop table 表名;



數據類型
mysql常用數據類型概括:數字、字符串、時間、枚舉、集合
1. 數字:
整型:tinyinit int bigint
小數:
float :在位數比較短的情況下不精準
double :在位數比較長的情況下不精準
0.000001230123123123
存成:0.000001230000

decimal:(如果用小數,則用推薦使用decimal)
精準
內部原理是以字符串形式去存

2. 字符串:
char(10):簡單粗暴,浪費空間,存取速度快
    root存成root000000
varchar:精準,節省空間,存取速度慢

sql優化:創建表時,定長的類型往前放,變長的往後放
比如性別 比如地址或描述信息

>255個字符,超了就把文件路徑存放到數據庫中。
比如圖片,視頻等找一個文件服務器,數據庫中只存路徑或url。

3. 時間類型:
最常用:datetime

4. 枚舉類型與集合類型



數值類型
整數類型:TINYINT SMALLINT MEDIUMINT INT BIGINT
作用:存儲年齡,等級,id,各種號碼等

給你個表自己看去吧

技術分享圖片



定點數類型: DEC等同於DECIMAL


浮點型
浮點類型:FLOAT DOUBLE
作用:存儲薪資、身高、體重、體質參數等
語法:
-------------------------FLOAT-------------------
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
參數解釋:單精度浮點數(非準確小數值),M是全長,D是小數點後個數。M最大值為255,D最大值為30

有符號:
-3.402823466E+38 to -1.175494351E-38,
1.175494351E-38 to 3.402823466E+38

無符號:
1.175494351E-38 to 3.402823466E+38
精確度:
**** 隨著小數的增多,精度變得不準確 ****


-------------------------DOUBLE-----------------------
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

參數解釋: 雙精度浮點數(非準確小數值),M是全長,D是小數點後個數。M最大值為255,D最大值為30

有符號:
-1.7976931348623157E+308 to -2.2250738585072014E-308
2.2250738585072014E-308 to 1.7976931348623157E+308

無符號:
2.2250738585072014E-308 to 1.7976931348623157E+308

精確度:
****隨著小數的增多,精度比float要高,但也會變得不準確 ****

======================================
--------------------DECIMAL------------------------
decimal[(m[,d])] [unsigned] [zerofill]

參數解釋:準確的小數值,M是整數部分總個數(負號不算),D是小數點後個數。 M最大值為65,D最大值為30。


精確度:
**** 隨著小數的增多,精度始終準確 ****
對於精確數值計算時需要用此類型
decaimal能夠存儲精確值的原因在於其內部按照字符串存儲。


日期類型
DATE TIME DATETIME TIMESTAMP YEAR
作用:存儲用戶註冊時間,文章發布時間,員工入職時間,出生時間,過期時間等
語法:
YEAR
YYYY(1901/2155)

DATE
YYYY-MM-DD(1000-01-01/9999-12-31)

TIME
HH:MM:SS(‘-838:59:59‘/‘838:59:59‘)

DATETIME

YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)

TIMESTAMP

YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時)


字符類型
官網:https://dev.mysql.com/doc/refman/5.7/en/char.html
註意:char和varchar括號內的參數指的都是字符的長度

char類型:定長,簡單粗暴,浪費空間,存取速度快
字符長度範圍:0-255(一個中文是一個字符,是utf8編碼的3個字節)
存儲:
存儲char類型的值時,會往右填充空格來滿足長度
例如:指定長度為10,存>10個字符則報錯,存<10個字符則用空格填充直到湊夠10個字符存儲

檢索:
在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,除非我們打開pad_char_to_full_length SQL模式(設置SQL模式:SET sql_mode = ‘PAD_CHAR_TO_FULL_LENGTH‘;
      查詢sql的默認模式:select @@sql_mode;)

varchar類型:變長,精準,節省空間,存取速度慢
字符長度範圍:0-65535(如果大於21845會提示用其他類型 。mysql行最大限制為65535字節,字符編碼為utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
存儲:
varchar類型存儲數據的真實內容,不會用空格填充,如果‘ab ‘,尾部的空格也會被存起來
強調:varchar類型會在真實數據前加1-2Bytes的前綴,該前綴用來表示真實數據的bytes字節數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大字節限制,即已經足夠使用)
如果真實的數據<255bytes則需要1Bytes的前綴(1Bytes=8bit 2**8最大表示的數字為255)
如果真實的數據>255bytes則需要2Bytes的前綴(2Bytes=16bit 2**16最大表示的數字為65535)

檢索:
尾部有空格會保存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容

官網解釋如下:

技術分享圖片



枚舉類型和集合類型
字段的值只能在給定範圍中選擇,如單選框,多選框
enum 單選 只能在給定的範圍內選一個值,如性別 sex 男male/女female
set 多選 在給定的範圍內可以選擇一個或一個以上的值(愛好1,愛好2,愛好3...)


完整性約束
約束條件與數據類型的寬度一樣,都是可選參數
作用:用於保證數據的完整性和一致性
主要分為:
PRIMARY KEY (PK) #標識該字段為該表的主鍵,可以唯一的標識記錄
FOREIGN KEY (FK) #標識該字段為該表的外鍵
NOT NULL #標識該字段不能為空
UNIQUE KEY (UK) #標識該字段的值是唯一的
AUTO_INCREMENT #標識該字段的值自動增長(整數類型,而且為主鍵)
DEFAULT #為該字段設置默認值

UNSIGNED #無符號
ZEROFILL #使用0填充

說明:
1. 是否允許為空,默認NULL,可設置NOT NULL,字段不允許為空,必須賦值
2. 字段是否有默認值,缺省的默認值是NULL,如果插入記錄時不給字段賦值,此字段使用默認值
sex enum(‘male‘,‘female‘) not null default ‘male‘

必須為正值(無符號) 不允許為空 默認是20
age int unsigned NOT NULL default 20
3. 是否是key
主鍵 primary key
外鍵 foreign key
索引 (index,unique...)




not null 與default
是否可空,null表示空,非字符串
not null - 不可空
null - 可空

默認值,創建列時可以指定默認值,當插入數據時如果未主動設置,則自動添加默認值


unique
單列唯一
聯合唯一

primary key
一個表中可以:
單列做主鍵
多列做主鍵(復合主鍵)
約束:等價於 not null unique,字段的值不為空且唯一
存儲引擎默認是(innodb):對於innodb存儲引擎來說,一張表必須有一個主鍵。


auto_increment
約束:約束的字段為自動增長,約束的字段必須同時被key約束

foreign key


表的三種關系
多對一、多對多、一對一


數據的增刪改
插入數據 INSERT
更新數據 UPDATE
刪除數據 DELETE

一、在MySQL管理軟件中,可以通過SQL語句中的DML語言來實現數據的操作,包括

1.使用INSERT實現數據的插入
2.UPDATE實現數據的更新
3.使用DELETE實現數據的刪除
4.使用SELECT查詢數據以及。


二、插入數據 INSERT
1. 插入完整數據(順序插入)
語法一:
INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);

語法二:
INSERT INTO 表名 VALUES (值1,值2,值3…值n);

2. 指定字段插入數據
語法:
INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);

3. 插入多條記錄
語法:
INSERT INTO 表名 VALUES
(值1,值2,值3…值n),
(值1,值2,值3…值n),
(值1,值2,值3…值n);

4. 插入查詢結果
語法:
INSERT INTO 表名(字段1,字段2,字段3…字段n)
SELECT (字段1,字段2,字段3…字段n) FROM 表2
WHERE …;

三、更新數據UPDATE
語法:
UPDATE 表名 SET
字段1=值1,
字段2=值2,
WHERE CONDITION;

示例:
UPDATE mysql.user SET password=password(‘123’)
where user=’root’ and host=’localhost’;
四、刪除數據DELETE
語法:
DELETE FROM 表名
WHERE CONITION;

示例:
DELETE FROM mysql.user
WHERE password=’’;



單表查詢
一、單表查詢的語法
SELECT 字段1,字段2... FROM 表名
WHERE 條件
GROUP BY field
HAVING 篩選
ORDER BY field
LIMIT 限制條數
二、關鍵字的執行優先級(重點)
from
where
group by
having
select
distinct
order by
limit

1.找到表:from
2.拿著where指定的約束條件,去文件/表中取出一條條記錄
3.將取出的一條條記錄進行分組group by,如果沒有group by,則整體作為一組
4.將分組的結果進行having過濾
5.執行select
6.去重
7.將結果按條件排序:order by
8.限制結果的顯示條數


where 約束 
where子句中可以使用
1.比較運算符:>、<、>=、<=、<>、!=
2.between 80 and 100 :值在80到100之間
3.in(80,90,100)值是10或20或30
4.like ‘xiaomagepattern‘: pattern可以是%或者_。%小時任意多字符,_表示一個字符
5.邏輯運算符:在多個條件直接可以使用邏輯運算符 and or not

group by 分組查詢
1、首先明確一點:分組發生在where之後,即分組是基於where之後得到的記錄而進行的
2、分組指的是:將所有記錄按照某個相同字段進行歸類,比如針對員工信息表的職位分組,或者按照性別進行分組等
3、為何要分組呢?
取每個部門的最高工資
取每個部門的員工數
取男人數和女人數
小竅門:‘每’這個字後面的字段,就是我們分組的依據
4、大前提:
可以按照任意字段分組,但是分組完畢後,比如group by post,只能查看post字段,如果想查看組內信息,需要借助於聚合函數

聚合函數
max()求最大值
min()求最小值
avg()求平均值
sum() 求和
count() 求總個數

HAVING過濾
HAVING與WHERE不一樣的地方在於
執行優先級從高到低:where > group by > having
1. Where 發生在分組group by之前,因而Where中可以有任意字段,但是絕對不能使用聚合函數。
2. Having發生在分組group by之後,因而Having中可以使用分組的字段,無法直接取到其他字段,可以使用聚合函數

order by 查詢排序
按單列排序
SELECT * FROM employee ORDER BY age;
SELECT * FROM employee ORDER BY age ASC;
SELECT * FROM employee ORDER BY age DESC;
按多列排序:先按照age升序排序,如果年紀相同,則按照id降序
SELECT * from employee
ORDER BY age ASC,
id DESC;


limit 限制查詢的記錄數:
示例:
SELECT * FROM employee ORDER BY salary DESC
LIMIT 3; #默認初始位置為0
SELECT * FROM employee ORDER BY salary DESC
LIMIT 0,5; #從第0開始,即先查詢出第一條,然後包含這一條在內往後查5條
SELECT * FROM employee ORDER BY salary DESC
LIMIT 5,5; #從第5開始,即先查詢出第6條,然後包含這一條在內往後查5條


多表查詢
多表連接查詢
語法:
SELECT 字段列表
FROM 表1 INNER|LEFT|RIGHT JOIN 表2
ON 表1.字段 = 表2.字段;

符合條件連接查詢

子查詢


先整理到這吧!數據庫還有很多很多!
後面會用到pymysql









Mysql數據庫部分簡單整理