- 安裝-見百度
- 卸載
- 去mysql的安裝目錄找到my.ini文件 復制 datadir=“C:/pro。。。。。”
- 卸載mysql
- 刪除datadir目錄下的mysql文件夾
- 配置
- mysql服務啟動
- 手動。cmd-》 services.msc打開服務的窗口
- net stop mysql
- mysql登錄
- mysql -uroot -p
- mysql -uroot -p密碼
- mysql -h127.0.0.1 -uroot -p
- mysql退出quit,exit
- mysql目錄結構
1.mysql安裝目錄
配置文件my.ini
2.mysql數據目錄
幾個概念:1,數據庫:文件夾2,表:文件,3.數據:文件里存儲的數據
- 操作SQL
- 什么是SQL?
Structured Query Language :結構化查詢語言
其實就是定義了操作所有關系型數據庫的規則(每一種數據庫的操作方式存在不一樣的地方,稱為‘方言’) - SQL通用語法
SQL語句可以單行或多行書寫,以分號結尾。
可以使用空格和縮進進來增強語句的可讀性
mysql數據庫的SQL語句不區分大小寫,關鍵字建議使用大寫 - 2種注釋
1.單行注釋:-- 注釋內容 或 # 注釋內容(mysql特有)
2.多行注釋: /* 注釋 */ - SQL分類
- 數據定義語言DDL(Data Definition Language)
CREATE,DROP,ALTER
主要為創建、修改、刪除數據庫的邏輯結構,其中包括表結構,視圖和索引等。
創建、刪除數據庫:CREATE DATABASE; DROP DATABASE
創建、修改、重命名、刪除表:CREATE TABLE; ALTER TABLE; RENAME TABLE; DROP TABLE;
創建和刪除索引:CREATE INDEX; DROP INDEX - 數據查詢語言DQL(Data Query Language)
SELECT
用于數據庫中數據的檢索查詢。各種簡單查詢,連接查詢等都屬于DQL。 - 數據操縱語言DML(Data Manipulation Language)
INSERT,UPDATE,DELETE
主要用于數據庫中數據的修改,包括添加、刪除、修改等
插入數據到一個表中:INSERT語句
更新表中已有的數據:UPDATE語句
刪除表中的數據:DELETE語句 - 數據控制語言DCL(Data Control Language)
GRANT,REVOKE,COMMIT,ROLLBACK
主要為數據庫訪問權限控制,給用戶授予訪問權限:GRANT語句,取消授權:REVOKE - 事務控制語言TCL(Transaction Control Language)
BEGIN,SAVEPOINT xxx,ROLLBACK,ROLLBACK TO xxx,COMMIT
用于提交事務和回滾事務,維護數據的一致性
- 數據定義語言DDL(Data Definition Language)
DDL:操作數據庫,表
- 操作數據庫:CRUD
1.C(Create):創建 create database db1;
先判斷是否存在如果存在則不進行創建,如果不存在則進行創建:create database if not exists db2;
修改字符集character set gbk:create database if not exists db3 character set gbk;
2.R(Retrieve)查詢
查詢所有數據庫的名稱:show databases;
查詢創建mysql的語法:show create database 數據庫名稱;
3.U(Update)修改
修改數據庫的字符集:alter database 數據庫名稱 character set 字符集名稱;alter database db3 character set utf8;
4.D(Delete)刪除
drop database 數據庫名稱;
判斷數據庫存在如果存在則進行刪除
drop database if exists 數據庫名稱
5.使用數據庫
查詢正在使用的數據庫名稱: select database();
使用數據庫use 數據庫名稱; - 操作表
1.C(Create)創建
create table 表明(列名1 數據類型1,列名2 數據類型2)注意最后一列不需要加,號
數據類型: 整形int 小數類型double(5,2)五位,保留小數點2位,date日期:年月日,datetime日期:年月日時分秒,timestamp時間戳類型,如果不賦值則默認使用當前系統時間;字符串類型varchar(20)字符最大長度20字符;張三是兩個字符,zhangsan是8個字符
create table student(id int,name varchar(32),age int,score double(4,1),birthday date,insert_time timestamp);
復制表:再創建已經存在的表: create table stu like student;
2.R(Retrieve)查詢
查詢某個數據庫中所有表名稱:show tables;
查詢表結構:desc 表名;
3.U(Updata)修改
修改表名:alter table 表名 rename to 新表明
修改表的字符集,查看字符集:show create table sut;,修改字符集alter table sut character set gbk;
添加一列
alter table 表名 add 列名 數據類型;alter table sut add gender varchar(10);
刪除一列
alter table sut drop sex;
修改名稱 類型
alter table sut change gender sex int;
只修改類型
alter table sut modify sex varchar(10);
注意:
--SQLserver中需要使用該語句進行修改
alter table stu alter column name varchar(40)
4.D(Delete)刪除
drop table 表名;
drop table if exists 表名
客戶端圖形化工具:sqlyog
DML 增刪改表中數據
- 添加數據
語法:insert into 表名(列名1,列名2)values(值1,值2);
注意:列名和值要一一對應。如果表名后,不定義列名,則默認給所有列添加值
insert into 表名 values(值1,值2.。。。。)
除了數字類型其他類型需要使用引號引起來單引號雙引號都可以英文的哦; - 刪除數據
delete from 表名 [where 條件]
delete from sut where id=1;
注意:1.如果不加條件則刪除表中所有記錄。
delete from 表名 --不推薦使用,有多少條就會執行多少次刪除操作;
truncate table 表名;--推薦使用,效率高先刪除表,然后再創建一個一摸一樣的空表 - 修改數據
update 表名 set 列名1=值1,列名2 值2,....[where 條件];
注意如果不加任何條件則會修改所有值
update 表名 set 列名1=值1
DQL 查詢表中的記錄
select * from 表名;
語法:select
字段列表 form
表名列表
where
條件列表
group by
分組字段
having
分組之后的條件
order by
排序
limits
分頁限定
2.基礎查詢
1.多個字段的查詢
select 字段名1,字段名2,。。。from 表名;
注意如果查詢所有字段則可以使用*進行代替
2.去除重復
distinct
3.計算列
一般可以使用四則運算計算一些列的值。(一般只會進行數值型的計算)
計算注意:
1.如果有null參與的運算,計算結果都為null,那么如何避免?
ifnull(表達式1,表達式2)null參與計算的結果都為null
表格式1,那個字段需要判斷是否為null
表達式2,如果該字段為null后則替換值。
1.查詢年齡等于20歲
select * from student where age =20;
查詢年兩不等于20歲
select * from student where age != 20;
select * from student where age <>20;
查詢年兩大于等于20,小于等于30
select * from student where age >= 20 && age <=30;
select * from student where age >= 20 and age <=30;
select * from student where age between 20 and 30;
查詢等于22歲,18,25歲的信息;
select * from student where age = 22 or age =18 or age =25;
select * from student where age in(22,18,25);
查詢英語成績為null
select from student where english=null;--不對的,null不能使用=(!=)判斷
select * from student where english is null;
查詢英語成績不為null
select * from student where english is not null;--是否可以使用 is not 22?
查詢姓名第二個字時化的人
select * from student where name like "化%";
查詢名字是3個字的人
select * from student where name like "__";
查詢名字中包含化的人
select * from student where name like "%化%";
排序
select * from student order by math asc;(asc正序,desc倒敘)
select * from student order by math desc;
按照數學成績排名,如果數學成績一樣,則按照英語成績排名
select * from student order by math asc,english asc;
注意:如果有多個排序條件,則當前邊的條件值一樣時,才會判斷第二條件;
4.起別名
as as也可以是省略
select 書名 from books;
--去除重復的結果集
select distinct 書名 from books;
3.條件查詢
1.where子句后面跟條件
2.運算符
聚合函數:將一列數據作為一個整體,進行縱向計算
1.count計算個數,一般選擇非空的列:主鍵count()
2.max計算最大值,min計算最小值
3.sum計算和
4.avg計算平均值
注意:聚合幻術的計算,排除null值.
解決方案:1.選擇不包含非空的列進行計算,2.ifnull函數
3.分組查詢
1.語法:group by 分組字段;
2.注意:1.分組之后查詢的字段:分組字段,聚合函數,2.where和having的區別?1.where在分組之前進行限定,如果條件不滿足,則不參與分組.having在分組之后進行限定,如果不滿足結果,則不會被查詢出來;
2.where后不可以跟聚合函數,having可以使用聚合函數的判斷;?
按照性別分組,分別查詢男,女同學的平均分
select sex,avg(math) from student group by sex;
按照性別分組,查詢男,女的平均數,人數
select sex avg(math) ,count(id) from student group by sex;
按照性別分組,分別查詢男,女同學的平局分,人數,要求低于70分的人,不參與分組
select sex, avg(math),count(id) from student where math>70 group by sex;
按照性別分組,分別查詢男,女同學的平局分,人數,要求低于70分的人,不參與分組,分組之后人數要大于2個人
select sex, avg(math),count(id) from student where math>70 group by sex having count(id)>2;
4.分頁查詢
語法:limit 開始的索引,每頁查詢的條數;
2.公式:開始索引=(當前的頁碼-1)*
--每頁顯示3條記錄
--分頁
select * from books limit 0,3;--limit是mysql的方言
約束
- 概念:對表中的數據進行限定,保證數據的正確性,有效性和完整性。
- 分類:
- 主鍵約束:primary kay(可以配合auto_increment進行自增長)
- 非空約束:not null
- 唯一約束:unique
4.外鍵約束:foreign key
- 非空約束:not null 某一列的值不能為null
- 創建表時添加約束
create table stu(id int, name varchar(40) not null);
insert into stu values(1,null);--報錯
drop table stu; - 創建表完成后,添加非空約束
create table stu(id int, name varchar(40));
insert into stu values(1,null);--成功
--alter table stu modify name varchar(40),not null;--modify為MySQL的方言
--alter table stu change name varchar(40),not null;--modify為MySQL的方言
alter table stu alter column name varchar(40) not null;--插入時的表里數據如果有已存在的null值則不能加該約束語句 - 刪除name的非空約束
alter table stu alter column name varchar(40);
update stu set name =0 where name is null;
insert into stu(id,name)values(1,null);
- 創建表時添加約束
- 唯一約束:unique,某一列的值不能重復
注意唯一約束可以有null值,但只能有一條記錄為null- 在創建表時,條件唯一約束
create table stu(id int,phone_number varchar(11) unique); - 刪除唯一約束
--alter table stu change phone_number phone_number varchar(40);--modify為MySQL的方言(刪除唯一約束不可可以使用該方式哦)
mysql刪除方式
alter table stu drop index name;
alter table stu drop constraint UQ__stu__A1936A6B95E015AE;--SQLserver需要這樣刪除哦要得到該表的唯一約束id - 在表創建完成后,添加唯一約束
alter table stu change name name varchar(20) unique;
alter table stu modify name varchar(40) unique;
- 在創建表時,條件唯一約束
- 主鍵約束:primary key
- 注意:含義非空并且唯一,一張表只能有一個字段為主鍵,主鍵就是標軸記錄的唯一標識
- 在創建表時,添加約束
create table stu(id int primary key ,name varchar(20)); - 刪除主鍵
錯誤的方式 alter table stu modify id int;或者change id id int 都不行
需要使用:alter table stu drop primary key; - 創建完成后添加主鍵
alter table stu modify id int primary key;
- 自動增長
- 概念:如果弄一列數值類型的,使用auto_increment可以完成值的自動增長
規則增長的值會根據上一行的數據進行增加; - 在創建表時,添加主鍵約束并且完成主鍵自增長
create table stu(id int primary key auto_increment,name varchar(20)); - 刪除自增長
alter table stu modify id int ; - 創建完成后添加自增長
alter table stu modify id int auto_increment;
- 概念:如果弄一列數值類型的,使用auto_increment可以完成值的自動增長
- 外鍵約束:foreign key
概念:讓表與表產生關系,從而保證數據的正確性- 創建表時,可以添加外鍵
create table a(id int primary key auto_increment,name varchar(20));
- 創建表時,可以添加外鍵
create table b(id int primary key auto_increment,name varchar(20) ,pa_id int,constraint ap foreign key (pa_id) references a(id));
- 刪除外鍵
alter table b drop foreign key ap; - 創建之后添加外鍵
alter table b add constraint ap foreign key (pa_id) references a(id); - 級聯操作
- 添加級聯操作
語法:alter table b add constraint av foreign key (pa_id) references a(id) on update cascade on delete cascade; - 分類:
級聯更新:on update cascade
級聯刪除:on delete cascade
- 添加級聯操作
數據庫的設計
多表之間的關系
- 分類:
- 一對一:
如身份證號和人,一個人只能有一個身份證號 - 一對多:
如:部門和員工,一個部門有多個員工 - 多對多:
如:學生與課程表,一個學生可以選擇很多課程,一個課程可以有很多學生
- 一對一:
- 實現關系:
- 一對多:在多的一方建立外鍵,指向一的一方的主鍵。
- 多對多:多對多實現需要借助第三張中間表。中間表至少包含兩個字段,這兩個字段作為第三張表的外聯,分別指向兩張表的主鍵;
注意多對多連接后還可以添加聯合主鍵進行約束數據組合不重復:如一個文件不能收藏兩邊:
A表用戶,B表書本
A收藏B,需要C第三張表
第三個表創建語句
create table c(aid int ,date datetime,bid int,
--創建符合主鍵
primary key(aid,bid),
foreign key(aid) references a(id),
foreign key(bid) references b(id)
); - 一對一:可以在任意一方添加唯一外鍵指向另一方的主鍵。一般存在在一張表中
- 數據庫設計的范式
在設計數據庫時,需要遵循的一些規范。
- 數據庫設計規范
設計關系數據庫時,遵從不同的規范要求,設計出合理的關系型數據庫,這些不同的規范要求被稱為不同的范式,各種范式呈遞次規范,越高的范式數據庫冗余越小。
關系數據庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又稱完美范式)。 - 分類:
- 第一范式(1NF):每一列都是不可分割的原子數據項
- 第二范式(2NF):在1NF的基礎上,非碼屬性必須完全依賴于候選碼(在1NF基礎上消除非主屬性對主碼的部分函數依賴)
- 幾個概念:
- 函數依賴:A-->B,如果通過A屬性(屬性組),可以確認唯一B屬性的值。稱為B依賴于A
例如:學號-->姓名。(學號,課程名稱)-->分數 - 部分函數依賴:A-->B,如果A時一個屬性組,則B屬性值得確定需要依賴于A屬性組中某一些值即可。
例如:(學號,課程名稱)--> 姓名 - 完全函數依賴:A-->B,如果A時一個屬性組,則B屬性值得確定需要依賴于A屬性組所有的屬性值。
例如:(學號,課程名稱)-->分數 - 傳遞函數依賴:A-->B,B-->C,如果通過A屬性(屬性值)的值,可以確認唯一B屬性的值,再通過B屬性(屬性組)的值可以確定唯一C屬性的值,則稱C傳遞函數依賴于A
例如:學號-->系名,系名-->系主任; - 碼:如果在一張表中,一個屬性或屬性組,被其他屬性完全依賴,則稱這個屬性(屬性組)為該表的碼
例如:該表碼為(學號,課程名稱)
- 主屬性:碼屬性組中的所有屬性
- 非主屬性:除過碼屬性組的屬性
- 函數依賴:A-->B,如果通過A屬性(屬性組),可以確認唯一B屬性的值。稱為B依賴于A
- 第三范式(3NF):在2NF基礎上,任何非主屬性不依賴于其它非主屬性(在2NF基礎上消除傳遞依賴)
- 舉個例子
-
第一范式
image.png -
第二范式
image.png -
第三范式
image.png
數據庫的備份和還原
保存的就是該數據表中的所有數據及表結構的sql命令
- 命令行:
- 備份:mysqldump -u 用戶名 -p 密碼 要保存的數據庫> 保存的路徑
- 還原:
- 登錄數據庫
- 創建數據庫
- 使用數據庫
- 執行文件SOURCE 文件路徑
- 圖形化工具:
- 多表查詢
隱士連接:
select
t1.name --員工的姓名
t1.gender --員工的性別
t2.name --部門表的名稱
from
per t1,
dept t2
where
t1.'dept_id'=t2.'id';-
顯示內連接:
語法:select 字段列表 from 表1 inner join 表2 on 條件- 從那些表中查詢數據
- 條件是什么
- 查詢那些字段
-
外連接查詢:
- 左連接:語法:select 字段列表 from 表1 left [outer] join 表2 on 條件
查詢的是左表所有數據以及其交集部分。 - 右鏈接:語法:select 字段列表 from 表1 right [outer] join 表2 on 條件
查詢的是右表所有數據以及其交集部分。
- 左連接:語法:select 字段列表 from 表1 left [outer] join 表2 on 條件
-
子查詢:
概念:查詢中嵌套查詢,稱嵌套查詢為子查詢。
查詢工資最高的員工信息- 查詢最高的工資是多少
select max(salary) from emp; - 查詢員工信息,并且工資等于9000的
select * from emp where emp.'salary'=9000; - 一條語句就執行完這個操作查詢員工最高工資的人并且還要展示員工信息,
select * from emp where emp.'salary'=(select max(salary)from emo);
子查詢不同情況
- 查詢最高的工資是多少
-
子查詢的結果時單行單列的:
- 子查詢可以作為條件,使用運算符去判斷。運算符:>>=<<==
- 查詢員工工資小于平均工資的人:select * from emp where emp.salary<(select avg(salary) from emp);
-
子查詢的結果時多行單列的:
- 子查詢可以作為條件,使用運算符in來判斷,查詢‘財務部’和市場部的所有員工的信息:select *from emp where dept_id in(select id from dept where name ='財務部' or name=‘市場部');
-
子查詢結果時多行多列的:
-
子查詢可以作為一張虛擬表
查詢員工入職日期時2011-11-11日之后的員工信息和部門信息
select *from dept t1,(select *from emp where emp.join_date >'2011-11-11') t2 where t1.id=t2.det_id;
-
普通內鏈接
select * from emp t1,dept t2 where t1.'dept_id'=t2.'id' and t1.'join_date'>'2011-11-11';
-
事物
- 事務的基本介紹
如果一個包含多個步驟的業務操作,被事務管理,那么這些操作要么同時成功,要么同時失敗。
操作:
開啟事務:start transaction;
回滾:rollback;
提交:commit;
例子:
創建一個張三,李四的表
id | name | balance |
---|---|---|
1 | zhangsan | 1000 |
2 | lisi | 1000 |
交易過程,
1,將張三的金額-500
update accoun set balance=balance-500 where name='zhangsan';
2.將李四的金額+500
update accoun set balance =balance+500 where name='lisi';
注意進行修改時發生錯誤(如果數據庫處于安全模式下safe-updates模式下該模式會導致非主鍵條件下無法執行update或者delete命令。)
解決方案:1,修改數據庫模式,2,使用id進行操作
update accoun set balance=balance-500 where id=1;
123123中間存在錯誤問題
update accoun set balance =balance+500 where id=2;
執行結果展示為
id | name | balance |
---|---|---|
1 | zhangsan | 500 |
2 | lisi | 1000 |
張三減去500但李四沒有增加500導致出現數據問題,為了避免該問題增加事務進行處理
在操作之前:張三減去500之前
update accoun set balance =1000 where id=1 or id=2;
start transaction;
update accoun set balance=balance-500 where id=1;
123123
update accoun set balance =balance+500 where id=2;
rollback;
commit;
在mysql數據庫中事務默認自動提交
一條DML(增三改)語句會自動提交一次事務;
事務提交的兩種方式,一種是自動提交:mysql就是自動提交的,一條DML語句就會提交一次,一種是手動提交,需要開啟事務,再提交;
修改事務的默認提交方式:set @@autocommit=0;
查看事務的默認提交方式:select @@autocommit; 結果1是自動提交,結果0是手動提交;
- 事務的四大特征:
- 原子性:是不可分割的最小操作單位,要么同時成功,要么同時失敗;c
- 持久性:當事務提交或回滾后,數據會持久化的保存數據;
- 隔離性:多個事務之間。相互獨立;
- 一致性:事務操作前后,數據總量不變;
- 事務的隔離級別(了解)
- 概念:多個事務之間隔離的,相互獨立的。但是如果多個事務操作同一批數據,則會引發一些問題,設置不同的隔離級別就可以解決這些問題。
- 存在的問題:
- 臟讀:一個事務,讀取到另一個事務中沒有提交的數據;
- 不可重復讀(虛讀):在同一個事務中,兩次讀取到的數據不一樣。
- 幻讀:一個事務操作(DML)數據表中所有記錄,另一個事務添加了一個條數據,則第一個事務查詢不到自己的修改。
- 隔離級別:
- read uncommitted:讀未提交:產生的問題:臟讀,虛讀,幻讀 ;
- read committed : 讀已提交:虛讀,幻讀 ;(Oracle 默認)
- repeatable read :可重復讀:幻讀;(MySQL默認)
- serializable:串行化:可以解決所有的問題;
- 注意:隔離級別從小到大安全性越來越高,但效率越來越低‘
- 數據庫查詢隔離級別:select @@tx_isolation; 8.0以上使用select @@transaction_isolation;
- 數據庫設置隔離級別:set transaction isolation level 級別字符串;
DCL:管理用戶,授權
- DBA:數據庫管理員
- 管理用戶
- 添加用戶:create user '用戶名'@'192.168.1.11主機地址' identified by '密碼';
- 刪除用戶:drop user 'zhangsan'@'%';
- 修改用戶密碼:
mysql8.0以前使用:update user set password =password('b123456') where user='zhangsan';
set password for 'zhangsan'@'%' =PASSWORD('c123456');
8.0以后使用:alter user 'zhangsan'@'%' identified by 'b123456'; - 查詢用戶: 1.切換到mysql數據庫,use mysql;2.查詢user表,select * from user;
通配符#表示任何主機可以使用用戶登錄數據庫;
- 在MySQL中忘記了root用戶密碼怎么辦?
- cmd-->net stop mysql 停止MySQL服務;或者通過服務頁面停止mysql的服務
- 使用無驗證方式啟動MySQL服務:MySQL--skip-grant-tables
- 打開新的cmd窗口,直接輸入mysql命令,敲回車。就可以登錄成功
- alter user 'root'@'%' identified by 'b123456';
- 關閉兩個窗口
- 打開任務管理器手動結束mysqld.exe的進程
- 啟動MySQL服務
- 使用新密碼登錄
- 授權
- 查詢權限:show grants for 'root'@'localhost';
- 授予權限:grant 權限列表 on 數據庫名.表名 to 'root'@'localhost';
授予查詢權限:grant select on db1.stu to 'zhangsan'@'%';
授予全部權限:grant all on *.* to 'root'@'localhost';
- 撤銷權限:revoke 權限列表 on 數據庫.表名 from 'root'@'localhost';
插銷查詢權限:revoke select on db1.stu from 'zhangsan'@'%';
注意:%號代表任何一個ip地址即可訪問,
默認root是localhost的可以修改成%即可在其他電腦上進行訪問;
UPDATE user SET `Host` = '%' WHERE `User` = 'root' LIMIT 1;
強制刷新權限:flush privileges;