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關鍵字連線左外連線和右外連線
歡迎訪問個人部落格: