1. 程式人生 > 資料庫 >MySQL 基礎語法快速入門

MySQL 基礎語法快速入門

mysql基礎

三大正規化

第一正規化(1NF):要求資料庫表的每一列都是不可分割的原子資料項。

第二正規化(2NF):在1NF的基礎上,非碼屬性必須完全依賴於候選碼(在1NF基礎上消除非主屬性對主碼的部分函式依賴)

第二正規化需要確保資料庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。

第三正規化(3NF):在2NF基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)

第三正規化需要確保資料表中的每一列資料都和主鍵直接相關,而不能間接相關。

常用資料型別

數值型別

型別 有符號 無符號
tinyint -128~127 0~255
int -2^31 ~ 2^31-1 0~2^32-1

浮點型

型別 大小
float 4位元組
double 8位元組

時間日期

型別 格式
Datetime YYYY-mm-dd HH:MMss
Date YYYY-mm-dd
Time HH:MM:ss
Timestamp 時間戳,從1970/1/1開始,格式與Datetime一致

字串型

格式 長度
char 最大長度255
varchar 可變字串,最大長度65536
Text 通常超過255就會使用

資料庫語法

查詢已有資料庫列表:

show databases;

建立資料庫:

create database 資料庫庫名 [選項];

檢視建庫語句:

show create database 資料庫名;

修改資料庫(資料庫名不可更改):

alter database 資料庫名 [選項];

刪除資料庫:

drop database [if exists] 資料庫名;

進入/使用資料庫:

use 資料庫名;

資料庫約束

約束型別 語法 舉例
非空約束 not null
唯一約束 unique
主鍵約束 primary kry
條件約束 check $ check(id>0)
預設值 default $ default ‘ ‘
自增約束 auto_increment

表級約束:

字符集:charser/ character set 具體字符集

校對集:collate 具體校對集

儲存引擎:engine 具體儲存引擎(InnoDB MyISAM)


表語法

例子:

create table t_user(
	id int primary key auto_increment,
  	name char(32) default '',
  	age int
)engine=InnoDB charset=utf8

檢視所有表:

show tables;

查詢帶關鍵字的表:

show tables like '%關鍵字%';

檢視建表語句:

show create table 表名;

查看錶結構:

#三種方式:
desc 表名;
describe 表名;
show columns from 表名;

刪除表(可多表刪除):

drop table [if exists] 表名1,表名2...;

修改表名:

rename table 舊錶名 to 新表名;

修改表選項(字符集,校對集,儲存引擎):

alter table 表名 表選項=值;

新增表字段:

alter table 表名 add 欄位名 資料型別 [列屬性] [位置];

修改表字段:

alter table 表名 change 舊欄位 新欄位名 資料型別 [列屬性] [位置];

刪除欄位:

alter table 表名 drop 欄位名;

表資料操作(增刪改查)

插入資料:

insert into 表名(欄位列表) values(對應欄位值列表1),(對應欄位值列表2)...

刪除資料:

delete from 表名 [where 條件];

更新資料:

update 表名 set 欄位=值 [where 條件];

查詢資料:

select */欄位列表 from 表名 [where 條件];

查詢操作

where條件查詢

where的字串查詢不區分大小寫,若要區分則用binary

select * from t_user where binary name = 'zhangsan';

like模糊查詢

select * from t_user where name like 'zhang%';

佔位符:

​ % : 匹配0個或多個字元

​ _ : 匹配1個字元

order by 排序

預設為升序 ASC,倒序使用 DESC

select * from t_user order by name desc;
select * from t_user order by age desc name ASC;

使用多個欄位排序時,按先後順序

按第一欄位規則排序時,有重複的資料,再根據第二欄位規則排序,以此類推。

且多個欄位時,要顯式引用ASC/DESC,否則為預設ASC

in 包含

select * from t_user where id in(1,3,5);

between and

#查詢id在1到5之間的記錄(包含1,包含5)
select * from t_user where id between 1 and 5;

limit 分頁

#查詢6~15行資料
select * from t_user limit 5 10;

distinct 去除重複

select distinct * from t_user;

聚合函式

函式名 作用
AVG 返回平均值
count 返回總記錄條數
sum 返回數值總和
min 返回最小值
max 返回最大值

聚合函式無法與where 一起使用

group by 分組函式

分組函式是根據一個或多個欄位的唯一組合結果集進行分組

通常結合聚合函式一起使用

#統計男女人數
select sex as '性別',count(sex)as '人數' 
from t_user 
group by sex;

結果:

根據性別的唯一組合進行分組,分成 男 女 兩組,再結合count()函式進行統計

對欄位分組:

#統計不同年齡的男女人數
select sex as '性別',age as '年齡',count(sex)as '人數' 
from t_user 
group by sex,age;

結果:

根據sex, age兩個欄位進行分組,根據不同值進行唯一組合,再結合聚合函式進行統計

having 條件

因為聚合不能與where一起使用,所以有了having

having是用於分組後返回滿足條件的資料

#統計不同年齡的男女人數,並要求年齡不小於19
select sex as '性別',age as '年齡',count(sex)as '人數' 
from t_user 
group by sex,age having age>=19;

連線查詢

內連線 inner join

左外連線 left join

右外連線 right join

以員工表和部門表為例,dept代表該員工所在的部門:

t_employee表

t_dept表

內連線查詢:

 #查詢出員工姓名以及其對應的部門名稱
 select 
 e.empName,d.deptName
 from t_employee e
 INNER JOIN t_dept d
 ON e.dept = d.id;

結果:

在內連線中趙七沒有被查出來,因為他沒有對應的部門,現在想要把趙七也查出來,就要使用左外連線查詢

 #查詢所有員工姓名以及他所在的部門名稱
 select e.empName,d.deptName
 from t_employee e
 left join t_dept d 
 on d.id = e.dept;

結果:

右外連線查詢與做查詢同理,只是基準表的位置發生了變化:

 SELECT e.empName,d.deptName
 from t_employee e
 right join t_dept d 
 on d.id = e.dept;

結果:

總結:

左連線查詢時,左表資料全部顯示,若右表沒有對應資料,則顯示為null;

右連線查詢時,右表資料全部顯示,若左表沒有對應資料,則顯示為null;

自連線查詢

自連線查詢就是當前表與自身的連線查詢,關鍵點在於虛擬化出一張表給一個別名

#查詢員工以及他的上司的名稱,由於上司也是員工,所以這裡虛擬化出一張上司表
SELECT e.empName,b.empName
from t_employee e
LEFT JOIN t_employee b
ON e.bossId = b.id;

結果:

全外連線 union

mysql是沒有全外連線的(mysql中沒有full outer join關鍵字),想要達到全外連線的效果,可以使用union關鍵字連線左外連線和右外連線


歡迎訪問個人部落格: