MySql數據庫知識總結


概論

一、什么是數據庫:

       數據庫就是存儲數據的倉庫,其本質是一個文件系統,數據按照特定的格式將數據存儲起來,用戶可以對數據庫中的數據進行增加,修改,刪除及查詢操作。

 

二、MySQL數據庫:

       MySQL數據庫. MySQL 是一種 開放源代碼 的關系型 數據庫管理 系統(RDBMS),使用最常用的數據庫管理語言-- 結構化查詢語言(SQL)進行數據庫管理。MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載並根據個性化的需要對其進行修改。MySQL因為其速度、可靠性和適應性而備受關注。大多數人都認為在不需要事務化處理的情況下,MySQL是管理內容最好的選擇。

 

三、Oracle數據庫:

       Oracle 數據庫產品為客戶提供成本優化的高性能版 Oracle 數據庫、全球領先的融合多模型數據庫管理系統以及 In-memory、NoSQL 和 MySQL 數據庫。客戶可以在本地部署環境中通過 Oracle 公有雲本地化解決方案使用 Oracle 自治數據庫,也可以在 Oracle 雲基礎設施中使用 Oracle 自治數據庫,從而簡化關系數據庫環境並減少管理工作量。

 

四、MySQL和Oracle的區別:

①Oracle是大型的數據庫而Mysql是中小型數據庫;

②Oracle支持大並發,大訪問量;

③安裝占用的內存也是有差別,Mysql安裝完成之后占用的內存遠遠小於Oracle所占用的內存,並且Oracle越用所占內存也會變多;

④Mysql是開源的,Oracle是收費的,且價格昂貴。

 

五、什么是字符集

在計算機底層,比如說你的名字“小萌”在計算機中並不是文字的形式,而是一串二進制數字,如“011001100110…”人類只認識文字,可惜計算機只認0和1,雙方都不能妥協,那就必須要有一個從文字到0、1的映射了。從我們可以看到的文字到0、1的映射稱為編碼,反過來從0、1到文字叫解碼。ASCII、UTF-8這些就是字符集,字符集就是字符的集合。

 

六、UTF-8

U:因為計算機是美國人發明的所以一開始只支持英文字符,不支持中文、韓文、日文等字符,所以為了統一世界上大多數人的字符,比如中文的GB2312,Unicode應運而生。

UTF:Unicode Transformation Formats(Unicode轉換格式)。

UNF-8:這個“Unicode轉換格式”是為了解決“碼點”在計算機存儲方式而設計的。“碼點”經過映射后得到的二進制串的轉換格式單位稱之為“碼元”(Code Unit)。“碼點”就是一串二進制數,“碼元”就是切分這個二進制數的方法。舉個例子,如果有一個字符的碼點二進制表示有n字節(n*8個二進制數),其碼元為8位(1個字節),那么其擁有碼元n個。字節也叫比特(Byte),8bit(位)=1Byte(字節),1024Byte(字節)=1KB,1024KB=1MB,一個字節等於8位二進制,儲存一個英文字母和阿拉伯數字=2字節,儲存一個漢字=2字節。

 

七、排序規則:

排序規則:是指對指定字符集下不同字符的比較規則。其特征有以下幾點:

①兩個不同的字符集不能有相同的排序規則。

②兩個字符集有一個默認的排序規則。

③有一些常用的命名規則。如_ci結尾表示大小寫不敏感(caseinsensitive),_cs表示大小寫敏感(case sensitive),_bin表示二進制的比較(binary)。

 

八、utf-8默認的排序規則:

①utf8_general_ci 不區分大小寫,這個你在注冊用戶名和郵箱的時候就要使用;

②utf8_general_cs 區分大小寫,如果用戶名和郵箱用這個就會照成不良后果;

③utf8_bin:字符串每個字符串用二進制數據編譯存儲。區分大小寫,而且可以存二進制的內容;

④utf8_general_ci校對速度快,但准確度稍差;

⑤utf8_unicode_ci准確度高,但校對速度稍慢。

建庫表

一、數據庫

1.創建數據庫

語法格式:create database 數據庫名

舉例:建立一個叫Staff的數據庫

create database Staff

2.顯示數據庫

語法格式:show databases like '%數據庫名%'

舉例:顯示Staff數據庫

show databases like '%Staff%'

3.刪除數據庫

語法格式:drop database 數據庫名

舉例:刪除已創建的Staff數據庫

