帶你走進MySQL數據庫(MySQL入門詳細總結二)

導讀:關於MySQL,用三篇文章帶你進入MySQL的世界。文章較長,建議收藏再看!

帶你走進MySQL數據庫(MySQL入門詳細總結一)
帶你走進MySQL數據庫(MySQL入門詳細總結三)


在這裏插入圖片描述

1.連接查詢(多表查詢)

1.什麼是連接查詢?
*在實際開發中,大部分的情況下都不是從單張表中查詢數據,一般都是多張表聯合查詢最終的結果。

*在實際開發中,一般一個業務都會對應多張表,比如:學生和班級,起碼兩張表。如果存儲在一張表中就會出現大量的冗餘。
2.連接查詢的分類
*根據語法出現的年代來劃分的話,包括:
SQL92(一些老的DBA可能還在使用,DBA:DataBase Administator,數據庫管理員)

SQL99(比較新的語法)
*根據表的連接方式來劃分,包括:

  • 內連接
    等值連接,非等值連接 ,自連接
  • 外連接
    左外連接(左連接)
    右外連接(右連接)
  • 全連接(很少用)

3.在表的連接查詢方面有一種現象被稱爲:笛卡爾積現象。(笛卡爾乘積現象)兩張表連接,沒有限制的話爲兩張表的乘積。
案例:找出每一個員工的部門名稱,要求顯示員工名和部門名。
select ename,dname from **emp ,dept **;
會出現56條記錄(56 rows in set (0.00 sec))。因爲沒有條件限制,查詢結果條數爲兩張表記錄條數的乘積。

*關於表的別名:
select e.ename ,d.dname from emp e,dept d;
表的別名有什麼好處:
第一:執行效率高
第二:可讀性好。

4.怎麼避免笛卡爾積現象?
*1加條件進行過濾。

*2思考:加條件不能避免笛卡爾積現象,即不會減少匹配次數。只是顯示的是有記錄。

*3案例:找出每一個員工的部門名稱,要求顯示員工名和部門名。

select
e.ename,d.dname
from
emp e, dept d
where
e.deptno = d.deptno;(條件)//爲SQL92語法,以後不用(因爲官方說不夠清晰)

顯示:
±-------±-----------+
| ename | dname |
±-------±-----------+
| SMITH | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| JONES | RESEARCH |
| MARTIN | SALES |
| BLAKE | SALES |
| CLARK | ACCOUNTING |
| SCOTT | RESEARCH |
| KING | ACCOUNTING |
| TURNER | SALES |
| ADAMS | RESEARCH |
| JAMES | SALES |
| FORD | RESEARCH |
| MILLER | ACCOUNTING |
±-------±-----------+
5.內連接之等值連接:
特點:條件是等量關係。

*案例:找出每一個員工的部門名稱,要求顯示員工名和部門名。
SQL99:(常用的)

**

select** 
	e.ename,d.dname
**from**
	emp e
**inner) join**inner可以省略,可讀性好。)(內連接)
	dept d
**on**
	e.deptno = d.deptno;

*還可以在on後面寫where。(結構清晰)
6.內連接之非等值連接:

特點:連接條件中的關係不是等量關係。

案例:找出每個員工的工資等級,要求顯示員工名、工資、工資等級。
select
e.ename,e.sal,s.grade
from
emp e
join (inner可以省略)
salgrade s
on
e.sal between s.losal and s.hisal;(即條件不是等量關係)
7.自連接
特點:一張表看做兩張表。自己連接自己。

案例:找出每個員工的上級領導,要求顯示員工名和對應領導名。

員工的領導編號= 領導的員工編號。

select
a.ename as '員工名’ ,b.ename as '領導名'
from
emp a
inner join(inner可以省略)
emp b
on
a.mgr = b.empno;

8.外連接
什麼是外連接和內連接有什麼區別?

**內連接:**假設A和B表進行連接,使用內連接的話,凡是A表和B表能匹配的記錄查詢出來,這就是內連接,AB兩張表沒有主次之分。

