從頭開始學java——MySQL

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

  • 沒有值 未知
  • 注意不要使用null進行運算,結果爲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(),()......

3.4、修改

3.5、刪除

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章