JavaWeb前端開發知識總結(mysql)

JavaWeb前端開發知識總結(MySql)

1. MySql概述

數據庫就是一個文件系統,通過標準的SQL語句獲取數據;
MySql數據庫是一個關係型數據庫管理系統;
關係型數據庫保存的是實體之間的關係.
數據庫使用原則
​ 一般一個項目會創建一個數據庫,在數據庫中創建多張表,每張表對應一個實體類,表中存儲的記錄是實體的每一個實例對象.

2. SQL語言

SQL語言是一種結構化查詢語言,用於在數據庫中存取數據,查詢,更新和管理關係型數據庫管理系統,同時也是數據庫腳本語言的擴展名.

2.1 SQL語言分類

2.1.1 數據定義語言

數據定義語言(DDL):Data Definition Language,用於創建和刪除及修改數據庫和表,同時也可以定義索引(鍵),定義表之間的鏈接,確定表之間的約束.
定義數據的關鍵字:創建(create),刪除(drop),修改(alter),刪除表(truncate).

2.1.2 數據操作語言

數據操作語言(DML):Data Maniplation Language,用於對數據庫中的數據追加,刪除,更新,查詢.
數據操作的關鍵字:更新(update),刪除(delete),增加(insert into).

2.1.3 數據查詢語言

數據查詢語言(DQL):Data Query Language,用於從數據庫中查詢數據.
數據查詢關鍵字:查詢(select).

2.1.4 數據控制語言

數據控制語言(DCL):Data Control Language,用於對數據庫的權限等進行管理.
數據控制語言關鍵字:授權(grant),撤銷授權(revoke),拒絕授權(deny).

2.1.5 事務控制語言

事控制語言(TCL):Transcation Control Language,用於對數據庫設置保存點,回滾及事務提交.
事務控制語言關鍵字:設置保存點(savepoint),回滾(rollback),提交(commit).

2.2 數據庫的操作

2.2.1 創建數據庫

語法:注意語句後有分號結束

create database 數據庫名稱 [Character set 字符集  collate   字符集校對規則];

案例

-- 案例
create database test; -- 創建名稱爲test的數據庫,使用默認的字符集及字符集校對規則
-- 案例
create database test2 character set utf8; -- 創建名稱爲test2,字符集是utf8的數據庫
-- 案例
create database test3 character set utf8 collate utf8_bin; -- 創建使用指定字符集合字符集校對規則的數據庫test3

2.2.2 查看數據庫

語法:

-- 查看數據庫服務器中所有的數據庫
show databases;
-- 查看指定數據庫的創建信息
show database 具體的數據庫名稱;

2.2.3 修改數據庫

語法:

alter database 數據庫名稱 Character set 字符集 collate 字符集校對規則; -- 此命令不會修改數據庫名稱,只能修改數據庫的字符集和校對規則

2.2.4 刪除數據庫

語法:

drop database 數據庫名稱;

2.2.5 切換和查看當前使用的數據庫

語法:

-- 切換數據庫
use 數據庫名稱; -- 切換到指定的數據庫
-- 查看當前正在使用的數據庫
select database();

2.3 表的操作

2.3.1 創建表

語法:

create table 表名稱(字段名稱 字段類型(長度) 約束,字段名稱 字段類型(長度) 約束…);
字段類型中除字符串類型外都有默認長度,字符串類型需要在定義時設定長度,當字段類型是字符串或日期時,記錄中的數據需要使用'數據'形式.
show create table 表名; 查看創建表的SQL語句.

字段類型:(與Java中數據類型對比)

數據類型 java中數據類型 mysql中數據類型
整型 (byte/short/int/long) tinyint/smallint/int/bigint
單精度浮點數 float float
雙精度浮點數 double double
布爾類型 boolean bit
字符/字符串 char/String char,varchar
日期 date date/year/time/datetime/timestamp(時間戳)
文件 file blob(二進制文件)/text(文本)

char和varchar的區別:

char代表是固定長度的字符或字符串:
    -- 當存入的字符長度沒有達到設定的長度時,存入數據庫中時後面的會使用空格進行填充.
varchar代表的是可變長度(在設定的長度範圍內)的字符串:
    -- 當存入的數據長度沒有達到設定的長度時,存入數據庫中的數據就是實際的長度,不會使用空格填充.

日期類型間的區別:

date:顯示的格式爲YYYY-MM-DD
year:顯示格式爲YYYY
time:顯示格式爲HH:MM:SS
datetime:顯示格式爲YYYY-MM-DD  HH:MM:SS
    -- 當向數據庫中添加記錄時,如果沒有給此類型的字段設置值,存入數據庫中時使用null值填充
timestamp(時間戳):YYYY-MM-DD  HH:MM:SS
    -- 當向數據庫中添加記錄時,如果沒有給此字段的設置值,存入數據庫中使用的是系統當前的時間

2.3.2 約束關係

約束關係主要是完成對數據的校驗,保證數據庫數據的完整性.
約束關係的分類(常用的五類約束):

not null:非空約束,指定表中的某字段(列)的值不能爲空
unique:唯一約束,指定某字段(列)的值不能重複,允許null時,null可以有多個
primary key:主鍵約束,指定的字段值不能重複且唯一
foreign key:外鍵約束,指定該字段值屬於主表中的字段值,
    -- 外鍵可以是另一張表的主鍵,也可以是另一張表的非主鍵,爲非主鍵時必須爲該字段設置索引
check:檢查,指定表達式,用於校驗數據,mysql不支持該約束

not null約束:

非空約束只能作用在表的字段上,所有的字段類型的值都可以是null,null和空字符串和0是不等價的.
設置非空約束的語法:
-- 創建表時設置
字段名  字段類型  not null,
-- 修改表時設置
alter table 表名 modify 字段名 字段類型  not null;

unique約束:

唯一性約束作用在字段上,一張表中可以有多個唯一性約束,唯一性約束的字段的值不能重複,但可以有多個null值.
設置唯一性約束的語法:
-- 創建表時設置
字段名  字段類型  unique,
-- 修改表時設置
alter table 表名 modify 字段名  字段類型  unique;

primary key約束:

主鍵約束的字段值不能重複和爲null值,多字段組合的主鍵約束中的所有字段均不能null值,且組合字段的值不能重複,每個表可以有多個主鍵約束,這些字段整體作爲主鍵約束條件(單個重複可以,同時重複時不可以).
主鍵設置語法:
-- 創建表時設置
字段名 字段類型  primary key [auto_increment], -- auto_increment代表此字段的值能自增
-- 修改表時設置
alter table 表名 modify 字段名 字段類型  primary key,

foreign key約束:

外鍵約束是保證數據的參照完整性,作用在同一張表或兩個表中的兩個字段上,從表的外鍵值必須在主表中存在或爲null,主表中被外鍵依賴的值必須先在從表中刪除外鍵依賴的所有記錄後才能刪除,外鍵約束的列在主表中只能是逐漸或唯一性約束的列,當爲普通列時,從表中必須爲引用外鍵約束的列設置索引.
設置外鍵約束語法:
-- 創建表時設置
CONSTRAINT `從表外鍵名` FOREIGN KEY (`從表字段名`) REFERENCES `主表` (`主表字段名`);
-- 修改表時設置
ALTER TABLE `從表名` ADD CONSTRAINT `外鍵名` FOREIGN KEY (`外鍵約束的字段名`) REFERENCES `主表名` (`主表字段名`);
-- 刪除外鍵
alter table 表名 drop foreign key 外鍵名;

2.3.3 查看錶

查看當前使用的數據庫下的所有表:

語法:
show tables; -- 查看是當前正在使用的數據庫中的所有表(使用use 數據庫名  可以切換使用的數據庫)

查看當前使用的數據庫下的某一張表:

語法:
desc 表名; -- 查看的是表的字段的相關信息

2.3.4 刪除表

語法:

drop table 表名; -- 刪除指定表名的表

2.3.5 修改表

修改表名:

語法:
rename table 表名 to 新表名;

添加字段:

語法:
alter table 表名 add 添加的字段名  字段類型 約束條件;

修改字段名稱:

語法:
alter table 表名 change 舊字段名 新字段名  字段類型(長度)  約束; -- 必須加上字段類型

修改字段類型,長度和約束條件:

語法:
alter table 表名 modify 字段名 字段類型(長度)  約束條件;  -- 修改時必須加上字段類型

修改字段的字符集:

語法:
alter table 表名 character set 字符集名 [collate 字符集校對規則];

刪除字段:

語法:
alter table 表名 drop 字段名;

2.4 表中數據的操作

2.4.1 添加表的記錄

語法:

向表中插入某些列:insert into 表名 (列名1,列名2,列名3…) values (值1,值2,值3…);
向表中插入所有列:insert into 表名 values (值1,值2,值3…);

注意事項:

-- 值的類型與數據庫中表列的類型一致;
-- 值的順序與數據庫中表列的順序一致;
-- 值的最大長度不能超過列設置最大長度;
-- 值的類型是字符串或者是日期類型,使用單引號引起來.

2.4.2 修改表的記錄

語法:

update 表名 set 列名1=值1,列名2=值2... [where 條件];

注意事項:

-- 值的類型與列的類型一致;
-- 值的最大長度不能超過列設置的最大長度;
-- 字符串類型和日期類型添加單引號.

2.4.3 刪除表的記錄

語法:

delete from 表名 [where條件];

注意事項:

-- 刪除表的記錄,一般指刪除表中某一條記錄(一行數據);
-- 當沒有給出條件時,會將表中數據清空.

刪除表中所有記錄的方法:

方式1:使用沒有條件的delete語句
delete from 表名;
  -- 特點是:屬於DML語句,一條記錄一條記錄刪除,事務可以作用在DML語句上的,可以使用回滾恢復數據
  -- 在刪除前使用start transaction 開啓事務;
  -- 刪除語句;
  -- rollback語句恢復數據;
方式2:使用truncate語句
truncate from 表名;
  -- 特點是:屬於DDL語句,本質是先將表刪除,然後重新創建一個結構一樣的表,事務不能控制DDL的,不能恢復數據.

2.4.4 查詢表的記錄–單表查詢

2.4.4.1 基本查詢

語法:

簡單查詢:
select [distinct] * from 表名 [條件]; -- 查詢表中所有的記錄,distinct是去重關鍵字
select [distinct] 字段1,字段2... from 表名 [條件]; -- 查詢表中指定字段的記錄,distinct是去除這些字段值並列的重複值
去重查詢:查詢所有的字段必須放在distinct關鍵字後
select [distinct] 字段 from 表名 [條件]; -- 查詢只包含指定字段的記錄,distinct是去除此字段的重複值
別名查詢:
select [distinct] 字段 [[as] 字段別名] from 表名 [[as] 表別名] [條件]; -- 使用as關鍵給字段或表設置別名,as關鍵字可以省略
四則運算查詢:=-*/  -- 當遇到有字段null參與運算時,結果是null
select 字段[運算符] from 表名 [條件];
2.4.4.2 條件查詢

語法:

單條件查詢:where語句,符號可以是>,>=,<,<=,!=(<>),=,%
select 字段名 from 表名 where 字段值=指定值;
多條件查詢:between...and範圍語句
select 字段名 from 表名 between 條件1  and  條件2;  
    -- 查詢的是在條件1和條件2之前的值的記錄,條件可以是具體的取值