**外連接:**假設A和B進行連接,使用外連接的話,AB兩張表中有一張表是主表,一張表是副表,主要查詢主表中的數據,捎帶着查詢副表,副表中的數據沒有和主表的數據匹配上,副表自動模擬出NULL與之匹配。

外連接的分類:
左外連接:(左連接):表示左邊的這張表是主表。

右外連接:(右連接):表示右邊的這張表是主表。

左連接有右連接的寫法,右連接有左連接的寫法。

案例:找出每個員工的上級領導。(所有員工必須查詢出來)
select
a.ename '員工’ , b.ename ‘領導’
from
emp a
left (outer) join(左外連接,outer可以省略)
emp b
on
a.mgr = b.empno;
改爲右連接
select
a.ename '員工’ , b.ename '領導‘
from
emp b
right (outer)join(右外連接,outer可以省略)
emp a
on
a.mg r = b.empno;
*外連接特點:主表數據無條件的全部查詢出來。

案例:找出哪個部門沒有員工?
select
e. *,d. *
from
emp e
right join
dept d
on
e.deptno = d.deptno
where
e.empno is null;
全連接,兩個都是主表。(很少使用)

9.三張以上的表的查詢。
案例:找出每一個員工的部門名稱和工資等級。

A
join
B
join
C
on

分析:A和B表先進行連接,在和c表進行連接。

select(內連接)
e.ename, d.dname,s.grade
from
emp e
join
dept d
on
e.deptno =d.deptno
join
salgrade s
on
e.sal between s.losal and s.hisal;
案例二:找出每一個員工的部門名稱、工資等級、以及上級領導

