一,數(shù)據(jù)庫
1.1 概念
數(shù)據(jù)庫就是存儲(chǔ)數(shù)據(jù)的倉庫
數(shù)據(jù)庫可以實(shí)現(xiàn)數(shù)據(jù)的持久化存儲(chǔ)
數(shù)據(jù)庫的本質(zhì)是文件系統(tǒng)
1.2 DBMS
Database Management System 數(shù)據(jù)庫管理系統(tǒng)
常見的DBMS:
MySQL:Oracle公司的中小型數(shù)據(jù)庫,從6版本開始收費(fèi)
Oracle:Oracle公司的大型數(shù)據(jù)庫
DB2:IBM公司的大型數(shù)據(jù)庫
SQLServer:Mircosoft微軟公司的大型數(shù)據(jù)庫
SQLite:移動(dòng)端的嵌入式的小型數(shù)據(jù)庫
Java中主要使用的是MySQL和Oracle
1.3 數(shù)據(jù)庫的結(jié)構(gòu)
一個(gè)DBMS中可以維護(hù)管理多個(gè)數(shù)據(jù)庫
一個(gè)數(shù)據(jù)庫由若干張表組成
一張表包含若干條記錄
一條記錄包含若干字段
- 數(shù)據(jù)庫中的表相當(dāng)于代碼中的實(shí)體類:
例如:要研究護(hù)士這個(gè)實(shí)體類,在對(duì)護(hù)士對(duì)象進(jìn)行數(shù)據(jù)管理時(shí)就應(yīng)該有一張對(duì)應(yīng)的護(hù)士表
- 數(shù)據(jù)庫中的字段(列)相當(dāng)于代碼中實(shí)體類的屬性:
例如:寵物具有壽命屬性,在寵物表中就應(yīng)該定義壽命字段
- 根據(jù)類創(chuàng)建出的對(duì)象相當(dāng)于數(shù)據(jù)庫表中的一行(一條記錄):
例如:當(dāng)我們獲取了一個(gè)卡車對(duì)象時(shí),我們就能夠知道該卡車所具有的所有信息;同樣當(dāng)我們查詢到一條指定的卡車記錄時(shí)也就可以明確該卡車的所有信息
1.4 SQL語言
結(jié)構(gòu)化查詢語言 Structured Query Language
分類:
- DDL:數(shù)據(jù)定義語言(Data Definition Language)
針對(duì)數(shù)據(jù)庫、表進(jìn)行創(chuàng)建、修改、刪除等操作
關(guān)鍵字:create、alter、drop等
- DML:數(shù)據(jù)操作語言(Data Manipulation Language)
針對(duì)表中記錄、字段進(jìn)行操作
關(guān)鍵字:insert、delete、update等
- DQL:數(shù)據(jù)查詢語言(Data Query Language)
對(duì)數(shù)據(jù)庫的、表、記錄、字段進(jìn)行查詢
關(guān)鍵字:select、where、in、order by、limit、group by、having等
- DCL:數(shù)據(jù)庫控制語言(Data Control Language)
對(duì)數(shù)據(jù)庫的安全級(jí)別和訪問權(quán)限進(jìn)行管理的
關(guān)鍵字:revoke、grant、commit、rollback等
1.5 mysql軟件
1.5.1 卸載
- 在控制面板進(jìn)行軟件卸載
- 刪除mysql安裝路徑下的mysql文件夾
- 找到C盤下的ProgramData文件夾,刪除其中的mysql文件夾
1.5.2 安裝
根據(jù)安裝圖解進(jìn)行安裝
注:安裝目錄必須是純英文路徑的
1.5.3 登錄數(shù)據(jù)庫
方式一:
? 1. 打開cmd
- 輸入mysql -uroot -p1234
方式二:
- 打開cmd
- 輸入mysql -uroot -p
- 再輸入密碼(此時(shí)密碼會(huì)以星號(hào)顯示)
方式三:
- 找到安裝mysql后,軟件所提供的的mysql command line client
- 輸入密碼
二,SQL
? C(create)R(read)U(update)D(delete)
2.1 庫的操作
建庫:
create database 庫名;判斷數(shù)據(jù)庫是否存在,不存在才創(chuàng)建:
create database if not exists 庫名;查看已有的數(shù)據(jù)庫:
show databases;刪庫:
drop database 庫名;判斷數(shù)據(jù)庫是否存在,存在才刪除:
drop database if exists 庫名;創(chuàng)建數(shù)據(jù)庫的同時(shí)指定編碼格式:
create database 庫名 character set 編碼格式;修改數(shù)據(jù)庫的編碼格式:
alter database 庫名 character set 編碼格式;查詢數(shù)據(jù)庫的創(chuàng)建語句及編碼格式:
show create database 庫名;指定要使用的數(shù)據(jù)庫:
use 庫名;
2.2 表的操作
查看數(shù)據(jù)庫中的表:
show tables;建表:
create table 表名(字段名 字段類型 [約束], 字段名 字段類型 [約束], ...);判斷表是否已存在,不存在才創(chuàng)建:
create table if not exists 表名(字段名 字段類型 [約束], 字段名 字段類型 [約束], ...);刪表:
drop table 表名;判斷表是否已存在,存在才刪除:
drop table if exists 表名;復(fù)制表結(jié)構(gòu):
create table 新表名 like 被復(fù)制的表名;修改表名:
alter table 舊表名 rename to 新表名;查看表結(jié)構(gòu):
desc 表名;
修改表結(jié)構(gòu):
添加新字段
alter table 表名 add 新字段 字段類型 [約束];刪除字段
alter table 表名 drop 字段;修改字段類型
alter table 表名 modify 字段 類型;修改字段名
alter table 表名 change 舊字段名 新字段名 類型;
2.3 記錄、字段的操作
查詢表中所有記錄:
select * from 表名; *表示所有字段(列)添加記錄:
向所有字段添加數(shù)據(jù)
insert into 表名 values(值1, 值2, 值3, ...);向指定字段添加數(shù)據(jù)
insert into 表名 (字段1,字段2,...) values (值1,值2,...);批量添加(所有字段)
insert into 表名 values (值1, 值2, 值3, ...),(值1, 值2, 值3, ...),...;批量添加(指定字段)
insert into 表名 (字段1,字段2,...) values (值1,值2,...),(值1,值2,...),...;刪除記錄:
- 刪除表中所有記錄
delete from 表名;
- 刪除表中所有記錄
truncate table 表名;
- 根據(jù)條件刪除指定記錄
delete from 表名 where 條件;修改記錄:
- 根據(jù)條件修改指定記錄
update 表名 set 字段名1 = 字段值1,字段名2 = 字段值2,... where 條件;
- 修改所有記錄
update 表名 set 字段名1 = 字段值1,字段名2 = 字段值2,...;
? 注:
- 添加記錄時(shí),值的列數(shù)必須與字段列數(shù)必須一致
- 添加記錄時(shí),值的類型必須與字段類型一致
- 除了數(shù)值類型,其他類型的值必須使用單/雙引號(hào)括起來
- "delete from 表名" 該語句在刪除時(shí)是將表中數(shù)據(jù)逐行刪除,指的是表中有多少條記錄,就會(huì)執(zhí)行所少次delete動(dòng)作;"truncate table 表名" 該語句在刪除時(shí)是先將整個(gè)表刪除,再構(gòu)建一個(gè)結(jié)構(gòu)一樣的空表。
2.4 數(shù)據(jù)類型
2.4.1 數(shù)值類型
int:整數(shù)類型
double:小數(shù)類型
? 例如:salary double(n,m)
? n:表示該字段值整數(shù)部分小數(shù)部分最多有n位
? m:表示該字段小數(shù)部分最多保留m位
? salary double(6 , 2):此時(shí)該salary的最大值是9999.99
2.4.2 日期和時(shí)間類型
datetime:包含年月日時(shí)分秒 格式:YYYY-MM-DD HH:MM:SS
timestamp:時(shí)間戳類型 包含年月日時(shí)分秒 格式:YYYY-MM-DD HH:MM:SS
? 注:
如果某字段的類型是timestamp,而我們不給它賦值或者給它賦值為null,那么系統(tǒng)會(huì)給它一個(gè)默認(rèn)值(當(dāng)前時(shí)間)
timestamp不能為空
設(shè)置時(shí)分秒前必須先設(shè)置年月日
時(shí)間值需要根據(jù)指定格式進(jìn)行設(shè)置
2.4.3 字符串類型
varchar:
? 例如:name varchar(20):表示姓名字段的值最大20個(gè)字符
? 注:數(shù)字、字母、漢字都占1個(gè)字符
2.5 查詢
2.5.1 基礎(chǔ)查詢
- 查詢?nèi)?/li>
select * from 表名;
- 根據(jù)指定字段查詢
select 字段名1,字段名2,... from 表名;
- 去重查詢
select distinct 字段名 from 表名;? 例如:對(duì)班級(jí)去重
select distinct class from student;
2.5.2 條件查詢
在where關(guān)鍵字后跟上條件,查詢時(shí)根據(jù)條件進(jìn)行篩選
邏輯運(yùn)算符
and、or、not
&&、||、!
關(guān)系運(yùn)算符
大于、大于等于、小于、小于等于、等于(=)、不等于(!=、<>)
例如:查詢"帥哥班"以外的班級(jí)中成績超過80的同學(xué)
select * from student where score > 80 and class != '帥哥班'
指定范圍之內(nèi)
between ... and ...
注:含頭含尾
例如:查詢成績?cè)?0~100之間的同學(xué)
select * from student where score between 80 and 100;
在指定列表中
in (值1,值2,值3,...)
不在指定列表中 not in
例如:查詢成績不是58,68,78,88的同學(xué)
select * from student where score not in (58,68,78,88);
空和非空
判斷為空 is null
判斷不為空 is not null
例如:查詢成績欄為空的同學(xué)
select * from student where score is null;
模糊查詢
like
占位符:
- _:單個(gè)任意字符
- %:任意個(gè)任意字符
例如:查詢姓“盧”,單名一個(gè)字的同學(xué)
select * from student where name like '盧_';? 例如:查詢名字中含“豬”的同學(xué)
select * from student where name like '%豬%';
2.5.3 排序查詢
使用關(guān)鍵字order by
排序方式:
升序:默認(rèn),asc
降序:desc
例如:對(duì)員工的銷售額進(jìn)行降序排列
select * from emp order by sales desc;? 例如:升序查詢所有女性員工的工資
select * from emp where sex = "女" order by money asc;注:如果多個(gè)條件進(jìn)行排序,只有當(dāng)前一個(gè)條件的值相同時(shí),才會(huì)比較第二個(gè)條件
格式:order by 排序字段1 排序方式 ,排序字段2 排序方式 ,...
? 例如:以工資降序的方式查詢所有員工,如果工資相同則按銷售額升序排列
select * from emp order by money desc, sales;
2.5.4 聚合函數(shù)
概念:將一列數(shù)據(jù)作為一個(gè)整體,進(jìn)行縱向的計(jì)算。
avg():計(jì)算平均值
sum():求和
max():求最大值
min():求最小值
count():求個(gè)數(shù)
? count()中一般使用非空字段->主鍵 或者 *
計(jì)算平均工資 select avg(money) from emp; 計(jì)算總銷售額 select sum(sales) from emp; 查詢工資最高的員工 select * from emp where money = (select max(money) from emp) 統(tǒng)計(jì)部門字段為空的人數(shù) select count(*) from emp where department is null;注:聚合函數(shù)的計(jì)算排除null值
2.5.5 分頁查詢
語法:limit 開始索引,每頁查詢的記錄數(shù)
注:索引從0開始
公式:開始索引 = (當(dāng)前頁碼 - 1) * 每頁查詢的記錄數(shù)
每頁查詢4條記錄,查詢第3頁 select * from emp limit 8,4; 降序查詢員工的銷售額,每頁顯示2條記錄,查詢第3頁 select * from emp order by sales desc limit 4,2;
2.5.6 分組查詢
語法:group by 分組字段
注:
1. 分組后查詢的字段應(yīng)該是:分組字段、聚合函數(shù) 2. where和having的區(qū)別: 1. where在分組前進(jìn)行篩選,如果不滿足where條件則不進(jìn)入分組。having在分組后進(jìn)行篩選,如果不滿足則不被查詢到 2. where后不能跟聚合函數(shù),having后可以使用聚合函數(shù)進(jìn)行篩選查詢每個(gè)部門的平均銷售額 select avg(sales),department from emp group by department; 查詢男員工和女員工的最高收入 select sex,max(money) from emp group by sex; 查詢每個(gè)部門女性員工的平均銷售額,以平均銷售額降序方式排列 select avg(sales),department from emp where sex = "女" group by department order by avg(sales) desc; 查詢平均銷售額超過9000的部門 select avg(sales),department from emp group by department having avg(sales) > 9000; 查詢每個(gè)部門男性員工平均銷售額超過9000的部門 select avg(sales),department from emp where sex = '男' group by department having avg(sales) > 9000;
2.5.7 查詢語句的結(jié)構(gòu)
select
? 字段列表
from
? 表名
where
? 條件列表
group by
? 分組字段
having
? 分組后的條件
order by
? 排序字段 排序方式
limit
? 分頁
2.6 約束
概念:對(duì)表中數(shù)據(jù)進(jìn)行限定
分類:
非空約束:not null
唯一約束:unique
主鍵約束:primary key
外鍵約束:foreign key
2.6.1 非空約束 not null
限定字段值不能為空
- 創(chuàng)建表時(shí),添加非空約束
create table 表名(字段名 字段類型 not null, 字段名 字段類型 [約束], ...);
- 創(chuàng)建表后,添加非空約束
alter table 表名 modify 字段名 字段類型 not null ;? 注:已存在空值的字段不能被設(shè)置成非空的
- 刪除非空約束(設(shè)置字段允許有空值)
alter table 表名 modify 字段名 字段類型;
2.6.2 唯一約束 unique
限定某一字段的字段值不能有重復(fù)
- 創(chuàng)建表時(shí),添加唯一約束
create table 表名(字段名 字段類型 unique, 字段名 字段類型 [約束], ...);
- 創(chuàng)建表后,添加唯一約束
alter table 表名 modify 字段名 字段類型 unique;
- 刪除唯一約束(設(shè)置字段允許有重復(fù)值)
alter table 表名 drop index 字段名;注:
- 唯一約束的值可以是空值,可以存在多個(gè)空值,但是只能有唯一的“null”值
- 一個(gè)字段可以同時(shí)設(shè)置成非空唯一,非空和唯一約束的順序是任意的
2.6.3 主鍵約束 primary key
特點(diǎn):
非空且唯一
- 一張表只能有一個(gè)字段是主鍵
- 主鍵是表中記錄的唯一標(biāo)識(shí)
- 創(chuàng)建表時(shí),添加主鍵約束
create table 表名(字段名 字段類型 primary key, 字段名 字段類型 [約束], ...); create table 表名(字段名 字段類型 [約束], 字段名 字段類型 [約束], ... , primary key(主鍵字段));
- 創(chuàng)建表后,添加主鍵約束
alter table 表名 modify 字段名 字段類型 primary key;
- 刪除主鍵
alter table 表名 drop primary key; 注意:刪除主鍵約束后,主鍵仍有非空約束
主鍵自增長:
概念:如果某個(gè)字段是數(shù)值類型的主鍵字段,可以使用 auto_increment 來實(shí)現(xiàn)主鍵自增長
注:
自增長的主鍵必須是數(shù)值類型的(整數(shù)或者小數(shù))
- 當(dāng)添加記錄時(shí),不為該字段賦值或者賦值為null,該字段就會(huì)自增長
- 第一條自增長的字段值是 1
- 從已存在的最大值開始 + 1
- 從已存在的最大值是小數(shù)時(shí),自增長的值是向上取整
- 只有主鍵可以自增長
- 創(chuàng)建表時(shí),添加主鍵自增長
create table 表名(字段名 字段類型 primary key auto_increment, 字段名 字段類型 [約束], ...);
- 創(chuàng)建表后,添加主鍵自增長
alter table 表名 modify 主鍵字段 字段類型 auto_increment;
- 創(chuàng)建表后,添加主鍵約束的同時(shí),設(shè)置自增長
alter table 表名 modify 字段名 字段類型 primary key auto_increment
- 刪除自增長
alter table 表名 modify 字段名 字段類型;
三,多表
3.1 表與表之間的關(guān)系
一對(duì)一
例如:人和身份證、公司與注冊(cè)地址
一對(duì)多(多對(duì)一)
例如:部門和員工、商品和分類
多對(duì)多
例如:學(xué)生和課程、訂單和商品
3.2 多表關(guān)系的實(shí)現(xiàn)
一對(duì)一
在任何一方添加外鍵指向另一方法的主鍵
一對(duì)多
在多的一方建立外鍵,指向一的一方的主鍵
多對(duì)多
需要借助第三張中間表。
中間表至少要包含兩個(gè)字段,這兩個(gè)字段都是外鍵,
分別指向兩張表的主鍵。