day43-數(shù)據(jù)庫(補(bǔ)充)

一,數(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ù)庫由若干張表組成

一張表包含若干條記錄

一條記錄包含若干字段

  1. 數(shù)據(jù)庫中的表相當(dāng)于代碼中的實(shí)體類:

例如:要研究護(hù)士這個(gè)實(shí)體類,在對(duì)護(hù)士對(duì)象進(jìn)行數(shù)據(jù)管理時(shí)就應(yīng)該有一張對(duì)應(yīng)的護(hù)士表

  1. 數(shù)據(jù)庫中的字段(列)相當(dāng)于代碼中實(shí)體類的屬性:

例如:寵物具有壽命屬性,在寵物表中就應(yīng)該定義壽命字段

  1. 根據(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

分類:

  1. DDL:數(shù)據(jù)定義語言(Data Definition Language)

針對(duì)數(shù)據(jù)庫、表進(jìn)行創(chuàng)建、修改、刪除等操作

關(guān)鍵字:create、alter、drop等

  1. DML:數(shù)據(jù)操作語言(Data Manipulation Language)

針對(duì)表中記錄、字段進(jìn)行操作

關(guān)鍵字:insert、delete、update等

  1. DQL:數(shù)據(jù)查詢語言(Data Query Language)

對(duì)數(shù)據(jù)庫的、表、記錄、字段進(jìn)行查詢

關(guān)鍵字:select、where、in、order by、limit、group by、having等

  1. 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 卸載
  1. 在控制面板進(jìn)行軟件卸載
  2. 刪除mysql安裝路徑下的mysql文件夾
  3. 找到C盤下的ProgramData文件夾,刪除其中的mysql文件夾
1.5.2 安裝

根據(jù)安裝圖解進(jìn)行安裝

注:安裝目錄必須是純英文路徑的

1.5.3 登錄數(shù)據(jù)庫

方式一:

? 1. 打開cmd

  1. 輸入mysql -uroot -p1234

方式二:

  1. 打開cmd
  2. 輸入mysql -uroot -p
  3. 再輸入密碼(此時(shí)密碼會(huì)以星號(hào)顯示)

方式三:

  1. 找到安裝mysql后,軟件所提供的的mysql command line client
  2. 輸入密碼

二,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):

  1. 添加新字段

    alter table 表名 add 新字段 字段類型 [約束];
    
  2. 刪除字段

    alter table 表名 drop 字段;
    
  3. 修改字段類型

    alter table 表名 modify 字段 類型;
    
  4. 修改字段名

    alter table 表名 change 舊字段名 新字段名 類型;
    

2.3 記錄、字段的操作

查詢表中所有記錄:

select * from 表名;
*表示所有字段(列)

添加記錄:

  1. 向所有字段添加數(shù)據(jù)

    insert into 表名 values(值1, 值2, 值3, ...);
    
  2. 向指定字段添加數(shù)據(jù)

    insert into 表名 (字段1,字段2,...) values (值1,值2,...);
    
  3. 批量添加(所有字段)

    insert into 表名 values (值1, 值2, 值3, ...),(值1, 值2, 值3, ...),...;
    
  4. 批量添加(指定字段)

    insert into 表名 (字段1,字段2,...) values (值1,值2,...),(值1,值2,...),...;
    

刪除記錄:

  1. 刪除表中所有記錄
delete from 表名;
  1. 刪除表中所有記錄
truncate table 表名;
  1. 根據(jù)條件刪除指定記錄
delete from 表名 where 條件;

修改記錄:

  1. 根據(jù)條件修改指定記錄
update 表名 set 字段名1 = 字段值1,字段名2 = 字段值2,... where 條件;
  1. 修改所有記錄
update 表名 set 字段名1 = 字段值1,字段名2 = 字段值2,...;

? 注:

  1. 添加記錄時(shí),值的列數(shù)必須與字段列數(shù)必須一致
  2. 添加記錄時(shí),值的類型必須與字段類型一致
  3. 除了數(shù)值類型,其他類型的值必須使用單/雙引號(hào)括起來
  4. "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

? 注:

  1. 如果某字段的類型是timestamp,而我們不給它賦值或者給它賦值為null,那么系統(tǒng)會(huì)給它一個(gè)默認(rèn)值(當(dāng)前時(shí)間)

  2. timestamp不能為空

  3. 設(shè)置時(shí)分秒前必須先設(shè)置年月日

  4. 時(shí)間值需要根據(jù)指定格式進(jìn)行設(shè)置

2.4.3 字符串類型

varchar:

? 例如:name varchar(20):表示姓名字段的值最大20個(gè)字符

? 注:數(shù)字、字母、漢字都占1個(gè)字符

2.5 查詢

2.5.1 基礎(chǔ)查詢
  1. 查詢?nèi)?/li>
select * from 表名;
  1. 根據(jù)指定字段查詢
select 字段名1,字段名2,... from 表名;
  1. 去重查詢
select distinct 字段名 from 表名;

? 例如:對(duì)班級(jí)去重

select distinct class from student;
2.5.2 條件查詢

在where關(guān)鍵字后跟上條件,查詢時(shí)根據(jù)條件進(jìn)行篩選

  1. 邏輯運(yùn)算符

    and、or、not

    &&、||、!

  2. 關(guān)系運(yùn)算符

    大于、大于等于、小于、小于等于、等于(=)、不等于(!=、<>)

    例如:查詢"帥哥班"以外的班級(jí)中成績超過80的同學(xué)

select * from student where score > 80 and class != '帥哥班'
  1. 指定范圍之內(nèi)

    between ... and ...

    注:含頭含尾

    例如:查詢成績?cè)?0~100之間的同學(xué)

select * from student where score between 80 and 100;
  1. 在指定列表中

    in (值1,值2,值3,...)

    不在指定列表中 not in

    例如:查詢成績不是58,68,78,88的同學(xué)

select * from student where score not in (58,68,78,88);
  1. 空和非空

    判斷為空 is null

    判斷不為空 is not null

    例如:查詢成績欄為空的同學(xué)

select * from student where score is null;
  1. 模糊查詢

    like

    占位符:

    1. _:單個(gè)任意字符
    2. %:任意個(gè)任意字符

    例如:查詢姓“盧”,單名一個(gè)字的同學(xué)

select * from student where name like '盧_';

? 例如:查詢名字中含“豬”的同學(xué)

select * from student where name like '%豬%';
2.5.3 排序查詢

使用關(guān)鍵字order by

排序方式:

  1. 升序:默認(rèn),asc

  2. 降序: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)行限定

分類:

  1. 非空約束:not null

  2. 唯一約束:unique

  3. 主鍵約束:primary key

  4. 外鍵約束:foreign key

2.6.1 非空約束 not null

限定字段值不能為空

  1. 創(chuàng)建表時(shí),添加非空約束
create table 表名(字段名 字段類型 not null, 字段名 字段類型 [約束], ...);
  1. 創(chuàng)建表后,添加非空約束
alter table 表名 modify 字段名 字段類型 not null ;

? 注:已存在空值的字段不能被設(shè)置成非空的

  1. 刪除非空約束(設(shè)置字段允許有空值)
alter table 表名 modify 字段名 字段類型;
2.6.2 唯一約束 unique

限定某一字段的字段值不能有重復(fù)

  1. 創(chuàng)建表時(shí),添加唯一約束
create table 表名(字段名 字段類型 unique, 字段名 字段類型 [約束], ...);
  1. 創(chuàng)建表后,添加唯一約束
alter table 表名 modify 字段名 字段類型 unique;
  1. 刪除唯一約束(設(shè)置字段允許有重復(fù)值)
alter table 表名 drop index 字段名;

注:

  1. 唯一約束的值可以是空值,可以存在多個(gè)空值,但是只能有唯一的“null”值
  2. 一個(gè)字段可以同時(shí)設(shè)置成非空唯一,非空和唯一約束的順序是任意的
2.6.3 主鍵約束 primary key

特點(diǎn):

  1. 非空且唯一

    1. 一張表只能有一個(gè)字段是主鍵
    2. 主鍵是表中記錄的唯一標(biāo)識(shí)
  1. 創(chuàng)建表時(shí),添加主鍵約束
create table 表名(字段名 字段類型 primary key, 字段名 字段類型 [約束], ...);
create table 表名(字段名 字段類型 [約束], 字段名 字段類型 [約束], ... , primary key(主鍵字段));
  1. 創(chuàng)建表后,添加主鍵約束
alter table 表名 modify 字段名 字段類型 primary key;
  1. 刪除主鍵
alter table 表名 drop primary key;
注意:刪除主鍵約束后,主鍵仍有非空約束

主鍵自增長:

概念:如果某個(gè)字段是數(shù)值類型的主鍵字段,可以使用 auto_increment 來實(shí)現(xiàn)主鍵自增長

注:

  1. 自增長的主鍵必須是數(shù)值類型的(整數(shù)或者小數(shù))

    1. 當(dāng)添加記錄時(shí),不為該字段賦值或者賦值為null,該字段就會(huì)自增長
    2. 第一條自增長的字段值是 1
    3. 從已存在的最大值開始 + 1
    4. 從已存在的最大值是小數(shù)時(shí),自增長的值是向上取整
    5. 只有主鍵可以自增長
  1. 創(chuàng)建表時(shí),添加主鍵自增長
create table 表名(字段名 字段類型 primary key auto_increment, 字段名 字段類型 [約束], ...);
  1. 創(chuàng)建表后,添加主鍵自增長
alter table 表名 modify 主鍵字段 字段類型 auto_increment;
  1. 創(chuàng)建表后,添加主鍵約束的同時(shí),設(shè)置自增長
alter table 表名 modify 字段名 字段類型 primary key auto_increment
  1. 刪除自增長
alter table 表名 modify 字段名 字段類型;

三,多表

3.1 表與表之間的關(guān)系

  1. 一對(duì)一

    例如:人和身份證、公司與注冊(cè)地址

  2. 一對(duì)多(多對(duì)一)

    例如:部門和員工、商品和分類

  3. 多對(duì)多

    例如:學(xué)生和課程、訂單和商品

3.2 多表關(guān)系的實(shí)現(xiàn)

  1. 一對(duì)一

    在任何一方添加外鍵指向另一方法的主鍵

  2. 一對(duì)多

    在多的一方建立外鍵,指向一的一方的主鍵

  3. 多對(duì)多

    需要借助第三張中間表。
    中間表至少要包含兩個(gè)字段,這兩個(gè)字段都是外鍵,
    分別指向兩張表的主鍵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容