文章目錄
- 基本概念
- Mysql資料庫軟體
- SQL
- 什么是SQL?
- SQL通用語法
- DDL 操作資料庫,表
- DML 增刪改表中資料
- DQL 查表
- 語法:
- 基礎查詢
- 條件查詢
- 排序查詢
- 聚合函式(列的縱向計算)
- 分組查詢
- 分頁查詢
- 約束
- 多表查詢
- 資料庫的設計
- 多表之間的關系
- 事務
- 資料庫三范式
- DCL 用戶訪問授權
- 用途:管理用戶,授權
基本概念
1.Datea Base 簡稱DB
2.是用于存盤和管理的倉庫
3.特點
1.是持久化存盤資料的,其實資料庫就是一個檔案系統
2.方便存盤和管理資料
3.使用同一方法操作資料庫sql
4.常用資料庫
Oracle,Mysql
Mysql資料庫軟體
1.安裝
安裝教程:https://blog.csdn.net/y5946/article/details/78434525
2.卸載
1.mysql的安裝目錄下找my.ini檔案
*復制:datadir="C:ProgramData.Mysql/Mysql ....."
2.卸載mysql
3.洗掉datadir="C:ProgramData/Mysql"檔案
3.配置
*Mysql服務啟動
1.手動
1.cmd--> services.msc 打開服務器視窗
2.使用管理員身份打開cmd
*net start mysql :啟動mysql服務
*net stop mysql :關閉mysql服務
4.登錄
1.
cmd-->mysql -uroot -p333
cmd-->mysql -root -p
***
2.cmd-->mysql -hip -uroot -p密碼
5.退出
1.exit
2.quit
6.MySQL目錄結構
1.安裝目錄
2.資料目錄
SQL
什么是SQL?
Structyred Query Language :結構化查詢語言
SQL通用語法
1.SQL 陳述句可以單行多行書寫,以分號結尾
2.可以使用空格和縮進陳述句可讀性
3.注釋
單行注釋: --空格注釋內容
多行注釋:/*注釋內容*/
DDL 操作資料庫,表
1.操作資料庫
1.C增
create database 資料庫名稱;
create database if not exists 資料庫名稱;
create database if not exists 資料庫名稱 character set gbk;
2.R查
*show databases;查詢所有資料庫名稱
*show create database 資料庫名稱;-- 查看某個資料庫的創建陳述句
3.U改
*修改資料庫的字符集
*alter database db3 character set utf8;
4.D刪
drop database 資料庫名稱;
drop database if exists 資料庫名稱;
5.用
use 資料庫名稱;
select database(); -- 查看當前使用資料庫名稱
2.操作表
1.C增
1. create table 表名(
列名1 資料型別1,
列名2 資料型別2,
列名3 資料型別3,
列名4 資料型別4
);-- 最后一列不要加逗號
*資料型別
1.int :整型
* age int,
2.double :浮點型
*score double(5,2),
3.date : 日期,只包含年月日,yyyy-MM-dd
4.datatime:日期,還包含時秒分,yyyy-MM-dd HH:mm:ss
5.timestamp:日期,還包含時秒分,yyyy-MM-dd HH:mm:ss
默認使用當前系統時間賦值
6.varchar:字串
*name varchar(20):姓名最大20個字符
*zhangsan 8個字符 張三 2個字符
2.create table if not exists stu like student; -- 復制
2.R查
1.show tables;-- 查詢所有表
2.decs 表名;-- 查詢表結構
3.U改
1.修改表名
alter table 表名 rename to 新表名;
2.修改表的字符集
alter table 表名 character set utf8;
3.添加一列
alter table 表名 add 列名 資料型別;
4.修改一列
alter table 表名 change 列名 新列名 新資料型別;
alter table 表名 modify 列名 新資料型別;
3.洗掉一列
alter table 表名 drop 列名;
4.D刪
1.drop table 表名;
2.drop table if exists 表名;
DML 增刪改表中資料
1.添加資料
1.insert into 表名(列1,列2,列3....,列n)values(值1,值2,值3 ....,值n);
2.insert into 表名 values(所有值);//不需要寫列名,必須把所有列的資訊都寫上去
3.除了數字型別和NULL其他值都要加引號(單雙都行)
2.修改資料
update 表名 set 列名1=值1,列名2=值2,列名3=值3....[where 條件];
-- 如果不加where會將表中資料全部修改!!!
3.洗掉資料
1.delete from 表名 where 條件;
***注意
一定要寫where!!!!!
2.如果要洗掉所有記錄
truncate table 表名;-- 先洗掉表,然后再創建一張一樣的表
DQL 查表
語法:
select
欄位串列
from
表名
where
條件串列
group by
分組欄位
having
分組之后的條件
order by
排序
limit
分頁限定
基礎查詢
1.多個欄位的查詢
select 欄位名1,欄位名2.... from 表名;
*注意
*欄位名可以省略,表示查詢所有欄位
2.去除重復
在select后加distinct
3.計算列
*一般可以進行欄位之間的四則運算(一般只會進行數值的運算)
*ifnull(運算式1,運算式2):null參與的運算,計算結果的都為null
*運算式一:那個欄位需要判斷是否為null
*如果該欄位為null后的替換值
4.起別名
在欄位后加 as 別名
*as可以省略
條件查詢
1. where字句后邊跟條件
2. 運算子
* >,<,=,>=,<=,<>(不等于)
* between...and
* in(集合)-- 在集合之中
where age in(1,2,3,4,5);
* like模糊查詢
占位符:
%代表多個任意字符
_代表任意一個字符
select * from student where name like '%德%';
* and 或&&
* or 或 ||
* not 或 !
排序查詢
order by 排序欄位 排序方式(默認為asc升序),排序方式(默認為asc升序);
*asc 升序,desc降序
*如果有多個排序條件,只有當前面排序條件數值一樣時,才會判斷后邊的條件
聚合函式(列的縱向計算)
1.count:計算個數
2.min:最小值
3.max:最大值
4.sum:總和
5.avg:平均值
*聚合函式會排除null
解決方案:寫主鍵,用ifnull
分組查詢
group by 分組欄位名
*注意分組后查詢的欄位只能寫:分組的欄位,聚合函式,要不沒有意義
分頁查詢
limit 開始的頁數,每頁查詢的頁數; (mysql方言)
公式:開始的索引=(開始的頁碼-1)*每一頁顯示的條數;
limit是mysql的方言
約束
1.主鍵約束primary key
*特點:唯一,非空,一個表只能有一個
1.創建表時加主鍵
在要加主鍵的欄位后加 primary key 即可
2.創建表之后洗掉主鍵
alter table 表名 drop primary key;
3.創建表后加主鍵
alter table 表名 modify 欄位名 資料型別 primary key;
2.主鍵自增長
在添加主鍵時在后面加 auto_increment就行了
洗掉自增長:alter table 表名 int 資料型別;
2.非空約束not null
1.創建表時加非空約束
在要加約束的欄位后加 not null 即可
2.創建表之后洗掉約束
alter table 表名 欄位名 資料型別;
3.創建表后加約束
alter table 表名 modify 欄位名 資料型別 not null;
3.唯一約束unique(mysql中兩個null不屬于一樣的)
1.創建表時加約束
在要加逐漸的欄位后加 unique 即可
2.創建表之后洗掉約束
alter table 表名 drop index 欄位名;
3.創建表后加約束
alter table 表名 modify 欄位名 資料型別 unique;
4.外鍵約束foreign key
特點:
*用于連接別的表,解決表內資料冗余的問題
*這個表中對應資料不洗掉,連接的表對應數
據不能洗掉,
1.創建表的時候加外鍵約束
constraint 外鍵名 foreign key(外鍵欄位)references 要鏈接的表的名稱(欄位名)
2.創建表后洗掉外鍵
alter table 表名 drop foreign key 外鍵名;
3.創建表后添加外鍵
alter table 表名 add constraint 外鍵名 foreign key(外鍵欄位)references 要
鏈接的表名(欄位名);
4.級聯操作
1.添加級聯操作
alter table 表名 add constraint 外鍵名稱 foreign key (欄位名稱)
references 主表名稱(主表欄位名稱) on update cascade on delete cascade
2.分類:
1.級聯更新:on update cascade
2.級聯洗掉:on delete cascade
多表查詢
*查詢語法
select 列名串列 from 表名 wherer 條件 group by 分組欄位名 having 條件 order by 欄位名
順序 limit 數,數 ;
*笛卡爾積:
*有兩個集合A,B 取這兩個集合主所有組成情況,
*要完成多表查詢,需要消除無用的資料
*多表查詢的分類
1.內連接查詢
1.隱式內連接:使用where條件消除無用資料
2.顯示內連接:
select 欄位串列 from 表名1 [inner] join 表名2 on 條件 ;
2.外連接查詢
1.左外連接查詢
select 欄位串列 from 表名1 [outer] left join 表名2 on 條件 ; -- 保留左表所有條件
2.右外連接查詢
select 欄位串列 from 表名1 [inner] right join 表名2 on 條件 ;--保留右表檔案
1.子查詢
* 概念:查詢中嵌套查詢,稱嵌套查詢為子查詢,
*子查詢不同情況
1.子查詢結果是單行單列的:
*子查詢結果可以看作一個值,進行比較
-- 查詢員工工資小于平均工資的人
SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
2.子查詢是多行單列的:
*子查詢可看作一列數寫道in()里面
-- 查詢'財務部'和'市場部'所有的員工資訊
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME =
'財務部' OR NAME = '市場部');
3.子查詢的多行多列的
*子查詢可看成一個新的表虛擬表用于查詢
-- 查詢員工入職日期是2011-11-11日之后的員工資訊和部門資訊
SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` >
'2011-11-11') t2 WHERE t1.id = t2.dept_id;
資料庫的設計
多表之間的關系
1.一對一(了解,開發很少存在):
*如:人和身份證
*分析:一個人只有一個身份證,一個身份證只能對應一個人
2.一對多(多對一):
*如:員工和部門
*分析:一個員工只對應一個部門,一個部門對應許多員工
3.多對多:
*如:學生和課程
*分析:一個學生可以對應多門課程,一門課程對應多個學生
事務
1.事務的基本介紹
1.概念:
* 如果一個包含多個步驟的操作,被事務管理,那么這些操作要么同時成功,要么同時失敗
2.操作
1.開啟事務:setart transaction;
2.回滾事務:rollback;
3.提交: commit;
3.MySQL資料庫中事務默認自動提交
*事務提交的兩種方式
*自動提交
*mysql就是自動提交的
*一條dml(增刪改)陳述句提交一次
*手動提交
*oracle的資料庫是手動提交的
*需要先開啟事務再提交
*修改事務默認提交方式
*查看事務的默認提交方式:select @@autocommit; -- 1代表自動提交,-- 0代表手動提交
*更改事務的默認提交方式:set @@autocommit =1/0;
2.事務的四大特征(面試經常有)
1.原子性:是不可分割的最小操作單位,要么同時成功,要么同時失敗
2.持久性:當事務提交或回滾后,資料庫會持久化的保存資料
3.隔離性:多個事物之間,相互獨立,
4.一致性:實務操作前后,資料總量不變
3.事務的隔離級別(了解)
*概念
多個事物之間是隔離的,相互獨立的,但如果多個事務操作同一批資料,則會引發一些問題,設定不
同的隔離級別就能解決這些問題,
*存在問題:
1.臟讀:一個事務讀到另一個事務中沒有提交的資料
2.不可重復讀:在同一事務中,兩次讀到的資料不一樣
3.幻讀:一個事務操作dml資料表中所有記錄,另一個事務添加了一條資料,則第一個事務查詢不到
自己的修改
*隔離級別
1.read uncommitted:讀未提交
出現問題:臟讀、不可重復讀、幻讀
2.read committed:讀已提交(oracle)
出現問題:不可重復讀、幻讀
3.repeatable read:可重復的(mysql)
出現問題:幻讀
4.serializable:串行化
沒有問題
*級別越高,越安全,效率越低
*查詢/設定隔離級別
select @@tx_isolation;-- 查詢
set global transaction isolation level 級別字串; -- 更改
資料庫三范式
*概念:要遵循后邊的范式,必須先遵頊前邊的所有范式,
設計關系資料庫時,遵從不同的規范要求,設計出合理的關系型資料庫,這些不同的規范要求
被稱為不同的范式,各種范式呈遞次規范,越高的范式資料庫冗余越小,目前關系資料庫有六
種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)
、第四范式(4NF)和第五范式(5NF,又稱完美范式),
摘自百度百科:https://baike.baidu.com/item/資料庫范式/7309898
*三范式
1.第一范式:
每一列都是不可被分割的原子資料項
2.第二范式:
在第一范式的基礎上,非碼屬性必須完全依賴于碼(在范式一的基礎上消除非主屬性對
主碼的部分函式依賴)
3.第三范式:
在第二范式的基礎上,任何非主屬性嗎不依賴于其他非主屬性(在范式二的基礎上消除
傳遞依賴)
*注意:只要滿足前三范式,資料庫結構基本就是很好的,
*幾個概念
1.函式依賴:A->B,如果通過A屬性:屬性組:的值,可以確定唯一B屬性的值,則稱B依賴于A
2.完全依賴:A->B,如果A屬性組,B屬性要得以確定需要A族中所有屬性值
3.部分函式依賴:A->,如果A是一個屬性組,B屬性值的以確定只需要依賴于A中某些值
4.傳遞函式依賴:A-->B,B->C,B依賴于A,C依賴于B,則稱C傳遞函式依賴于A
5.碼:如果在一張表中,一個屬性或屬性組,被所有其他屬性所完全依賴,則稱這個屬
性或屬性組為這張表的碼
DCL 用戶訪問授權
用途:管理用戶,授權
1.管理用戶
1.添加用戶:
create user '用戶名' @ '主機名' identified by '密碼';
create user '用戶名' @ '%' identified by '密碼';
2.洗掉用戶:
drop user '用戶名' @'主機名';
3.修改用戶密碼:
1.update user set password=password(密碼) where user='用戶名';
2.set password for 'root'@'localhost'=password('123');
*當忘記mysql中的密碼時:
1.cmd --> net stop mysql 停止mysql服務
*需要管理員運行cmd
2.使用五驗證方式啟動mysql服務:mysqld --skip-grant-tables
3.打開新的cmd視窗,直接輸入mysql命令,回車,就可以登陸
4.use mysql;
5.update user set password =password('新密碼') where user ='root';
6.關閉兩個視窗
7.打開任務管理器,手動節輸mysqld.exe 的行程
8.啟動mysql服務
9.使用新的密碼登錄
4.查詢用戶:
-- 1.切換到mysql資料庫
use mysql;
-- 2.查詢user表
select * from user;
%通配符:表示任意字符
5.權限管理
1.查詢權限
show grants for '用戶名'@'主機名';
2.授予權限
1.grant 權限串列 on 資料庫名.表名 to '用戶名' @ '主機名’;
2.grant all on *.* to '用戶名'@'主機名'; -- 給這個用戶所有權限
3.識訓權限
1.revoke 權限串列 on 資料庫名.表名from '用戶名'@'主機名';
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/205690.html
標籤:java