drop database Staff

 

二、表格

1.創建表格

語法格式:create table 表名(列名1 數據類型和長度 約束條件,列名2 數據類型和長度 約束條件......)charset='utf-8;

create table test_data (Number int(255) auto_increment primary key not null , Sname varchar(255) not null,Sjob varchar(255) default null ,Sentry_date date default null,Scentre varchar(255) default null,Sdepartment varchar(255) default null,Ssalary int(255) default null,Sbonus int(255) default null,Seducation varchar(255) default null)engine=innodb DEFAULT charset=utf8;

 

補充:  

①主鍵約束(primary key):數據唯一,且不為空。(數據唯一:同一列不能重復)

        創建表時直接添加在值后加約束

            單一約束:create table 表名( 列名1 列值1 primary key,...);

            聯合約束:create table 表名(列名1 列值1, 列名2 列值2, .... 列名n 列值n,  primary key(列名1,列名2); )

        創建表后,補充約束alter table 表名 add primary key(列名1);

        刪除約束:alter table 表名 drop primary key;

②非空約束:not null。

        alter table 表名 modify 字段名 字段類型 not null;

③默認值約束:default。

        添加約束:create table 表名( 列名1 列值1 約束,列名2 列值2 約束 default 默認值,  ....  )

             alter table 表名 alter 列名 set default 默認值;

④唯一約束(unique):數據唯一,可以為null。

        添加約束:create table 表名( 列名1 列值1 約束條件,列名2 列值2 unique, ....)

        后期追加: alter table 表名 add unique(列名);

⑤自動增長(auto_increment(MySQL),identity(SQLServer),sequence(oracle)):數據必須為整型和主鍵,被刪除行不影響后續自增數。

2.顯示表

show tables like '%表名%';--顯示已創建的表

desc 表名;--顯示表的結構

Tybe:字段表示的是列的數據類型

Null:字段表示這個列是否為空值

key:可能看到PRI(主鍵)、MUL(普通的b-tree索引)、UNI(唯一索引)

Default:列的默認值

Extra:其他信息

3.修改表

rename table 舊表名 to 新表名

4.刪除表

drop table 表名

5.清空表數據:

truncate 表名

 

三、列(字段)

1.修改列名:

語法格式:alter table 表名 change 列名 新列名 數據類型

舉例:將test_data表格的Sjob列名修改為job

alter table test_data change Sjob job varchar(255)

2.刪除列:

語法格式:alter table 表名 drop column 列名

舉例:刪除test_data表格的Sjob列

alter table test_data drop column Sjob

3.增加列:

語法格式:alter table 表名 add 列名 數據類型

舉例:在test_data表格里面增加一列Sjob

alter table test_data add Sjob varchar(255)

補充:alter是數據操縱,中文解釋為改變

 

四、補充知識:

MySQL中默認添加了一個名為 information_schema 的數據庫,該數據庫中的表都是只讀的,不能進行更新、刪除和插入等操作,也不能加載觸發器,因為它們實際只是一個視圖,不是基本表,沒有關聯的文件。information_schema.schemata:  該數據表存儲了mysql數據庫中的所有數據庫的庫名

information_schema.tables:     該數據表存儲了mysql數據庫中的所有數據表的表名

information_schema.columns:    該數據表存儲了mysql數據庫中的所有列的列名

 

五、請寫出下列sql語句

1、創建一個名為spon的數據庫,並查詢數據庫,最后刪除數據庫。

create database spon

show databases like ‘spon'

drop database spon

 

2、創建一個名為test的表格,包含num、name、salary、Sdate,要求num為主鍵且自增長,name為唯一的字符串,salary為不為空的整數,Sdate為默認為空的日期格式,並重新命名為demo,最后刪除表格。

create table test (num int(255) auto_increment primary key not null,name varchar(255) unique,salary int(255) not null,Sdate date default null)

rename table test to demo

drop table demo

 

3、請寫出在test表格中增加一個為bonus的整數字段,並修改為Sbonus,最后刪除字段。

alter table test add bonus int(255)

alter table test change bonus Sbonus int(255)

alter table test  drop column Sbonus

 

本次使用的數據庫表信息如下:

                                               

 

                                                                                                                test_data

                                                                         

 

                                                                                                               test_datas

增刪改查

一、增加

語法格式:insert into 表名 (列1,列2.....,列n)values (值1,值2,.....,列n)

