JavaEEDay32 數據庫


tags:

  • 數據庫
  • MySQL

style: summer

@toc

JavaEEDay32 數據庫

全篇總結:2019-8-1

針對庫:

  • 創庫:create database demo;
  • 查庫:
# 查看數據庫中數據表
show databases;

# 查看數據庫默認字符集等信息
show create database demo;
  • 刪庫:drop database demo;

針對表:

  • 創表:
# 進入要創建的數據庫
use demo; 
# 創建表格
create table people( 
  id   tinyint  not null  primary key  auto_increment,
  name  char(5) not null,
  gender  char(1),
  score  decimal(4, 2),
  home  enum("江蘇", "上海", "杭州", "蘇州"),
  hobby  set("游泳", "打球", "跑步")
)engine = InnoDB  default charset = utf8;
  • 查表:
# 看包含哪些表格
use demo;
show tables;
# 查看錶格,每個字段以及屬性
desc people;
# 查看錶格存儲引擎以及字符集
show create table people; 
  • 刪表:drop table people;
  • 改表:
    • 改表名:rename table people to person;或者alter table people rename to person;

針對字段:

  • 添加新字段:alter table people add tel tinyint(11);默認是添加到第一列;
  • 在指定位置添加字段:alter table people add tel tinyint(11) after gender;在 gender 後添加一列;
  • 修改字段數據類型:alter table people modify gender unsingned int;
  • 修改字段名稱與數據類型:alter table people change gender sex int;
  • 刪除字段:alter table people drop gender;
  • 添加主鍵:alter table people add primary key(id);

針對內容:

  • 添加數據:
# 對部分字段添加數據
insert into people(name, gender, score, home, hobby) values("張三", "男", 98.23, 2, 3);
insert into people(name, gender, score, home, hobby) values("李四五", "女",99.00,"江蘇", "游泳,打球");

#對所有字段添加數據
insert into people values(3, "王六", "男", 97);
  • 刪除數據:
    • 刪除整表中數據:delete from people;
    • 刪除部分表中數據:delete from people where id = 2; 刪除 id=2 這一行;
  • 修改數據:update 表名 set stuAge = 12,stuName = "趙六" where stuId = 2; 沒有 where 限定則表中所有數據都會改變;

查表:

單表查詢:

  • 查看所有數據:select * from 表名;
  • 只查某個表中某些字段數據:select 字段1,字段2 from 表名;
  • 查詢帶有條件的數據(以字段 3 值>10 爲例):select 字段1,字段2 from 表名 where 字段3>10;
  • 查詢字段去重之後的數據:select distinct 字段 from 表名;
  • 獲取表中某些字段的值,並且改變展示的字段名稱,同時多條限制條件;select stuName as "姓名" ,stuAge as "年齡" from stuInfo where stuAge >= 20 and stuScore <90;或者的話可以使用 or;
  • 排序查詢(默認升序):select * from stuInfo order by stuScore asc;降序改爲 desc;
  • 多重條件查詢:優先主條件,主條件相同按照附條件;select stuName,stuAge from stuInfo order by stuAge asc, stuScore desc;
  • 模糊查詢:
    • 查詢 某個字段以某個字符結尾的數據:select * from 表名 where stuName like "%看"; 其中%爲通配符,表示 0 到 n 個字符;
    • 查詢某個字段以 看 字結尾,且前面只有一個字符的數據:select * from 表名 where stuName like "_看"; 其中_爲通配符,表示 有且僅有 1 個字符;
    • 查詢某個字段包含 看 字字符:select * from 表名 where stuName like "%看%";
  • 模擬分頁顯示數據:
    • 只獲取前 3 條數據:select * from 表名 limit 3;
    • 從某個數據開始,向後獲取幾個數據:select * from 表名 limit 0, 5;從 第 0 個數據開始,向後獲取 5 個數據;
  • 內置函數:不推薦使用,應該是從數據庫獲取數據,然後使用 Java 代碼處理數據;
    • 獲取最大值:select max(stuAge) as "最大年齡" from stuInfo; 最小值爲:min,平均值爲:avg
    • 獲取總數:select count(*) as "總數" from stuInfo where stuAge > 20;中間的 as 和 where 都是可用可以不用;

多表查詢:

1. 一對一查詢

man 表中有 manID manName girlID; girl 表中有 girlID girlName;

  • 通過 man 和 girl 兩表中通過 grilID 進行匹配展示數據:
    select * from man ,girl where man.girlID = girl.girlID;
    另一種方式:內聯查詢:可以是實現多個表聯合查詢,其中 on 和 where 類似 【推薦使用】
    select * from man inner join girl on man.girlID = girl.girlID;

