怎麼理解數據庫
本質:就是個放數據的**“倉庫”**
數據存放
萌芽階段
- 放在內存裏——瞬時:程序結束,上次的數據就沒啦
- 放在文件裏——持久:進步了!能一直保存了(比如放在.txt文件裏),但還是存在問題
- 不安全
- 不方便在中間插入、刪除數據
- 但也不是一無是處,可以應用於配置文件:.xml文件、.ini文件等等
數據庫的產生
核心:CRUD(最難的是“查找”)
-
層次模型
-
優點:層次清晰
-
缺點:(假如一張“專業”表有你,“學校”表也有你)
- 查詢效率低下(不知道查哪張)
- 數據不完整(這張表改了那張表沒改)
-
致命:重複就GG了
-
-
網狀模型
-
優點:解決複雜問題,數據也完整了,重複的話也只操作一個文件
-
缺點:重複文件沒法解決特殊性問題(假設計算機一班的人和上mysql課的有一部分人都是)
- 計算機一班的每人收100元
- 上mysql課的每人收233元
-
致命:並未解決導航問題
-
-
關係型
- 解決了導航問題:比如每張表都有個學號(公共的編號)
- 分批管理,各管各的
- 數據完整,層次清晰
- 說白了,關係就是共性,爲了讓每張表都能找到爹
- 和誰都有關係,但是又互不影響
安裝
-
版本(看企業,貼合業務)
- 5.7
- 8.0
-
下載
-
點MySQL Community Download
-
點MySQL Community Server、
-
選MSI Installer(幾百M的那個)
-
選5.7.29
-
太慢?在下載內容裏複製鏈接到迅雷就行啦
-
-
安裝
- sever only
- 有excute就點,彈框確認就完了
- 一路next就完了
-
添加到環境變量(比如:C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin)
-
在cmd下進入(u是用戶名,p是密碼)
# 不推薦直接在-p後輸入密碼
mysql -u root -padmin
# 建議這樣
mysql -u root -p
>Enter Password:*****
root
用戶可以爲所欲爲!!!
MySQL是個啥
-
用C++開發(bin中的.exe、include中的.h可以看出來…)
-
典型C/S架構
- server服務端:MySQL Sever mysql服務端(在本地,客戶端要訪問,需要開啓服務)
- client客戶端:通過終端cmd去訪問/操作數據庫
# 關閉服務(大小寫不敏感)
net stop mysql
# 開啓服務
net start mysql
-
斷開連接
- quit
- exit
- \q
- 直接關閉CMD
-
windows系統的情況屏幕命令:
cls
-
在MySQL Server 的目錄下創建data文件夾
mysqld --initialize-insecure --user=root
庫的基本操作
顯示所有倉庫
# 輸入內容
show databases;
# 輸出內容
+--------------------+
| Database |
+--------------------+
| information_schema |
| how2java |
| mybatis |
| mysql |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.00 sec)
-
information_schema:服務器管理數據庫的信息
-
mysql:用戶信息(比如root用戶)
-
performance_schema:存儲服務器性能的東西(5.5之後纔有的)
-
test:自帶的測試樣例
建庫
- 通常做法
create database student;
tips:別用關鍵字,比如:database
- 萬一庫很多,避免存在,可以先檢查是否存在,再創建,並指定字符集(推薦這種做法,更規範)
create database if not exists `student` charset=utf8;
- 查看當時怎麼創建的(看到編碼)
# 輸入內容
mysql>show create database student;
# 輸出內容
+----------+--------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------+
| student | CREATE DATABASE `student` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)
刪庫
- 通常做法
drop database student;
- 萬一我刪的是一個不存在的庫(推薦這種做法,更規範)
drop database if exists 'student';
字符集設置
- 默認latin1
- win10下學習用gbk,實際開發用utf8
- 修改字符集
alter database student charset=gbk;
使用數據庫
use student;
表的基本操作
- 本質:將倉庫裏的東西歸類
顯示庫內的所有表
- 首先要
use
,才能show
show tables;
表的創建
- 簡易創建
# 輸入內容
mysql> use school;
# 輸出內容
Database changed
# 輸入內容
mysql> create table student(
-> id int,
-> name varchar(30),
-> age int
-> );
# 輸出內容
Query OK, 0 rows affected (0.01 sec)
# 輸入內容
mysql> show tables;
# 輸出內容
+------------------+
| Tables_in_school |
+------------------+
| student |
+------------------+
1 row in set (0.00 sec)
- 規範創建
create table if not exists teacher(
id int auto_increment primary key comment '主鍵id',
name varchar(30) not null comment '老師的名字',
phone varchar(20) comment '電話號碼',
address varchar(100) default '暫時未知' comment '住址'
)engine=innodb;
tips:
id name age:字段(field)
auto_increment:自動增長(必須是primary key)
primary key:主鍵,唯一不重複,靠它來區分此表
comment:註釋
not null:該字段不爲空
default:默認值
engine=innodb:暫不解釋
查看錶結構
mysql> 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 | | 暫時未知 | |
+---------+--------------+------+-----+----------+----------------+
4 rows in set (0.00 sec)
刪表
- 標準做法
drop table if exists 'stu';
- 多張表可以逗號隔開
drop table if exists ooo,jjj,kkk;
修改表
- 添加字段
alter table student add phone varchar(20);
- 放在某字段後面
alter table student add gender varchar(2) after name;
- 放在第一個
alter table student add sex 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);
- 改名字(表名不能是複數,這邊是不規範的)
alter table student rename to students;
數據的基本操作
添加
- 插入單條數據
insert into teacher (name,phone,address) values('王帥真','18359730121','嘉園路');
順序沒要求,但屬性一定要一一對應;
如果不寫第一個"()"的內容,就要按順序了,且id處填null
- 插入多條數據
insert into teacher values(NULL,'Tom',NULL,default),(NULL,'Jack',NULL,default);
刪除
- 按屬性刪除
delete from teacher where id=2;
delete from teacher where name="Tom";
delete from teacher where age>18;
- 清空表(自增id會從1開始,而
delete
不會)
truncate table student;
更新
where
儘可能的唯一,防止SQL注入
update teacher set name='Jack' where id=1;
查找
- 查整張表(*表示找出全部,方便但是性能低)
mysql> select * from teacher;
+----+--------+-------------+---------+
| id | name | phone | address |
+----+--------+-------------+---------+
| 1 | 王帥真 | 18359730121 | 嘉園路 |
+----+--------+-------------+---------+
1 row in set (0.00 sec)
- 指定字段
mysql> select name from teacher where id=1;
+--------+
| name |
+--------+
| 王帥真 |
+--------+
1 row in set (0.00 sec)
SQL語句區分
- DDL:Data Definition Language
- 針對【數據庫】
- 數據庫定義語言
create
alter
drop
show
- DML:Data Manipulation Language
- 針對【數據】
- 數據庫操縱語言
insert
update
delete
select
查看字符集情況
- 查找所有字符集設置
show variables like 'character_set_%';
- 設置客戶端字符集
set character_set_client=utf8;
數據類型
數值類型
類型 | 大小 | 範圍(有符號) | 範圍(無符號) | 用途 |
---|---|---|---|---|
TINYINT | 1 byte | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整數值 |
MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 |
INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
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) | 極大整數值 |
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) | 單精度 浮點數值 |
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) | 雙精度 浮點數值 |
DECIMAL | 對DECIMAL(M,D) ,如果M>D,爲M+2否則爲D+2 | 依賴於M和D的值 | 依賴於M和D的值 | 小數值 |
- 整型應用
create table user(
id smallint unsigned auto_increment primary key comment 'id',
age tinyint unsigned not null default 0,
kkk int(6)
);
int()裏的代表數據的寬度,即十進制位數
tinyint默認是3(255),smallint默認是5(65535)
- 浮點數應用(**錢千萬不能用浮點型!!!!!**存在精度丟失問題!!!)
create table t_1(
num1 float(3,1),
num2 double(5,2),
)
()裏的前一個是總寬度,後一個是小數部分寬度
如果我故意插入(2.99,2.777777777777)
最後會出來的是(3.0,2.78),也就是會被約
- 定點數(Decimal)應用(錢用這個,不會丟失精度)
一部分空間存整數,一部分空間存小數
字符串類型
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定長字符串 |
VARCHAR | 0-65535 bytes | 變長字符串(多餘的空間會回收,但效率偏低) |
TINYBLOB | 0-255 bytes | 不超過 255 個字符的二進制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二進制形式的長文本數據 |
TEXT | 0-65 535 bytes | 長文本數據(比如:存博客文章) |
MEDIUMBLOB | 0-16 777 215 bytes | 二進制形式的中等長度文本數據 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等長度文本數據 |
LONGBLOB | 0-4 294 967 295 bytes | 二進制形式的極大文本數據 |
LONGTEXT | 0-4 294 967 295 bytes | 極大文本數據 |
日期和時間類型
業內規定,表內都要有!!!!!!
類型 | 大小 ( bytes) | 範圍 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 時間值或持續時間 |
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 | 混合日期和時間值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
布爾類型
- boolean
- true:1
- false:0
枚舉類型
create table t_5(
sex enum('man','woman','?','none','it')
);
枚舉類型有的才能取
第一個類型是1(‘man’)
第二個類型是2(‘woman’)
…
以此類推
實際存的就是整數數據
優點:
-
速度快
-
節省空間,限制數據(2byte)
集合類型
create table t_6(
hobby set('哲學','經濟學','IT','人文社科')
);
插入的話只能插入一個字段
insert into t_6 values('IT,經濟學');
哲學——2^0
經濟學——2^1
IT——2^2
人文社科——2^3
比如:我插入1,就是'哲學'
;我插入5,就是'哲學','IT'
總之就是“位操作”