舉例:小紅以本科學歷從2020年11月2日入職應用研發測試部測試工程師一職,月薪資10000,年終獎8000,請將信息錄入到test_data表格里面。

insert into test_data (Sname,Sjob,Sentry_date,Scentre,Sdepartment,Ssalary,Sbonus,Seducation)values ('小紅','測試工程師','20201102','應用研發','測試部','10000','8000','本科')

 

二、修改

語法格式:update 表名 set 列1=修改的值1,列2=修改的值2..... where 列=參照值

舉例:小紅在工作中做出積極貢獻,月薪提高為12000,年終獎提高為11000。

update test_data set Ssalary=12000,Sbonus=10000 where Sname='小紅'

 

三、刪除

語法格式:delete from 表名 / delete from 表名 where 列=參照值

舉例:小紅離職后行政需要把小紅的數據刪除

delete from test_data where Sname='小紅'

rollback回退

 

四、查找

語法格式:select * from 表名(星號(*)代表全部列的數據,也可以為列名只查找想要的列)

舉例:總經理想查看公司所有人的信息

select * from test_data

舉例:總經理想查看所有人的姓名和工資情況

select Sname,Ssalary from 表名

 

五、請寫出下列sql語句

1.2020年7月1日小廖從本科畢業后以月薪6000入職到營銷中心銷售部銷售一職,年終獎6000,請將信息添加到test_data表格中。

insert into test_data (Sname,Sjob,Sentry_date,Scentre,Sdepartment,Ssalary,Sbonus,Seducation)values ('小廖','銷售','20200701','營銷中心','銷售部','6000','6000','本科')

 

2.小廖入職一年后,因表現好,公司領導決定要給她月薪加1000,年終獎加2000,請將信息修改到test_data表格中。

update test_data set Ssalary=7000,Sbonus=8000 where Sname='小廖'

 

3.倆個月后小廖離職,行政將小廖信息刪除,請將信息修改到test_data表格中。

delete from test_data where Sname='小廖'

條件查詢

一、帶條件查詢(where)

語法:select 字段列表 from 表名 where 條件表達式

1.等於查詢 =

舉例:查看工作崗位是測試工程師的人員信息

select * from test_data where Sjob='測試工程師'

2.不等於查詢(> ,< , >= ,<= ,!= )

舉例:查看工資大於等於10000的員工信息

select * from test_data where Ssalary>=10000

舉例:查看不是應用研發中心的員工信息

select * from test_data where Scentre!='應用研發'

舉例:查看在2020年以后入職的員工信息

select * from test_data where Sentry_date>'20200101'

3.指定范圍查詢 BETWEEN 值1 and 值2 和not BETWEEN 值1 and 值2

舉例:查看年終獎金在8000到12000之間的員工信息

select * from test_data where Sbonus BETWEEN 8000 and 12000

舉例:查看薪資不在8000到12000之間的員工信息

select * from test_data where Ssalary not BETWEEN 8000 and 12000

4.like模糊查詢

  % 表示0個或多個字符

_表示1個字符

舉例:查找名字里面包含紅的員工信息

select * from test_data where Sname like '%紅%'

select * from test_data where Sname like '_紅%'

select * from test_data where Sname like '_紅'

5. 查詢在某個集合中 not in和in

舉例:查詢工資是8000和10000的

select * from test_data where Ssalary in(8000,10000)

6.is null 為空 is not null

舉例:查看學歷為空的員工信息

select * from test_data where Seducation is null

7.not  取反

舉例:查看學歷不為空的員工信息

select * from test_data where Seducation is not null

8.多條件查詢 and且  or 或

舉例:查看學歷為本科,工資大於8000的員工

select * from test_data where Seducation='本科' and Ssalary>8000

舉例:查看學歷為本科或者工資大於8000的員工

select * from test_data where Seducation='本科' or Ssalary>8000

 

二、子查詢

含義:查詢中嵌套查詢

語法格式:

①子查詢是一個數據,在where 子句中直接可使用={子查詢}

②子查詢是多個數據,在where子句中需要使用 列 in(子查詢)

舉例:查看公司工資最高的員工的所有信息。

select * from test_data where Sbonus in (select max(Sbonus) from test_data)

 

三、請寫出下列sql語句

1.請查找入職日期在2019年1月1日以后的員工信息。

select * from test_data where Sentry_date>20190101

 