select(外連接
e.ename, d.dname,s.grade
from
emp e
join
dept d
on
e.deptno =d.deptno
join
salgrade s
on
e.sal between s.losal and s.hisal
left join
emp e1
on
e.mgr = e1.empno;
在這裏插入圖片描述

2.Navicat工具

1.Navicat是一套快速、可靠並價格相當便宜的數據庫管理工具,專爲簡化數據庫的管理及降低系統管理成本而設。它的設計符合數據庫管理員、開發人員及中小企業的需要。Navicat 是以直覺化的圖形用戶界面而建的,讓你可以以安全並且簡單的方式創建、組織、訪問並共用信息。Navicat是聞名世界、廣受全球各大企業、政府機構、教育機構所信賴,更是各界從業員每天必備的工作夥伴。自2001 年以來,Navicat 已在全球被下載超過 2,000,000 次,並且已有超過 70,000 個用戶的客戶羣。《財富》世界 500 強中有超過 100 家公司也都正在使用 Navicat。

2.它可以用來對本機或遠程的 MySQL、SQL Server、SQLite、Oracle 及 PostgreSQL 數據庫進行管理及開發。Navicat的功能足以符合專業開發人員的所有需求,而且對數據庫服務器的新手來說又相當容易學習。有了極完備的圖形用戶界面 (GUI),Navicat 讓你可以以安全且簡單的方法創建、組織、訪問和共享信息。

3.Navicat適用於三種平臺 - Microsoft Windows、Mac OS X 及Linux。它可以讓用戶連接到任何本機或遠程服務器、提供一些實用的數據庫工具如數據模型、數據傳輸、數據同步、結構同步、導入、導出、備份、還原、報表創建工具及計劃以協助管理數據。

4.新手不建議使用Navicat,因爲不用寫SQL語句,耽誤你的成長。

3.子查詢(嵌套select)

1.select語句當中嵌套select語句,被嵌套的select語句是子查詢。
*子查詢可以出現的位置?
select
…(select)
from
…(select)
where
…(select)
2.where子句中使用子查詢
案例:找出高於平均薪資的員工信息。
select * from emp where sal > avg(sal);//錯誤寫法,where後面不可以直接使用分組函數。

第一步:找出平均工資
select avg(sal) from emp;

第二步:where 過濾
select * from emp where sal >2073.xxx

合併:
select * from emp where sal>(select avg(sal) from emp);
3.from後面嵌套子查詢
案例:找出每個部門平均薪水的薪資等級
第一步:找出每個部門平均薪水(按照部門分組,求sal的平均值)
select deptno ,avg(sal) as abgsal from emp group by deptno;

第二步:
*將以上的查詢結果當作臨時表t,讓t表和salgrade表連接,條件是:t.avgsal between s.losal and s.hisal

select
t.*,s.grade
from
(select deptno,avg(sal) as abgsal from emp group by deptno )t
join
salfrade s
on
t.avgsal between s.losal and s.hisal

案例:找出每個部門平均的薪資等級(先求每個員工薪資的等級再求其平均)
第一步:找出每個員工的薪水等級

select
	e.ename,e.sal,e.deptno,s.grade
from 
  emp e 
join 
	salgrade s
on 
   e.sal between s.losal and s.hisal;

第二步:基於以上結果,繼續按照deptno分組,求grade平均值。
select
e.deptno,avg(s.grade)
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal
group by
e.deptno;
4.在select後面嵌套子查詢。

案例:找出每個員工所在的部門名稱,要求顯示員工名和部門名。

select
e.ename,e.deptno,
(select d.dname from dept d where e.deptno=d.deptno)as dname
from
emp e;
第二種方式:(不用select嵌套)

select
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno=d.deptno;

4.union

*可以將查詢結果集相加。
案例:找出工作崗位是SALESMAN和MANAGER員工?
第一種:
select ename,job from emp where job =‘MANGER’ or job =‘SALESMAN’;

第二種:
select ename,job from emp where job in(‘MANGER’ ,SALESMAN’);

第三種:
select ename,job from emp where job =‘MANGER’
union
select ename,job from emp where job =‘SALESMAN’
union可以將兩張不相干的表中的數據拼接在一起。
union兩個部分的列數要相同。

5.limit

*1.limit是mysql中特有的,(Oracle中有個相同的機制,叫做rownum)主要用於取結果集的部分數據。

*語法機制:

  • limit startIndex ,length
    startIndex 表示起始位置。
    length表示取幾個。

2.案例:取出工資前5名的員工(思路:降序取前5個數據。)
select ename,sal from emp order by sal desc;
取前五個:
select ename,sal from emp order by sal desc limit 0,5;
select ename,sal from emp order by sal desc limit 5;

*limit 是sql語句最後執行的一個環節。
select----->5

from----->1

where------->2

group by------->3

having--------->4

order by--------->6

limit---------> 7
…;
3.案例:找出工資排名在第4到第九名的員工。
select ename,sal from emp order by sal desc limit 3,9;
4.通用的標準分頁sql:
每頁顯示3條記錄:
第一頁:0,3
第二頁:3,3
第三頁:6,3
第四頁:9,3
第五頁:12,3
每頁顯示pageSize條記錄:
第pageNo頁:(pageSize-1)*pageSize,pageSize
java代碼{
int pageNo =2;//頁碼爲二
int pageSize = 10;//每頁顯示10條

limit 10,10;
}

6.創建表,插入(增加)數據,刪除數據,和修改(更新)數據

1.建表語句的語法格式:
create table 表名(
字段名1 數據類型,
字段名2 數據類型,
字段名3 數據類型,

);

2.關於MySQL當中字段常見的數據類型:
int 整數型
bigint 長整型(long)
float 浮點型(float,double)
char 定長字符串
varchar 可變長字符串(255字符)(stringBuffer/StringBuilder)
date 日期類型(java.sql.Date)
BLOB 二進制大對象(存儲圖片、視頻等流媒體信息)Binary large OBject(java的object)
CLOB 字符串對象 (存儲較大文本,比如,可以存儲4G的字符串)Character Large OBject
*BLOB和CLOB類型的使用:
電影表:t_moive
id(int) name(varchar) playtime(date/char) poster(BLOB) history(CLOB)
可以將路徑放進去。一般不會將視頻放到表中

*表最好以_t或者_tbl_開始。
案例:創建學生表
學號、姓名、性別、班級編號、生日
學號:bigint
性別:char
班級編號:varchar
生日:char
create table t_student(
num bigint,
name varchar(255),
sex char(1),
classnum varchar(255),
birthday char(10)
);

詳細的MySQL數據類型介紹

3.insert語句插入數據
*語法格式:
insert into 表名(字段名1,字段名2…字段名n)values(值1,值2,…值n)

*要求:字段的數量和值的數量相同,並且數據類型相同。
insert into t_student(num,name,sex,classnum,birthday)values(3,‘MengYangChen’,‘m’,‘XinA1811’,‘1999-09-10’);
*只要字段和值對應即可,沒有順序可言。
*可以插入部分數據,剩餘字段默認添NULL。

*drop table if exists t_student;//當存在時刪除。

*default在建表時,在字段名後面使用,表示默認值。

*當insert成功後,不能用再insert修改某些字段的數據,只能用updata進行更新。
*其他寫法
insert into t_student values(5,‘jack’,‘w’,‘XinA1811’,‘2000-10-18’);

一次插入多行數據:
insert into t_student (num,name,sex,classnum,birthday)
values
(6,‘Hai’,‘w’,‘XinA1811’,‘2000-10-18’),(7,‘WenChang’,‘w’,‘XinA1811’,‘2000-10-18’);
4.表的複製
語法:
create table 新表名 as select 語句;
例如:
create table t_student2 as select name,birthday from t_student;

*t_student2的部分內容。
±-------------±-----------+
| name | birthday |
±-------------±-----------+
| MengYangChen | NULL |
| Huangjiahuan | NULL |
| LiuQingDong | NULL |
其實質爲將查詢結果當作表創建出來。

5.將查詢結果插入另一張表中。
注意:字段數要相同。
語法:insert into t_student select * from emp;

6.修改表中的數據
語法格式:
update 表名 set 字段名1 = 值1,字段名2=值2…where 條件;
注意:如果沒有設置條件的話,整個字段都更新。
update t_student set num =4 where birthday =‘1999-09-10’;
可以在set後面同時更改多個字段值。

*如果要更新字段所有記錄,不用加條件即可。

7.刪除數據:
語法格式:
delete from 表名 where 條件;

注意:沒有條件全部刪除數據。

刪除學號爲7的記錄:
delete from t_student where num =7;

刪除所有記錄:
delete from t_student
*delete效率差,不會釋放空間,可以撤銷。

怎麼刪除大表?(重點)
truncate table t_student;//表被截斷,不可撤銷,永久丟失。

8.修改表結構,用的少,在開發中表結構的修改很少,遇到建議直接用Navicat工具,其不會出現在java代碼中。

CRUD操作:即增刪改查,(insert,delete ,update ,select)會出現在java代碼中。

Cteate(增)
Retrieve(檢索)
Update(修改)
Delete(刪除)

7.創建表時加入約束(Constraint)

什麼是約束?
在創建表的時候,可以給表的字段添加相應的約束,目的是爲了保證表中數據的合法性,有效性,完整性。
如:
id username(唯一性約束)password(非空約束)

常見的約束有哪些呢?
非空約束:(not null)約束的字段不能爲NULL。
唯一約束:(unique)約束的字段不能重複。
主鍵約束:(primary key)約束的字段既不能爲NULL,也不能重複。
外鍵約束:(foreign key)簡稱FK
檢查約束:(check)
注意:Oracle數據庫有check約束,但是mysql沒有。

1.非空約束:
1.drop table if exists t_user;

2.create table t_user(
id int,
username varchar(255) not null,
password varchar(255)
);

3.insert into t_user(id,password) values(1,‘123’);

報錯:ERROR 1364 (HY000): Field ‘username’ doesn’t have a default value
即用戶名不能爲空。

2.唯一性約束:
修飾的字段具有唯一性,不能重複,但可以爲NULL,因爲NULL不可以比較。
1.drop table if exists t_user;

2.create table t_user1(
id int,
username varchar(255) unique,
password varchar(255)
);【列級約束】

3.insert into t_user1(id,username,password) values(1,‘MengYangChen’,‘123’);

insert into t_user1(id,username,password) values(1,‘MengYangChen’,‘1r23’);
報錯:ERROR 1062 (23000): Duplicate entry ‘MengYangChen’ for key ‘username’;

給多個列添加unique
create table t_user1(
id int,
username varchar(255) ,
password varchar(255) ,
unique(username,password)
);
表示多個列聯合起來不一樣,也就是說這種方式可以有一列或多列相同,但不能全相同。【表級約束】

3.主鍵約束
怎麼給一張表添加主鍵約束?
在字段後面加
1.drop table if exists t_user;

2.create table t_user2(
id int primary key ,
username varchar(255) ,
password varchar(255)
);【列級約束】
根據以上的測試得出:id是主鍵,因爲添加了主鍵約束,主鍵字段中的數據不能爲NULL,也不能重複。

主鍵的特點:不能爲NULL,也不能重複。
逐漸相關的術語:
主鍵約束:primary key
主鍵字段:id
主鍵值:插入的值
4.主鍵有什麼用?
表的設計三範式中有要求,第一範式就要求任何一張表都應該有主鍵。
主鍵值不一樣就認爲兩者是不同的記錄,是記錄的唯一標識。

一張表的主鍵約束只能有一個,可以複合主鍵。

主鍵的分類:
根據主鍵字段的字段數量來劃分:
單一主鍵(常用)
複合主鍵(多個字段聯合起來添加一個主鍵約束,不建議使用,因爲違背了三範式)

根據主鍵性質來劃分:
自然主鍵:主鍵值最好就是一個個和業務沒有任何關係的自然數。
業務主鍵:主鍵值和系統的業務掛鉤。(如拿銀行卡號做主鍵)
最好不要拿着和業務掛鉤的字段作爲主鍵。因爲以後的業務一旦發生改變的時候,主鍵值可能也需要隨着發生變化,但有的時候沒有辦法變化,因爲變化可能會導致主鍵值重複。

使用表級約束方式定義主鍵:
1.drop table if exists t_user2;

2.create table t_user2(
id int ,
username varchar(255) ,
password varchar(255) ,
primary key(id)
);【表級約束】

複合主鍵:在primary key()括號中添加字段即可。

5.mysql提供主鍵值自增:
1.drop table if exists t_user3;

2.create table t_user3(
id int primary key auto_increment,//子段自動維護一個自增的數字,從1開始,以1自增
username varchar(255) ,
password varchar(255) ,
);
優點:可以不用寫主鍵,比如用戶註冊的時候。
Oracle的遞增叫做序列對象。

6.外鍵約束:
關於外鍵約束的相關術語:
外鍵字段:添加有外鍵約束的字段
外鍵約束:foreign key
外鍵值:外鍵字段中的每一個值。

業務背景:設計學生數據庫表用來維護學生和班級的信息?
第一種方案:一張表存儲所有數據。(學生表)
缺點:數據冗餘

第二種方案:兩張表(班級表和學生表)
t_class 班級表
cno(pk) cname


A1511 北京xx大學A1511班
A1311 北京xx大學A1311班

t_student學生表
sno(pk) 主鍵 sname classno (該字段添加外鍵約束fk)


1 xing A1511
2 Meng A1311
將以上表的建表語句寫出來:
t_student中的classno字段引用t_class表中的cno字段,此時t_student表叫做子表。t_class表叫做父表。
先創建父表,再創子,先刪子,再刪父。
先添父,再添子。
drop table if exists t_student;
drop table if exists t_class;

create table t_class(
cno int,
cname varchar(255),
primary key(cno)
);

create table t_student(
sno int ,
sname varchar(255),
classno int,
primary key(sno),
foreign key(classno) references t_class(cno)
);

insert into t_class values(101,‘xx’);
insert into t_class values(102’yyy’);

insert into t_student values(1,‘dff’,101);
insert into t_student values(2,‘dfaf’,102);

如果:insert into t_student values(3,‘daaf’,103)
這個會報錯,因爲子表外鍵約束了,只能插入父表的特定數據。

*sql腳本,其實就是sql語句。

外鍵值可以爲NULL嗎?
外鍵可以爲NULL,外鍵字段引用另一個字段,被引用的子段不一定要爲主鍵字段,但需要有唯一性,即至少有unique約束。

  • 關注公衆號【輕鬆玩編程】回覆,計算機資源,可以領取學習資源哦!

碼字不易,點個贊再走吧。

在這裏插入圖片描述

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