空值查詢:is null語句
select 字段名 from 表名 where 字段名 is null; -- 查詢某個字段名爲空的記錄
集合查詢:in語句
select 字段名 from 表名 where 字段名 in (具體值集合或者子查詢結果集合);
模糊查詢:like語句
select 字段名 from 表名 where 字段 like 字符串; -- 格式 '[%或_]待匹配字符串[%或_]'
    -- 下劃線_代表一個佔位符,%代表多個佔位符,沒有這兩個佔位符時,是絕對匹配
    -- 如:'_國' 以中結尾的含有兩個字符的字符串
    -- 如:'_國_' 國在中間的含有3個字符的字符串
    -- 如:'%國' 以國結尾的字符串
    -- 如:'%國%' 含有國的字符串
非值查詢:not關鍵字,可以和前面的查詢語句配合查詢
select 字段 from 表名 where 字段 not between 條件1 and 條件2; -- between...and查詢結果反面記錄
select 字段 from 表名 where 字段 not is null; -- 查詢不是null的記錄
select 字段 from 表名 where 字段 not in (具體值集合或者子查詢結果集合); -- 查詢不在指定值集合中的記錄
select 字段 from 表名 where 字段 not like 字符串; -- 查詢like結果的反面記錄
2.4.4.3 排序查詢

語法:

排序查詢:order by語句,asc是升序,desc是降序,默認是asc
select 字段 from 表名 order by 字段名1 asc/desc,字段名2 asc/desc....; -- 在前面的排序規則是主規則,後面的規則均是在前一個排序規則的基礎上的排序規則
2.4.4.4 統計查詢

語法:

使用聚合函數的查詢:count(計數),sum(求和),max(最大值),min(最小值),avg(平均值),聚合函數與分組查詢結合時,統計的結果都是每一組的結果,統計函數統計的是非null的值,null會跳過,count()和avg()方法統計的是非null值,null值直接跳過.
計數查詢:count()函數
select count(任意類型的值) from 表名 [條件]; -- count的參數可以是任意值,一般使用count(1)進行統計
    -- count(字段名):統計的是表中該字段不爲null的個數,當表中無記錄時,返回null;
    -- count(*):統計表中所有記錄,當該字段爲null時,會記錄null的個數,當表中無記錄時,返回null;
    -- count(1):統計表中的所有記錄,當該字段爲null時,會記錄null的個數,當表中無記錄時,返回0.
平均值查詢:avg(字段名),針對的是數值類型的字段,不能統計字符串和日期等非數值類型字段
select avg(字段名) from 表名 [條件];
求和查詢:sum(字段名),針對的是數值類型的字段,不能統計字符串和日期等非數值類型字段
select sum(字段名) from 表名 [條件];
最值查詢:最大值max(字段名),最小值min(字段名)
select min/max(字段名) from 表名 [條件];

使用聚合函數注意事項:

having語句:語句後的條件只能是聚合函數的返回值;
where語句:後面的條件不能跟着聚合函數,此時可以使用having語句代替where關鍵字;
字段中的null值的處理:ifnull(字段名,值),當指定字段名中出現null時,使用指定的值代替該null值,一般聚合函數中要使用該判斷,如果不進行判斷,null和任何值的四則運算後的結果均爲null
 -- 如:select sum(ifnull(字段名,0)) from 表名; 當字段名中出現null值,使用0代替
2.4.4.5 分組查詢

語法:

語法:一定保證語句的前後的要分組的字段名集合相同
select 聚合函數,字段名1,字段名2.. from 表名 group by 字段名1,字段名2... having 聚合函數; 
簡單分組查詢:
select 字段名 from 表名 order by 字段名;
統計分組查詢:
select 字段名1,count(1) from 表名 group by 字段名1; -- 查詢統計按照字段名1分組後每組的個數
條件分組查詢:
select 字段名1,count(1) as 別名1 from 表名 group by 字段名1 having 別名1 > 條件; -- 查詢統計按照字段名1分組後每組個數符合指定條件的所有記錄
2.4.4.6 單表查詢數據的順序
S(select)...F(from)...W(where)...G(group by)...H(having)...O(order by);