2.請查詢入職日期在2019年1月1日至2020年12月30日之間的員工信息。

select * from test_data where Sentry_date between 20190101 and 20201230

 

3.請查詢工資不在8000和10000的員工信息。

select * from test_data where Ssalary not in(8000,10000)

 

4.請查詢學歷信息為空的員工信息。

select * from test_data where Seducation is null

 

5.請查詢部門里面帶測試倆個字的員工信息。

select * from test_data where Sdepartment like '%測試%'

 

6.請查詢應用研發中心測試部的員工信息。

select * from test_data where Scentre='應用研發' and Sdepartment='測試部'

 

7.查看工資最低的員工的所有信息。

select * from test_data where Sbonus in (select min(Sbonus) from test_data)

函數

一、最大值

語法格式:select max(列)  from 表名

舉例:查找公司薪資最高的員工及其薪資

select Sname,max(Ssalary) from test_data

 

二、最小值

語法格式:select min(列)  from 表名

舉例:查找公司薪資最低的員工及其薪資

select Sname,min(Ssalary) from test_data

 

三、求和

語法格式:select sum(列)  from 表名

舉例:計算公司一個月需要發多少工資

select sum(Ssalary) from test_data

四、平均值

語法格式:select avg(列)  from 表名

舉例:求公司平均薪資和平均獎金

select avg(Ssalary),avg(Sbonus) from test_data

 

五、數數

語法格式:select count(列)  from 表名

舉例:求公司總人數

select count(Sname) from test_data

 

六、長度

語法格式:select length(列)  from 表名

length: 一個漢字是算三個字符,一個數字或字母算一個字符。

舉例:求崗位和薪資的長度

select length(Ssalary),length(Sjob) from test_data

 

七、取別名

語法格式:select 列 as 列別名 from test_data

舉例:查找員工的薪資並給薪資取別名為salary

select Ssalary as salary from test_data

 

八、表達式

語法格式:select 列 (+-*/)數 from test_data

舉例:求公司員工的年薪(包括獎金)

select Sname,Ssalary*12+Sbonus from test_data

 

九、去重復

語法格式:select distinct(列) from test_data

舉例:求公司有那些中心

select distinct(Scentre) from test_data

 

十、升序

語法格式:select * from 表名 order by 基准列 asc

舉例:按公司薪資由低到高進行排序

select * from test_data order by Ssalary asc

 

十一、降序

語法格式:select * from 表名 order by 基准列 desc

舉例:按公司薪資由高到低進行排序

select * from test_data order by Ssalary desc

 

十二、返回指定的記錄數

語法格式:select * from 表名 limit n

舉例:按公司薪資由高到低進行排序,只顯示前3行

select * from test_data order by Ssalary desc limit 3

舉例:按公司薪資由高到低進行排序,只顯示第3行到第10行

select * from test_data order by Ssalary desc limit 2,8

舉例:按公司薪資由高到低進行排序,只顯示第10行到最后一行

select * from test_data order by Ssalary desc limit 10,-1

 

十三、請寫出下列sql語句

1.求應用研發的最高年終獎和最低年終獎分別是多少。

select max(Sbonus),min(Sbonus) from test_data where Scentre='應用研發'

 

2.計算每個員工的年薪(月薪*12+年終獎)並且取名為Year_salary。

select Sname,Ssalary*12+Sbonus as Year_salary from test_data

 

3.求應用研發中心總人數。

select count(Sname) from test_data where Scentre='應用研發'

 

4.求顯示應用研發員工薪資按降序排列的第2到第5條記錄。

select * from test_data where Scentre='應用研發' order by Ssalary desc limit 2,4

 

5.求每月應用研發需要發多少工資,及其平均工資。

select sum(Ssalary),avg(Ssalary) from test_data where Scentre='應用研發'

 

分組

一、分組

語法格式:列1,列2,聚合...from 表名 group by 列1,列2....

解釋:

1.按照字段分組,表示此字段相同的數據會被放到一個組中;

2.分組后,分組的依據列會顯示在結果集中,其他列不會顯示在結果集中;

3.可以對分組后的數據進行統計,做聚合運算(sum,max,min,avg);

4.聚合:在一個行的集合(一組行)上進行操作,對每個組給一個結果。

舉例:查看每個中心有多少人

select Scentre,count(Sname)

from test_data

group by Scentre

舉例:查看每個中心的每個部門有多少人

