1、介紹數據庫
1.1、什麼是數據庫
數據庫(DB,DataBase)
概念:數據倉庫,軟件,安裝在操作系統上,SQL,可以存儲大量的數據,一般500萬以下
作用:存儲數據,管理數據
1.2、數據庫分類
關係型數據庫(SQL):
- MySQL,Oracle,Sql Server,DB2,SQLlite
- 銅鼓表和表之間,行和列之間的關係進行數據的存儲
非關係型數據庫(NoSQL) Not Only SQL:
- Redis,MongDB
- 非關係型數據庫,對象存儲,通過對象的自身的屬性來決定
1.3、DBMS(數據庫管理系統)
- 數據庫的管理軟件,科學有效的管理我們的數據。維護和獲取數據
- MySQL,數據庫管理系統
2、操作數據庫
2.1、數據庫基本命令行操作
mysql -uroot -p123456 --連接數據庫
update user set password=password('123') where user='root' and host='localhost'; --修改用戶密碼
flush privileges; --刷新權限
show databases; --查看所有的數據庫
mysql> use money --切換數據庫 use 數據庫名
Database changed
show tables; --查看數據庫中所有的表
describe employee; --顯示數據庫中所有的表的信息
create database westos; --創建一個數據庫
exit; --推出連接
-- 單行註釋(SQL的本來的註釋)
/* (SQL的多行註釋)
hello
world
abandon
*/
DDL 數據庫定義語言
DML 數據庫操作管理語言
DQL 數據庫查詢語言
DCL 數據庫控制語言
2.2、操作數據庫
操作數據庫>操作數據庫中的表>操作數據庫中表的數據
(1)創建數據庫
create database [if not exists] westos;
(2)刪除數據庫
drop databases [if exists] westos;
(3)使用數據庫
表名和字段名加反引號
select `user` from `employee` where `name` = "zhangsan"
(4)查看數據庫
show databases; --查看所有的數據庫
2.3、數據庫的列類型
數值
- tinyint 十分小的數據 1個字節
- smallint 較小的數據 2個字節
- mediumint 中等大小的數據 3個字節
- int 標準的整數 4個字節 常用的
- bigint 較大的數據 8個字節
- float 單精度浮點數 4個字節
- double 雙精度浮點數 8個字節 (精度問題)
- decimal 字符串形式的浮點數 金融計算的時候,一般是使用decimal
字符串
- char 字符串固定大小的 0~255
- varchar 可變字符串 0~65535 常用的 String
- tinytext 微型文本 2^8-1
- text 文本串 2^16-1
時間日期
- date yyyy-MM-dd 日期
- time hh:MM:ss 時間格式
- datetime yyyy-MM-dd hh:MM:ss 最常用的時間格式
- timestamp 時間戳 1970.01.01到現在的毫秒數 也較爲常用
- year 年份表示
null
2.4、 數據庫的字段屬性(重點)
Unsigned:
- 無符號的整數
- 聲明瞭該列不能聲明爲負數
zerofill:
- 不足的位數,使用0來填充
自增:
- 自動在上一條記錄的基礎上+1(默認)
- 通常用來設計唯一的主鍵,index,必須是整數類型
- 可以自定義設計主鍵自增的騎士值和步長
非空:
- 假設設置爲 not null ,如果不給它賦值,就會報錯
- NULL,如果不填寫值,默認就是null
默認:
- 設置默認的值
每一個表,都必須存在以下五個字段,保證它的健壯性和安全性
id
主鍵version
樂觀鎖is_delete
僞刪除gmt_create
創建時間gmt_update
修改時間
2.5、創建數據庫表
-- auto_increment 自增
-- 字符串使用單引號括起來
-- 所有的語句後面加,(英文的),最後一個不用加
-- primary key 主鍵,一般一個表只有一個唯一的主鍵
create table if not exists `employee` (
`id` int(11) not null auto_increment comment '工號',
`name` varchar(30) not null default '匿名' comment '姓名',
`pwd` varchar(20) not null default '123456' comment '密碼',
`sex` varchar(2) not null default '男' comment '性別',
`birthday` datetime default null comment '出生日期',
`address` varchar(100) default null comment '家庭住址',
`email` varchar(50) default null comment '郵箱',
primary key(`id`)
)engine=innodb default charset=utf8
格式
create table [if not exists] `表名`(
`字段名` 列類型 [屬性] [索引] [註釋],
`字段名` 列類型 [屬性] [索引] [註釋],
......
`字段名` 列類型 [屬性] [索引] [註釋]
)[表類型][字符集設置][註釋]
show create database company -- 查看創建數據庫的語句
show create table employee -- 查看創建數據表的語句
desc employee -- 顯示錶的結構
2.6、MyISAM和InnoDB的區別
關於數據庫引擎
InnoDB默認使用
MyISAM早些年使用
MyISAM | InnoDB | |
---|---|---|
事務支持 | 不支持 | 支持 |
數據行鎖定 | 不支持 | 支持 |
外鍵約束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空間的大小 | 較小 | 較大,約爲MyISAM的2倍 |
常規使用操作:
- MyISAM 節約空間,速度較快
- InnoDB 安全性高,事務的處理,多表多用戶操作
在物理空間存在的位置
所有的數據庫文件都存在data目錄下,一個文件夾就對應一個數據庫
本質還是文件的存儲
MySQL引擎在物理文件上的區別
- InnoDB在數據庫表中只有一個*.frm文件,以及上級目錄下的ibdata1文件
- MyISAM對應文件
- *.frm 表結構的定義文件
- *.MYD 數據文件 (data)
- *.MYI 索引文件 (index)
設置數據庫表的字符集編碼
charset=utf8
不設置的話,會是mysql默認的字符集編碼(不支持中文)
MySQL的默認編碼是Latin1,不支持中文
在my.ini中配置默認的編碼
character-set-server=utf8
2.7、修改和刪除表
修改
-- 修改表名 alter table 舊錶名 rename as 新表名
alter table employer rename as employer1
-- 增加表的字段 alter table 表名 add 字段名 列屬性[]
alter table employer1 add age int(11)
-- 修改表的字段 (重命名,修改約束)
-- alter table 表名 modify 字段名 列屬性[]
alter table employer1 modify age varchar(11) -- 修改約束
-- alter table 表名 change 舊名字 新名字 列屬性[]
alter table employer1 change age age1 int(1) -- 字段重命名
-- 刪除表的字段 alter table 表名 drop 字段名
alter table employer1 drop age1
結論
- change用來字段重命名,不能修改字段類型和約束
- modify不用來字段重命名,只能修改字段類型和約束
刪除
-- 刪除表(如果表存在再刪除)
drop table if exists employer1
注意點:
- 所有的表名和字段名使用反引號``包裹
- 註釋使用-- /**/
- sql關鍵字大小寫不敏感,儘量寫小寫
- 所有的符號全部用英文
3、MySQL數據管理
3.1、外鍵
方式一:在創建表的時候,增加約束(麻煩,比較複雜)
create table `department` (
`departmentid` int(11) not null auto_increment comment '部門id',
`departmentname` varchar(50) not null comment '部門名稱',
primary key(`departmentid`)
)engine=innodb default charset=utf8
-- 員工表的departmentid字段,要去引用部門表的departmentid
-- 定義外鍵key
-- 給這個外鍵添加約束(執行引用) references 引用
create table if not exists `employee` (
`id` int(11) not null auto_increment comment '工號',
`name` varchar(30) not null default '匿名' comment '姓名',
`pwd` varchar(20) not null default '123456' comment '密碼',
`sex` varchar(2) not null default '男' comment '性別',
`birthday` datetime default null comment '出生日期',
`departmentid` int(11) not null comment '員工的部門',
`address` varchar(100) default null comment '家庭住址',
`email` varchar(50) default null comment '郵箱',
primary key(`id`),
key `FK_departmentid` (`departmentid`),
constraint `FK_departmentid` foreign key (`departmentid`) references `department`(`departmentid`)
)engine=innodb default charset=utf8
刪除有外鍵關係的表的時候,必須要刪除引用別人的表(從表),再刪除被引用的表(主表)
方式二:創建表成功後,添加外鍵約束
create table `department` (
`departmentid` int(11) not null auto_increment comment '部門id',
`departmentname` varchar(50) not null comment '部門名稱',
primary key(`departmentid`)
)engine=innodb default charset=utf8
create table if not exists `employee` (
`id` int(11) not null auto_increment comment '工號',
`name` varchar(30) not null default '匿名' comment '姓名',
`pwd` varchar(20) not null default '123456' comment '密碼',
`sex` varchar(2) not null default '男' comment '性別',
`birthday` datetime default null comment '出生日期',
`departmentid` int(11) not null comment '員工的部門',
`address` varchar(100) default null comment '家庭住址',
`email` varchar(50) default null comment '郵箱',
primary key(`id`)
)engine=innodb default charset=utf8
-- 創建表的時候沒有外鍵關係
alter table `employee` add constraint `FK_departmentid` foreign key(`departmentid`) references `department`(`departmentid`);
-- alter table 表名 add constraint 約束名 foreign key(作爲外鍵的列) references 哪個表(哪個字段);
以上的操作都是物理外鍵,數據庫級別的外鍵,一般不使用,避免數據庫過多造成困擾
最佳實踐
- 數據庫就是單純的表,只用來存數據,只有行(數據)和列(字段)
- 我們想使用多張表的數據,想使用外鍵(程序去實現)
阿里JAVA規範:【強制】不得使用外鍵和級聯,一切外鍵概念必須在應用層解決
3.2、DML語言
數據庫的意義:數據存儲,數據管理
DML語言:數據操作語言
- insert
- update
- delete
3.3、添加
insert
-- 插入語句(添加)
-- insert into 表名([字段名1,字段名2,字段名3]) values (`值1`,`值2`,`值3`)
insert into `department`(`departmentname`) values (`開發部`)
-- 由於主鍵自增我們可以省略(如果不寫表的字段,它就會一一匹配)
insert into `department` values(`開發部`)
-- 一般寫插入語句,一定要數據和字段一一對應
-- 插入多個字段
insert into `department`(`departmentname`) values ('開發部'),('產品部')
insert into `employee`(`name`) values ('張三')
insert into `employee`(`name`,`pwd`,`sex`) values ('張三','aaaaaaaa','男')
insert into `employee`(`name`,`pwd`,`sex`) values ('張三','aaaaaaaa','男'),('李四','bbbbbbbb','男')
語法:insert into 表名([字段名1,字段名2,字段名3]) values (`值1`),(`值2`),(`值3`)
注意事項
- 1、字段和字段之間使用英文逗號隔開
- 2、字段是可以省略的,但是後面的值必須要一一對應,不能少
- 3、可以同時插入多條數據,values後面的值,需要使用,隔開即可
values(),()......