【MySQL_1】數(shù)據(jù)庫(kù)基操
> 數(shù)據(jù)庫(kù)的本質(zhì):放數(shù)據(jù)的**倉(cāng)庫(kù)**
# 數(shù)據(jù)存放
## 萌芽階段
- 放在內(nèi)存里——瞬時(shí):程序結(jié)束志膀,上次的數(shù)據(jù)就沒啦
- 放在文件里——持久:進(jìn)步了损谦!能一直保存了(比如放在.txt文件里),但還是存在問(wèn)題
? - 不安全
? - 不方便在中間插入球及、刪除數(shù)據(jù),但也不是一無(wú)是處呻疹,可以應(yīng)用于配置文件:.xml文件吃引、.ini文件等等
## 數(shù)據(jù)庫(kù)的產(chǎn)生
**核心:CRUD**(最難的是“查找”)
**層次模型**
-? 國(guó)家-地區(qū)-學(xué)校-專業(yè)-班級(jí),層次分明
-? 優(yōu)點(diǎn):層次清晰? 缺點(diǎn):(假如一張“專業(yè)”表有你,“學(xué)心鞒撸”表也有你)
? ? - 查詢效率低下(不知道查哪張)
? ? - 數(shù)據(jù)不完整(這張表改了那張表沒改)
? ? ? 致命:重復(fù)就GG了
**網(wǎng)狀模型**
-? 優(yōu)點(diǎn):解決復(fù)雜問(wèn)題朦佩,數(shù)據(jù)也完整了,重復(fù)的話也只操作一個(gè)文件?
-? 缺點(diǎn):重復(fù)文件沒法解決特殊性問(wèn)題(假設(shè)計(jì)算機(jī)一班的人和上mysql課的有一部分人都是)
-? 計(jì)算機(jī)一班的每人收100元- 上mysql課的每人收233元
? 致命:并未解決導(dǎo)航問(wèn)題
**關(guān)系型**
- 解決了導(dǎo)航問(wèn)題:比如每張表都有個(gè)學(xué)號(hào)(公共的編號(hào))- 分批管理庐氮,各管各的- 數(shù)據(jù)完整吕粗,層次清晰- 說(shuō)白了,**關(guān)系**就是**共性**旭愧,為了讓每張表都能找到爹
- **和誰(shuí)都有關(guān)系颅筋,但是又互不影響**
# 關(guān)于MySQL數(shù)據(jù)庫(kù)
## 安裝
版本(看企業(yè),貼合業(yè)務(wù))
```
在cmd下進(jìn)入(u是用戶名输枯,p是密碼)
# 不推薦直接在-p后輸入密碼
mysql -u root -padmin
# 建議這樣
mysql -u root -p
Enter Password:***
```
`root`用戶可以**為所欲為**R楸谩!桃熄!
## MySQL是個(gè)啥
-? 用C++開發(fā)(bin中的.exe先口、include中的.h可以看出來(lái)…)
-? **典型C/S架構(gòu)**
? -? server服務(wù)端:MySQL Sever mysql服務(wù)端(在本地,客戶端要訪問(wèn)瞳收,需要開啟服務(wù))- client客戶端:通過(guò)終端cmd去訪問(wèn)/操作數(shù)據(jù)庫(kù)
## 關(guān)閉服務(wù)
```
# 關(guān)閉服務(wù)(大小寫不敏感)
net stop mysql
# 開啟服務(wù)
net start mysql
```
斷開連接
```
quit- exit- \q- 直接關(guān)閉CMD
windows系統(tǒng)的情況屏幕命令:`cls`
```
在MySQL Server 的目錄下創(chuàng)建data文件夾
```
mysqld --initialize-insecure --user=root
```
# 操作數(shù)據(jù)庫(kù)
## 庫(kù)的基本操作
### 顯示所有倉(cāng)庫(kù)
```mysql
# 輸入內(nèi)容
show databases;
# 輸出內(nèi)容
+----------------------+
| Database? ? ? ? |
+----------------------+
| information_schema? |
| mybatis? ? ? ? |
| mysql? ? ? ? |
| performance_schema? |
| test? ? ? ? ? |
+---------------------+
6 rows in set (0.00 sec)
```
-? information_schema:服務(wù)器管理數(shù)據(jù)庫(kù)的信息
-? mysql:用戶信息(比如root用戶)
-? performance_schema:存儲(chǔ)服務(wù)器性能的東西(5.5之后才有的)
-? test:自帶的測(cè)試樣例
### 建庫(kù)
- 通常做法
```mysql
create database student;? -- tips:庫(kù)民別用關(guān)鍵字碉京,比如:`database`
```
- 萬(wàn)一庫(kù)很多,避免存在螟深,可以先檢查是否存在谐宙,再創(chuàng)建,并指定字符集(推薦這種做法界弧,更規(guī)范)
```mysql
create database if not exists `student` charset=utf8;
```
- 查看當(dāng)時(shí)怎么創(chuàng)建的(直接看到編碼)
```mysql
# 輸入內(nèi)容
mysql show create database student;
# 輸出內(nèi)容
+----------+--------------------------------------------------------------------+
| Database | Create Database? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
+----------+--------------------------------------------------------------------+
| student? | CREATE DATABASE `student` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)
```
- 默認(rèn)latin1- win10下學(xué)習(xí)用gbk凡蜻,實(shí)際開發(fā)用utf8- 修改字符集
```mysql
drop database if exists 'student';? -- 刪庫(kù)
alter database student charset=gbk;? -- 字符集設(shè)置
use student; -- 使用數(shù)據(jù)庫(kù)
```
## 表的基本操作
- 本質(zhì):將倉(cāng)庫(kù)里的東西歸類
### 查看表
- 首先要`use`用來(lái)指定說(shuō)我就要你這個(gè)庫(kù)了,指定倉(cāng)庫(kù)發(fā)貨垢箕!才能`show`
```mysql
show tables;
desc teacher;
+---------+--------------+------+-----+----------+----------------+
| Field? | Type? ? ? ? | Null | Key | Default? | Extra? ? ? ? ? |
+---------+--------------+------+-----+----------+----------------+
| id? ? ? | int(11)? ? ? | NO? | PRI | NULL? ? | auto_increment |
| name? ? | varchar(30)? | NO? |? ? | NULL? ? |? ? ? ? ? ? ? ? |
| phone? | varchar(20)? | YES? |? ? | NULL? ? |? ? ? ? ? ? ? ? |
| address | varchar(100) | YES? |? ? | 暫時(shí)未知 |? ? ? ? ? ? ? ? |
+---------+--------------+------+-----+----------+----------------+
4 rows in set (0.00 sec)
```
### 創(chuàng)建表
```mysql
【規(guī)范創(chuàng)建表】
create table if not exists teacher(
id int auto_increment primary key comment '主鍵id',
name varchar(30) not null comment '老師的名字',
phone varchar(20) comment '電話號(hào)碼',
address varchar(100) default '暫時(shí)未知' comment '住址'
) engine=innodb;
[tips]:
? id name age:字段(field)
? ? auto_increment:自動(dòng)增長(zhǎng)(必須是 primary key )
? ? primary key:主鍵划栓,唯一不重復(fù),靠它來(lái)區(qū)分此表
? ? comment:注釋
? ? not null:該字段不為空
? ? default:默認(rèn)值
? ? engine=innodb:使用的是innodb引擎
```
### 刪表
```mysql
# 標(biāo)準(zhǔn)做法
drop table if exists 'stu';
# 多張表可以逗號(hào)隔開
drop table if exists ooo,jjj,kkk;
```
### 修改表
給你一堆屬性名字条获,然后你可以為這些屬性添加忠荞,或者修改類型,或者刪除帅掘,抑或是直接把人家的表名字修改了委煤。
```mysql
# 指定位置添加字段
alter table student add phone varchar(20);
alter table student add phone varchar(2) after name;
alter table student add gender varchar(1) first;
# 刪除字段
alter table student drop phone;
## 修改字段屬性(`change` 變化 可以改名字,也可以改類型锄开;`modify` 修改 只能修改類型)
alter table student change phone tel_phone int(11);
alter table student modify tel_phone varchar(13);
# 改名字rename(表名不能是復(fù)數(shù)素标,這邊是不規(guī)范的)
alter table student rename to newstudent;
```
## 數(shù)據(jù)的基本操作
>? 數(shù)據(jù)是一行一行的,一條一條的
### 添加數(shù)據(jù)行
```mysql
# 插入單條數(shù)據(jù)
# 順序沒要求萍悴,但屬性一定要一一對(duì)應(yīng)头遭;
# 如果不寫第一個(gè)"()"的內(nèi)容寓免,就要按順序了,且id處填null
insert into teacher (name, phone, address) values ('willorn','120120120','null');
# 插入多條數(shù)據(jù)的時(shí)候计维,括號(hào)中間用`袜香,`隔開
insert into teacher values(NULL,'Tom',NULL,default),(NULL,'Jack',NULL,default);
```
### 刪除數(shù)據(jù)行
```mysql
按字段條件刪除
delete from teacher where id=2;
delete from teacher where name="Tom";
delete from teacher where age = 18;
清空表(自增id會(huì)從1開始,而`delete`不會(huì))
delete from teacher;
truncate table student;
```
### 更新數(shù)據(jù)行
`where`指定的字段要盡可能的唯一鲫惶,防止SQL注入
```
update teacher set name='Jack' where id=1;
```
### 查找數(shù)據(jù)
```mysql
# 查整張表(*表示找出全部蜈首,方便但是性能低)
select * from teacher;
select name as 'teacherName' from teacher where id=1;
```
## SQL語(yǔ)句區(qū)分
- DDL:數(shù)據(jù)定義語(yǔ)言 》 Data Definition Language
? - 針對(duì)【數(shù)據(jù)庫(kù)】- 數(shù)據(jù)庫(kù)定義語(yǔ)言 `create` `alter` `drop` `show`
- DML:數(shù)據(jù)操作語(yǔ)言 》 data manipulation language
? - 針對(duì)【數(shù)據(jù)】- 數(shù)據(jù)庫(kù)操縱語(yǔ)言 `insert` `update` `delete` `select`
- DCL:分配權(quán)限的語(yǔ)言
## 查看字符集情況
```mysql
[1]查找所有字符集設(shè)置
show variables like 'character_set_%';
[2]設(shè)置客戶端字符集
set character_set_client = utf8;
```
# 數(shù)據(jù)類型
> 設(shè)計(jì)數(shù)據(jù)庫(kù)的數(shù)據(jù)類型很復(fù)雜,需要按照**真實(shí)的項(xiàng)目需求**來(lái)設(shè)計(jì)欠母。
## 數(shù)值類型
> unsigned不可能為負(fù)數(shù)
>
> 年齡一般就是UTINYINT:無(wú)符號(hào)的欢策,年齡不能為負(fù)數(shù),難道你還能預(yù)約嗎赏淌?
|? ? ? ? 類型? ? ? ? |? ? ? ? ? ? ? ? ? 大小? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? ? 范圍(有符號(hào))? ? ? ? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? 范圍(無(wú)符號(hào)unsigned)? ? ? ? ? ? ? ? ? ? |? ? ? 用途? ? ? |
| :----------------: | :--------------------------------------: | :----------------------------------------------------------: | :----------------------------------------------------------: | :-------------: |
|? ? ? TINYINT? ? ? |? ? ? ? ? ? ? ? ? 1 byte? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? ? (-128踩寇,127)? ? ? ? ? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? ? ? (0,255)? ? ? ? ? ? ? ? ? ? ? ? ? |? ? 小整數(shù)值? ? |
|? ? ? SMALLINT? ? ? |? ? ? ? ? ? ? ? 2 bytes? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? (-32 768六水,32 767)? ? ? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? ? (0俺孙,65 535)? ? ? ? ? ? ? ? ? ? ? ? ? |? ? 大整數(shù)值? ? |
|? ? MEDIUMINT? ? ? |? ? ? ? ? ? ? ? 3 bytes? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? (-8 388 608,8 388 607)? ? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? (0掷贾,16 777 215)? ? ? ? ? ? ? ? ? ? ? ? |? ? 大整數(shù)值? ? |
| **INT or INTEGER** |? ? ? ? ? ? ? ? 4 bytes? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? ? ? 正負(fù)21個(gè)億? ? ? ? ? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? ? ? ? 0~42億? ? ? ? ? ? ? ? ? ? ? ? ? ? |? ? 大整數(shù)值? ? |
|? ? ? BIGINT? ? ? |? ? ? ? ? ? ? ? 8 bytes? ? ? ? ? ? ? ? ? |? (-9,223,372,036,854,775,808睛榄,9 223 372 036 854 775 807)? ? |? ? ? ? ? ? ? (0,18 446 744 073 709 551 615)? ? ? ? ? ? ? ? |? 極大整數(shù)值? ? |
|? ? ? FLOAT? ? ? ? |? ? ? ? ? ? ? ? 4 bytes? ? ? ? ? ? ? ? ? | (-3.402 823 466 E+38想帅,-1.175 494 351 E-38)场靴,0,(1.175 494 351 E-38博脑,3.402 823 466 351 E+38) |? ? ? ? 0憎乙,(1.175 494 351 E-38,3.402 823 466 E+38)? ? ? ? ? | 單精度 浮點(diǎn)數(shù)值 |
|? ? ? DOUBLE? ? ? |? ? ? ? ? ? ? ? 8 bytes? ? ? ? ? ? ? ? ? | (-1.797 693 134 862 315 7 E+308叉趣,-2.225 073 858 507 201 4 E-308),0该押,(2.225 073 858 507 201 4 E-308疗杉,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308蚕礼,1.797 693 134 862 315 7 E+308) | 雙精度 浮點(diǎn)數(shù)值 |
|? ? ? DECIMAL? ? ? | 對(duì)DECIMAL(M,D) 烟具,如果M>D,為M+2否則為D+2 |? ? ? ? ? ? ? ? ? ? ? ? 依賴于M和D的值? ? ? ? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? ? 依賴于M和D的值? ? ? ? ? ? ? ? ? ? ? ? |? ? 小數(shù)值? ? ? |
### int實(shí)際操作
```mysql
create table emp(
id smallint unsigned auto_increment primary key comment '員工id',
age tinyint unsigned,
kkk int(6)
);
```
【注意】int(num)里的代表*數(shù)據(jù)的寬度*奠蹬,但是超過(guò)了寬度也沒有問(wèn)題朝聋,但是不能超過(guò)數(shù)據(jù)的默認(rèn)范圍。
【報(bào)錯(cuò)】out of range value for column
【Tips】tinyint默認(rèn)是3(255)囤躁,smallint默認(rèn)是5(65535)
### 浮點(diǎn)數(shù)
浮點(diǎn)數(shù)應(yīng)用(**千萬(wàn)不能用浮點(diǎn)型<胶邸@蠖谩!Q陨摺僻他!**存在精度丟失問(wèn)題!@吧小6洲帧)
```mysql
create table t_1(
num1 float(3,1),
num2 double(5,2)
);
(總寬度,小數(shù)部分寬度)
```
超過(guò)數(shù)據(jù)的保留小數(shù)??模糊保存的方式(四舍五入)
```mysql
insert into t_2 values (9.11111111111111111111111111111);
保留下來(lái)的就是9.1111111110000000
```
【改進(jìn)】定點(diǎn)數(shù)(Decimal)應(yīng)用(錢用這個(gè)婿斥,**不會(huì)丟失精度**)
【原理】部分空間存整數(shù)劝篷,一部分空間存小數(shù)
## 日期和時(shí)間類型
> 行業(yè)內(nèi)規(guī)定,表內(nèi)都要有C袼蕖=考恕!?备摺O矿!
>
> 實(shí)際自己使用就是**DATETIME**
| 類型? ? ? ? ? ? ? ? ? ? | 大小 ( bytes) | 范圍? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | 格式? ? ? ? ? ? ? ? | 用途? ? ? ? ? ? ? ? ? ? |
| :----------------------- | :------------ | :----------------------------------------------------------- | :------------------ | :----------------------- |
| DATE? ? ? ? ? ? ? ? ? ? | 3? ? ? ? ? ? | 1000-01-01/9999-12-31? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | YYYY-MM-DD? ? ? ? ? | 日期值? ? ? ? ? ? ? ? ? |
| TIME? ? ? ? ? ? ? ? ? ? | 3? ? ? ? ? ? | '-838:59:59'/'838:59:59'? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | HH:MM:SS? ? ? ? ? ? | 時(shí)間值或持續(xù)時(shí)間? ? ? ? |
| YEAR? ? ? ? ? ? ? ? ? ? | 1? ? ? ? ? ? | 1901/2155? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | YYYY? ? ? ? ? ? ? ? | 年份值? ? ? ? ? ? ? ? ? |
| **DATETIME**(一般使用) | 8? ? ? ? ? ? | 1000-01-01 00:00:00/9999-12-31 23:59:59? ? ? ? ? ? ? ? ? ? ? | YYYY-MM-DD HH:MM:SS | 混合日期和時(shí)間值? ? ? ? |
| TIMESTAMP? ? ? ? ? ? ? ? | 4? ? ? ? ? ? | 1970-01-01 00:00:00/2038結(jié)束時(shí)間是第 **2147483647** 秒华望,北京時(shí)間 **2038-1-19 11:14:07**蕊蝗,格林尼治時(shí)間 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS? ? | 混合日期和時(shí)間值,時(shí)間戳 |
```mysql
create table t_n(
id int auto_increment primary key,
createTime datetime
);
insert into t_n values ('2021-06-06 12:12:12');
select * from t_n;
```
## 字符串類型
> varchar節(jié)省空間赖舟,但是效率不如char
| 類型? ? ? ? | 大小? ? ? ? ? ? ? ? ? | 用途? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| :---------- | :-------------------- | :------------------------------ |
| **CHAR**? ? | 0-255 bytes? ? ? ? ? | 定長(zhǎng)字符串? ? ? ? ? ? ? ? ? ? ? |
| **VARCHAR** | 0-65535 bytes? ? ? ? | 變長(zhǎng)字符串? ? ? ? ? ? ? ? ? ? ? |
| TINYBLOB? ? | 0-255 bytes? ? ? ? ? | 不超過(guò) 255 個(gè)字符的二進(jìn)制字符串 |
| TINYTEXT? ? | 0-255 bytes? ? ? ? ? | 短文本字符串? ? ? ? ? ? ? ? ? ? |
| BLOB? ? ? ? | 0-65 535 bytes? ? ? ? | 二進(jìn)制形式的長(zhǎng)文本數(shù)據(jù)? ? ? ? ? |
| **TEXT**? ? | 0-65 535 bytes? ? ? ? | 長(zhǎng)文本數(shù)據(jù)? ? ? ? ? ? ? ? ? ? ? |
| MEDIUMBLOB? | 0-16 777 215 bytes? ? | 二進(jìn)制形式的中等長(zhǎng)度文本數(shù)據(jù)? ? |
| MEDIUMTEXT? | 0-16 777 215 bytes? ? | 中等長(zhǎng)度文本數(shù)據(jù)? ? ? ? ? ? ? ? |
| LONGBLOB? ? | 0-4 294 967 295 bytes | 二進(jìn)制形式的極大文本數(shù)據(jù)? ? ? ? |
| LONGTEXT? ? | 0-4 294 967 295 bytes | 極大文本數(shù)據(jù)? ? ? ? ? ? ? ? ? ? |
## 布爾類型
```mysql
create table t_4(
isRight boolean
);
insert into t_4 values (true);
===》查出來(lái)是1
===》true:1- false:0
```
## 枚舉類型:?jiǎn)芜x
```
create table t_5(
gender enum('man','woman','?','nothing','it')
);
```
**枚舉類型里面有的才能取**蓬戚,別的不能存儲(chǔ)。
第一個(gè)類型是1《==》(‘man’)
第二個(gè)類型是2《==》(‘woman’)
…
以此類推宾抓,實(shí)際存的就是**整數(shù)數(shù)據(jù)**
**優(yōu)點(diǎn):**
-? 速度快
-? 節(jié)省空間子漩,限制數(shù)據(jù)(2byte)
## set集合類型:多選
```mysql
create table t_6(
hobby set('哲學(xué)','經(jīng)濟(jì)學(xué)','IT','Math')
);
insert into t_6 values('IT,經(jīng)濟(jì)學(xué)'); -- 只能插入一個(gè)字段
```
> 哲學(xué)——2^0
>
> 經(jīng)濟(jì)學(xué)——2^1
>
> IT——2^2
>
> 人文社科——2^3
>
> eg:我插入1,就是`'哲學(xué)'`石洗;我插入5幢泼,就是`'哲學(xué)','IT'`
>
> 總之就是“**位操作**”