select Scentre,Sdepartment,count(Sname)

from test_data

group by Scentre,Sdepartment

舉例:查看每個部門最高的工資是多少

select Scentre,Sdepartment,max(Ssalary)

from test_data

group by Scentre,Sdepartment

舉例:查找每個部門最早入職和最晚入職的員工日期

select Scentre,Sdepartment,min(Sentry_date),max(Sentry_date)

from test_data

group by Scentre,Sdepartment

舉例:查找每個部門工資大於8000的最早入職和最晚入職的員工日期

select Scentre,Sdepartment,min(Sentry_date),max(Sentry_date)

from test_data where Ssalary>8000

group by Scentre,Sdepartment

舉例:查找每個部門工資大於8000的最早入職和最晚入職的員工日期,只顯示每個部門人數大於1的部門

select Scentre,Sdepartment,min(Sentry_date),max(Sentry_date)

from test_data where Ssalary>8000

group by Scentre,Sdepartment

having count(Sdepartment)>1

5.where和having區別:

having一般在group by后面,篩選完組后的數據進行二次篩選,可以用聚合函數

where在聚合前進行篩選數據,不可以用聚合函數。

 

二、請寫出下列sql語句

1.查看每個中心入職最早的員工。

select Sname,Scentre,min(Sentry_date)

from test_data

group by Scentre

 

2.查看每個中心一個月需要發多少工資。

select Scentre,sum(Ssalary)

from test_data

group by Scentre

 

3.查看每個中心本科生和研究生總共的人數。

select Scentre,count(Sname)

from test_data where Seducation='本科' or Seducation='研究生'

group by Scentre

 

4.查看每個中心本科生和研究生總共的人數,只顯示人數大於3的中心。

select Scentre,count(Sname)

from test_data where Seducation='本科' or Seducation='研究生'

group by Scentre

having count(Sname)>3

多表關聯查詢

create table test_datas (Sdepartment varchar(255) default null,dep_num int(255) not null, Sfloor varchar(255) not null,Slead varchar(255) default null)engine=innodb DEFAULT charset=utf8;

一、等值連接查詢(內連接)

語法結構:select a.*,b.* from a,b where a.sno=b.sno and a.score>60

select a.*,b.* from a join b on a.sno=b.sno where a.score>60

 舉例:查看所有的員工信息及其中心編號、樓層和領導信息

select test_data.*,test_datas.* from test_data,test_datas where test_data.Scentre=test_datas.centre

select test_data.*,test_datas.* from test_data join test_datas on test_datas.centre=test_data.Scentre

只顯示相交的部分

 

二、左右連接(外連接)

select a.*,b.* from a left join b on a.sno=b.sno where a.score>60

select a.*,b.* from a right join b on a.sno=b.sno where a.score>60

舉例:左連接查詢中心相等的倆個表格

select test_data.*,test_datas.* from test_data right join test_datas on test_datas.centre=test_data.Scentre

左連接:a表中的數據全部都顯示,而b表中的數據符合條件的才會顯示,不符合條件的會以 null 進行填充。

右連接:b表中的數據全部都顯示,而a表中的數據符合條件的才會顯示,不符合條件的會以 null 進行填充。

update test_datas set centre='制造中心' where dep_num=30

 

三、內連接和外連接的區別:

              內連接查詢操作列出與連接條件匹配的數據行;

外連接,返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接)、右表(右外連接)或兩個邊接表(全外連接)中的所有數據行。

 

四、左連接與右連接的區別:

相同點:都屬於外連接;

不同點:左連接以左邊表為基准表,右連接以右邊表為基准表,沒有數據則用null補充;

左連接關鍵字為left join,右連接關鍵字為right join。

 

五、請寫出下列sql語句

1.請寫出每個員工的領導和樓層。

select test_data.Sname,test_datas.Sfloor,test_datas.Slead from test_data,test_datas where test_data.Scentre=test_datas.centre

 

2.請寫出入職日期在2020年1月1日以后的員工部門編號(左連接)。

select test_data.Sname,test_datas.dep_num from test_data left join test_datas on  test_data.Scentre=test_datas.centre  where Sentry_date>20200101

 

3.請寫出部門編號大於20的員工領導信息(右連接)。

select test_data.Sname,test_data.Scentre,test_data.Sdepartment,test_datas.Slead from test_data right join test_datas on test_data.Scentre=test_datas.centre where dep_num>20

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM