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

一,數(shù)據(jù)庫

1.1 概念

數(shù)據(jù)庫就是存儲數(shù)據(jù)的倉庫

數(shù)據(jù)庫可以實現(xiàn)數(shù)據(jù)的持久化存儲

數(shù)據(jù)庫的本質(zhì)是文件系統(tǒng)

1.2 DBMS

Database Management System 數(shù)據(jù)庫管理系統(tǒng)

常見的DBMS:

MySQL:Oracle公司的中小型數(shù)據(jù)庫,從6版本開始收費

Oracle:Oracle公司的大型數(shù)據(jù)庫

DB2:IBM公司的大型數(shù)據(jù)庫

SQLServer:Mircosoft微軟公司的大型數(shù)據(jù)庫

SQLite:移動端的嵌入式的小型數(shù)據(jù)庫

Java中主要使用的是MySQL和Oracle

1.3 數(shù)據(jù)庫的結(jié)構(gòu)

一個DBMS中可以維護(hù)管理多個數(shù)據(jù)庫

一個數(shù)據(jù)庫由若干張表組成

一張表包含若干條記錄

一條記錄包含若干字段

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

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

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

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

  1. 根據(jù)類創(chuàng)建出的對象相當(dāng)于數(shù)據(jù)庫表中的一行(一條記錄):

例如:當(dāng)我們獲取了一個卡車對象時,我們就能夠知道該卡車所具有的所有信息;同樣當(dāng)我們查詢到一條指定的卡車記錄時也就可以明確該卡車的所有信息

1.4 SQL語言

結(jié)構(gòu)化查詢語言 Structured Query Language

分類:

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

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

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

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

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

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

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

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

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

  1. DCL:數(shù)據(jù)庫控制語言(Data Control Language)

對數(shù)據(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. 再輸入密碼(此時密碼會以星號顯示)

方式三:

  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ù)庫的同時指定編碼格式:

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ù)必須一致
  2. 添加記錄時,值的類型必須與字段類型一致
  3. 除了數(shù)值類型,其他類型的值必須使用單/雙引號括起來
  4. "delete from 表名" 該語句在刪除時是將表中數(shù)據(jù)逐行刪除,指的是表中有多少條記錄,就會執(zhí)行所少次delete動作;"truncate table 表名" 該語句在刪除時是先將整個表刪除,再構(gòu)建一個結(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):此時該salary的最大值是9999.99

2.4.2 日期和時間類型

datetime:包含年月日時分秒 格式:YYYY-MM-DD HH:MM:SS

timestamp:時間戳類型 包含年月日時分秒 格式:YYYY-MM-DD HH:MM:SS

? 注:

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

  2. timestamp不能為空

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

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

2.4.3 字符串類型

varchar:

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

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

2.5 查詢

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

? 例如:對班級去重

select distinct class from student;
2.5.2 條件查詢

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

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

    and、or、not

    &&、||、!

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

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

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

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

    between ... and ...

    注:含頭含尾

    例如:查詢成績在80~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. _:單個任意字符
    2. %:任意個任意字符

    例如:查詢姓“盧”,單名一個字的同學(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

    例如:對員工的銷售額進(jìn)行降序排列

select * from emp order by sales desc;

? 例如:升序查詢所有女性員工的工資

select * from emp where sex = "女" order by money asc;

注:如果多個條件進(jìn)行排序,只有當(dāng)前一個條件的值相同時,才會比較第二個條件

格式:order by 排序字段1 排序方式 ,排序字段2 排序方式 ,...

? 例如:以工資降序的方式查詢所有員工,如果工資相同則按銷售額升序排列

select * from emp order by money desc, sales;
2.5.4 聚合函數(shù)

概念:將一列數(shù)據(jù)作為一個整體,進(jìn)行縱向的計算。

avg():計算平均值

sum():求和

max():求最大值

min():求最小值

count():求個數(shù)

? count()中一般使用非空字段->主鍵 或者 *

計算平均工資
select avg(money) from emp;
計算總銷售額
select sum(sales) from emp;
查詢工資最高的員工
select * from emp where money = (select max(money) from emp)
統(tǒng)計部門字段為空的人數(shù)
select count(*) from emp where department is null;

注:聚合函數(shù)的計算排除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)行篩選
查詢每個部門的平均銷售額
select avg(sales),department  from emp group by department;

查詢男員工和女員工的最高收入
select sex,max(money)  from emp group by sex;

查詢每個部門女性員工的平均銷售額,以平均銷售額降序方式排列
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;

查詢每個部門男性員工平均銷售額超過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 約束

概念:對表中數(shù)據(jù)進(jìn)行限定

分類:

  1. 非空約束:not null

    1. 唯一約束:unique
    2. 主鍵約束:primary key
    3. 外鍵約束:foreign key
2.6.1 非空約束

限定字段值不能為空

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

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

  1. 刪除非空約束(設(shè)置字段允許有空值)
alter table 表名 modify 字段名 字段類型;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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