2. 一對多查詢

father 表中有:fatherID fatherName; son 表中有:sonID sonName fatherID;

  • 查詢某一個父親下的孩子:select * from father inner join son on son.fatherID = father.fatherID where fatherName = "XXX";
    將上面使用別名進行簡化書寫:select * from father f inner join son s on s.fatherID = f.fatherID where fatherName = "XXX";

3. 多對多查詢

多對多查詢需要使用中間表格
student 表格中有:stuID stuName ;
中間表格 stuToCouse 中有:stuToCouseID stuID couseID
couse 表格中有:couseID couseName

  • 查詢某一個學生選了哪些課程:select * from student s inner join stuToCouse sc on s.stuID = sc.stuID inner join couse c on sc.couseID = c.couseID where s.stuName = "XXX";
  • 查詢某一課程有哪些學生選擇:select * from couse c inner join stuToCouse sc on c.couseID = sc.couseID inner join student s on sc.stuID = s.stuID where c.couseName = "XXXX";

一、數據庫的組成

  • 數據庫服務器:裝有數據庫軟件的一個電腦
  • 數據庫:軟件:MySQL、Oracle
  • 數據表:一個表格,裏面放着一條一條的數據,類似於 Excel
  • 字段:表示該數據時什麼數據,例如:姓名、年齡、性別;
  • 數據行:一個完整的數據

二、數據庫分類

關係型數據庫,非關係型數據庫

  • 關係型數據庫:MySQL

三、SQL 語句

結構化查詢語句:Structured Query Language

四、SQL 語句分類

DDL:數據定義
DML:數據操作
DQL:數據查詢
DCL:數據控制
DTL:事務處理

CRUD 對應於:
create
read
update
delete

五、從命令行連接數據庫

需要:數據庫服務器地址 數據庫訪問用戶名 當前訪問用戶名的密碼 (本地連接 第一個可以不輸入)
例如完整的數據庫連接命名:mysql -hlocalhost -uroot -p12345
建議使用方式:mysql -hlocalhost -uroot -p然後輸入的是加密的密碼

  • sql 語句以;結尾
  • 退出命名:quit或者exit
  • 清楚本次錯誤輸入:\c

六、基本命令

命令 含義
show databases 查詢所有的數據庫
create database hello 創建數據庫 hello
drop database hello 刪除數據庫 hello(不可逆)
use hello 使用數據庫 hello (使用下面的表要先進入數據庫)
  • 創建數據表:create table 表名(字段名 數據類型,字段名 數據類型);
create table stuInfo(
  //格式爲:字段名  字段數據類型
  //varchar(30)相比char是可變長的,括號裏面數字爲可以放置的字節長度
  //tinyint只佔一個字節,更加節省空間
  stuID int,
  stuName varchar(30),
  stuGender tinyint,
  stuAge tinyint
);
  • 刪除數據表
    drop table stuInfo;
  • 查看錶的詳細信息desc 表名;實際命令爲:show columns from 表名;
  • 創建數據庫的簡要描述:show create database stuInfo;顯示數據庫默認字符集;(該庫必須是提前創建好的)
  • 創建數據表的簡要描述:show create table hello; 顯示數據表的 engine 和 charset
  • 默認的存儲引擎應該設置爲:InnoDB,字符集設置爲:utf8
  • 修改默認存儲引擎和字符集的方式:
    • 方式一:只該表當前表的設置:
create table test(
  name varchar(30);
  age  tinyint;
)engine = InnoDB default charset = utf8;
  • 方式二:修改全局配置
    在 MySQL 的配置文件:my.ini中設置默認的存儲引擎和字符集;

  • 修改表格裏面內容:

    • 添加新字段:alter table stuInfo add StuDesc text after stuAge; 在 stuAge 字段的後面增加 text 類型的新字段 stuDesc,如果在表的最後增加數據,不需要使用 after;
    • 修改老字段的數據類型:alter tabel stuInfo modify stuName char(30); 將 stuName 字段的數據類型改爲:char(30);
    • 刪除已有字段:alter table stuInfo drop stuDesc; 刪除 stuDesc 字段;
    • 同時修改字段名和數據類型:alter table stuInfo change stuGender stuSex char(1);
  • 插入數據:屬於 DML 操作

    • 選中一些字段添加數據:insert into stuInfo(stuId, stuName) values(2,"張三");剩餘字段值按照默認值處理;
    • 全部字段添加數據:insert into stuInfo values(3,"李四", "男" ,23,99);
      不需要將 stuInfo 中所有字段都列出來:insert into stuInfo(stuId, stuName,stuSex,stuAge,stuScore) values(1,"王五","男",22,98);

(一)MySQL 常用的數據類型

MySQL 5.0 以上版本中:
一個漢字佔多少長度和編碼有關:
utf8 :一個漢字 = 3 個字節;
gbk :一個漢字 = 2 個字節;
varchar(n)表示 n 個字符,無論漢字和英文,MySQL 都能存入 n 個字符,僅是實際字節長度有區別;

  • 數值類型:
類型 大小(字節) 範圍(有符號) 範圍(無符號) 用途
tinyint 1 (-128,127) (0,255) 小整數值
smallint 2 (-32 768,32 767) (0,65 535) 大整數值
mediumint 3 (-838.8 萬,838.8 萬) (0,1677.7 萬) 大整數值
int 或 integer 4 (-21.4 億,21.4 億) (0,42.9 億) 大整數值
bigint 8 (-92 京,92 京) (0,184 京) 極大整數值
folat 4 (-3.40E+38,-1.17E-38),0,(1.175E-38,3.402E+38) 0,(1.175 E-38,3.402E+38) 單精度浮點數值
double 8 (-1.797E+308,-2.225E-308),0,(2.225E-308,1.797E+308) 0,(2.225E-308,1.797E+308) 雙精度浮點數值
decimal(以decimal(MD)爲例) 若 M>D,爲M+2否則爲D+2 依賴於M和D的值 依賴M和D的值 小數值
  • 日期和時間類型
    表示時間值的日期和時間類型爲DATETIME、DATE、TIMESTAMP、TIME和YEAR。
    每個時間類型有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。

TIMESTAMP類型有專有的自動更新特性,將在後面描述。

類型 大小(字節) 範圍 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 時間值或持續時間
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 4 1970-01-01 00:00:00/2038 結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和時間值,時間戳

字符串類型

字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些類型如何工作以及如何在查詢中使用這些類型。

類型 大小 用途
CHAR 0-255字節 定長字符串
VARCHAR 0-65535 字節 變長字符串
TINYBLOB 0-255字節 不超過 255 個字符的二進制字符串
TINYTEXT 0-255字節 短文本字符串
BLOB 0-65 535字節 二進制形式的長文本數據
TEXT 0-65 535字節 長文本數據
MEDIUMBLOB 0-16 777 215字節 二進制形式的中等長度文本數據
MEDIUMTEXT 0-16 777 215字節 中等長度文本數據
LONGBLOB 0-4 294 967 295字節 二進制形式的極大文本數據
LONGTEXT 0-4 294 967 295字節 極大文本數據

CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉換。

BINARY 和 VARBINARY 類似於 CHAR 和 VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,並且排序和比較基於列值字節的數值值。

BLOB 是一個二進制大對象,可以容納可變數量的數據。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納存儲範圍不同。

有 4 種 TEXT 類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 類型,可存儲的最大長度不同,可根據實際情況選擇。
一般情況下圖片、視頻以及大體積文本會先上傳到服務器指定保存該類型的文件夾下面,保存時候按照時間和隨機數的關係給文件重命名(防止文件重名),同時將保存文件的服務器地址放入到數據庫中,之後便可以通過數據庫查詢到視頻地址,通過地址直接訪問;

  • 其他數據類型
    • timestamp:時間戳,默認可以設置 current_timestamp,可以用於記錄當前時間;
    • enum:枚舉,一般用於處理互斥的關係,例如:性別、籍貫等,即是單選。同時每一個選項表示的數值是從 1 開始的;
#首先創建一個帶有枚舉類型的數據表
create table test(
  testID int(4) not null,
  enumValue enum("南京","上海","杭州")
);
#上面南京對應的枚舉值爲1,杭州對應的枚舉值爲3

#採用使用枚舉裏面的具體數據進行插入數據
insert into test(testID,enumValue) values(1,"南京");
insert into test(testID,enumValue) values(2,"上海");

#採用使用枚舉數據的特徵進行插入數據,每一個枚舉類型都是獨立特有的,
#值是不同的,採用的是枚舉數值;
insert into test(testID,enumValue) values(3,1);
insert into test(testID,enumValue) values(4,3);

#插入的枚舉類型數值不能超過枚舉的範圍,下列語句錯誤;
insert into test(testID,enumValue) values(5,4);
  • set:集合,處理並列關係。例如:多選
create table testSet(
#將testID設置爲非空,且是自動增長的主鍵
  testID int(4) not null primary key auto_increment, 
  likes set("Reading","swimming","running")
);

insert into testSet(likes) values("Reading,swimming");
insert into testSet(likes) values(3); 
#set值以二進制表示:1 2 4 8 16  ;要的值加起來就行

(二)查詢語句 DQL

  • 查看所有數據:select * from 表名;

  • 只查某個表中某些字段數據:select 字段1,字段2 from 表名;

  • 查詢帶有條件的數據(以字段值>10 爲例):select 字段1,字段2 from 表名 where 字段3>10;

  • 查詢字段去重之後的數據:select distinct 字段 from 表名;

  • 獲取表中某些字段的值,並且改變展示的字段名稱,同時多條限制條件;select stuName as "姓名" ,stuAge as "年齡" from stuInfo where stuAge >= 20 and stuScore <90;或者的話可以使用 or;

  • 排序查詢(默認升序):select * from stuInfo order by stuScore asc;降序改爲 desc;

  • 多重條件查詢:優先主條件,主條件相同按照附條件;select stuName,stuAge from stuInfo order by stuAge asc, stuScore desc;

  • 模糊查詢:

    • 查詢 某個字段以某個字符結尾的數據:select * from 表名 where stuName like "%看"; 其中%爲通配符,表示 0 到 n 個字符;
    • 查詢某個字段以 看 字結尾,且前面只有一個字符的數據:select * from 表名 where stuName like "_看"; 其中_爲通配符,表示 有且僅有 1 個字符;
    • 查詢某個字段包含 看 字字符:select * from 表名 where stuName like "%看%";
  • 模擬分頁顯示數據:

    • 只獲取前 3 條數據:select * from 表名 limit 3;
    • 從某個數據開始,向後獲取幾個數據:select * from 表名 limit 0, 5;從 第 0 個數據開始,向後獲取 5 個數據;
  • 內置函數:不推薦使用,應該是從數據庫獲取數據,然後使用 Java 代碼處理數據;

    • 獲取最大值:select max(stuAge) as "最大年齡" from stuInfo; 最小值爲:min,平均值爲:avg
    • 獲取總數:select count(*) as "總數" from stuInfo where stuAge > 20;中間的 as 和 where 都是可用可以不用;

(三)刪除數據

  • 刪除數據表中的所有數據行:delete from 表名;
  • 刪除帶有條件的數據行:delete from 表名 where stuId = 3;where 後面的條件可以是:> < >= <= = != <> between and
  • 使用 truncate 會清空整個數據表,但是不會影響數據表結構,同時會影響原來的自增條件,會從 1 開始;truncate table 表名;

(四)修改更新數據

例如更新一些值爲空的字段數據:update 表名 set stuAge = 12,stuName = "趙六" where stuId = 2; 注意增加 where 語句,否則會將這個表數據進行更新;

(五)連表查詢

1. 一對一查詢

man 表中有 manID manName girlID; girl 表中有 girlID girlName;

  • 通過 man 和 girl 兩表中通過 grilID 進行匹配展示數據:
    select * from man ,girl where man.girlID = girl.girlID;
    另一種方式:內聯查詢:可以是實現多個表聯合查詢,其中 on 和 where 類似 【推薦使用】
    select * from man inner join girl on man.girlID = girl.girlID;

2. 一對多查詢

father 表中有:fatherID fatherName; son 表中有:sonID sonName fatherID;

  • 查詢某一個父親下的孩子:select * from father inner join son on son.fatherID = father.fatherID where fatherName = "XXX";
    將上面使用別名進行簡化書寫:select * from father f inner join son s on s.fatherID = f.fatherID where fatherName = "XXX";

3. 多對多查詢

多對多查詢需要使用中間表格
student 表格中有:stuID stuName ;
中間表格 stuToCouse 中有:stuToCouseID stuID couseID
couse 表格中有:couseID couseName

  • 查詢某一個學生選了哪些課程:select * from student s inner join stuToCouse sc on s.stuID = sc.stuID inner join couse c on sc.couseID = c.couseID where s.stuName = "XXX";
  • 查詢某一課程有哪些學生選擇:select * from couse c inner join stuToCouse sc on c.couseID = sc.couseID inner join student s on sc.stuID = s.stuID where c.couseName = "XXXX";

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LOkj6AOM-1569851987560)($resource/%E6%80%BB%E7%BB%93.png)]

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