2.4.5 查詢表的記錄–多表查詢

2.4.5.1 多表(實體)間的關係

實體間的關係:

# 一對一的關係;
# 一對多的關係;
# 多對多的關係.

實體間的關係在數據庫中表現形式:

# 一對一關係:將一方的主鍵作爲另一方的外鍵,並添加unique關鍵字約束;
# 一對多關係:在多的一方創建一個字段,這個字段作爲外鍵執向一的一方的主鍵;
# 多對多關係:創建一箇中間表,中間表中至少需要兩個字段分別作爲外鍵指向多對多雙方各自的主鍵,一般中間表的兩個外鍵設爲中間表的主鍵(雙主鍵).
2.4.5.2 連接查詢

交叉連接查詢:

語法:
select 字段名 from 表名1,表名2; -- 獲得是兩個表的笛卡爾積的記錄,一般沒有意義

內連接查詢:

語法:inner join語句,inner可以省略,顯式內連接和隱式內連接可以相互轉換
顯式內連接查詢:
select 字段名 from 表名1 inner join 表名2 on 條件語句; -- 條件是兩個表中相同的屬性值判定條件,一般是外鍵約束
-- 如:select * FROM 客戶表 c inner join 訂單表 o on c.客戶id = o.客戶id; 客戶id是訂單表中的外鍵
隱式內連接查詢:
select 字段名 from 表名1,表名2 where 條件語句; -- 條件一般是外鍵約束

外連接查詢:

語法:outer join語句,左右外連接可以相互轉換,將表的先後順序調換即可
左外連接查詢:left outer join語句,outer一般可以省略,查詢的是左邊表的全部數據和兩個表的交集數據,左邊有的記錄而右邊沒有的記錄,右邊顯示爲nullselect 字段名 from 表名1 left join 表名2 on 條件語句;
右外連接查詢:right outer join語句,outer一般可以省略,查詢的是右邊表的全部數據和兩個表的交集數據,右邊有的記錄而左邊沒有的記錄,左邊顯示爲nullselect 字段名 from 表名1 left join 表名2 on 條件語句;

全鏈接查詢:

語法:獲取兩個表中的所有的數據,兩邊沒有相對應的數據時,各自顯示爲null
-- 方式1:
左連接查詢語句 union 右連接插敘語句;
-- 方式2:
右連接查詢語句 union 左連接插敘語句;
2.4.5.3 嵌套查詢(子查詢)

嵌套查詢分類:

# 描述:子查詢也叫嵌套SELECT語句,查詢語句作爲其他查詢的輸入,輸出,條件,作爲臨時表;多表間一般存在外鍵約束.
# 作爲輸入值:select子句作爲另一個select語句中from的輸入值;
# 作爲輸出值(結果字段):select子句的查詢結果,作爲另一個select語句的輸出的字段名;
# 作爲條件:select子句作爲另一個select語句的Where子句中;

from嵌套查詢(作爲輸入值):

語法:一個select查詢語句的結果作爲另一個select語句from中的臨時表使用
select a.*,b.* from1 a,(select 字段名1,字段名2.. from2) b where a.字段 = b.字段;

作爲字段名(作爲輸出值):

語法:select子句的查詢結果,作爲另一個select語句的輸出的字段名,子查詢的結果必須是單個字段值
select a.*,(select 字段名 from2 b where b.字段名 = a.字段名) [as 別名] from1 a;

作爲條件:

語法:select子句作爲條件放在where之中,select子句可以返回單個數據,多行數據,多列數據
單個返回值:
如: select * from1 a, where a.字段 = (select 字段名 from2);
多行返回值:
如: select * from1 a, where a.字段 in (select 字段名 from2); -- 表2查詢返回多個值
多列返回值:
如: select * from1 a, where (a.字段1,a.字段2) = (select (a.字段1,a.字段2) from2); -- 表2查詢返回多列數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章