數據庫中的約束
在創建表格的過程中可以給某些字段追加約束條件
非空約束 NOT NULL
NK
create table t_user (
id int(3) not null,
username varchar(10),
password varchar(15)
);
唯一約束 UNIQUE
UK
create table t_user (
id int(3) not null,
username varchar(10) unique,
password varchar(15)
);
create table t_user (
id int(3) not null,
username varchar(10),
password varchar(15),
constraint UK_username unique(username)
);
主鍵約束 PRIMARY KEY
主鍵(PRIMARY KEY),也稱“主鍵約束”。
MySQL主鍵約束是一個列或者多個列的組合,其值能唯一地標識表中的每一行。這樣的一列或多列稱為表的主鍵,通過它可以強制表的實體完整性。主鍵主要是用于其他表的外鍵關聯,以及本記錄的修改與刪除。
主鍵(PRIMARY KEY)是 MySQL 中使用最為頻繁的約束。一般情況下,為了便于 DBMS 更快的查找到表中的記錄,都會在表中設置一個主鍵。
PK ??效果上 == 非空約束+唯一約束
create table t_user (
id int(3),
username varchar(10),
password varchar(15),
constraint pk_id primary key(id)
);
聯合主鍵
MYSQL是一個關系型數據庫管理系統,其中聯合主鍵是一種非常重要的數據庫設計概念。在MYSQL中,聯合主鍵是指使用多個列值來唯一標識一個記錄的主鍵。一個聯合主鍵可能包含兩個或更多個字段,而這些字段一起組成了一個唯一標識符。這樣可以保證在數據表中每個記錄都有唯一的標識。
外鍵約束 FOREIGN KEY
一對一 ?一對多 ?多對多
FK ?用到兩張表格
t_user (一)
t_book (多)
關系維護在(多)方
uid | Username | password |
1 | Lufei | lufei |
2 | Qiaoba | qiaoba |
bid | Bookname | author | u_id(外鍵) |
1 | 笑傲江湖 | 金庸 | 1 |
2 | 神雕俠侶 | 金庸 | 2 |
3 | 鹿鼎記 | 金庸 | 2 |
4 | 連城訣 | 金庸 | 2 |
創建過程中分兩步進行:
- 指定哪一個字段是外鍵 ?foreign key(u_id)
- 外鍵需要引用哪一個表格的字段 ?references t_user(id)
create table t_user (
id int(3),
username varchar(10),
password varchar(15),
constraint pk_id primary key(id)
);
create table t_book (
bid int(3),
bookname varchar(6),
author varchar(3),
u_id int(3),
constraint pk_bid primary key(bid),
constraint fk_u_id foreign key(u_id) references t_user(id)
);
一級菜單 ??二級菜單 ????自關聯
設計一張菜單表:
id | name | url | oneid |
1 | 用戶管理 | XXX | |
2 | 用戶添加 | XXX | 1 |
3 | 用戶刪除 | XXX | 1 |
4 | 用戶查詢 | XXX | 1 |
5 | 用戶修改 | XXX | 1 |
6 | 商品管理 | XXX | |
7 | 商品上架 | XXX | 6 |
8 | 商品下架 | XXX | 6 |
create table t_menu (
id int(3),
name varchar(10),
url varchar(20),
oneid int(3),
constraint pk_id primary key(id),
constraint fk_oneid foreign key(oneid) references t_menu(id)
);
外鍵狀態下的級聯操作:
級聯刪除謹慎使用
create table t_book (
bid int(3),
bookname varchar(6),
ahthor varchar(3),
u_id int(3),
constraint pk_bid primary key(bid),
constraint fk_u_id foreign key(u_id) references t_user(id) on delete cascade
);
create table t_book (
bid int(3),
bookname varchar(6),
ahthor varchar(3),
u_id int(3),
constraint pk_bid primary key(bid),
constraint fk_u_id foreign key(u_id) references t_user(id) on delete set null
);
檢查約束 CHECK
在一個范圍中間
create table test32(
id number primary key,
age number check(age>0 and age<120)
);
設計表需要注意的東西 ??數據庫三范式
-
-
- 第一范式(1NF)
-
- 第一范式主要是保證數據表中的每一個字段的值必須具有原子性,也就是數據表中的每個字段的值是不可再拆分的最小數據單元
-
- 第二范式(2NF)
-
- 第二范式要求在滿足第一范式的基礎上,還要滿足數據表里的每一條數據記錄,都是可唯一標識的,而且所有的非主鍵字段,都必須完全依賴主鍵,不能只依賴主鍵的一部分。
-
- 第三范式(3NF)
-
- 第三范式建立在已經滿足第二范式的基礎上
- 數據表中的每一個非主鍵字段都和主鍵字段直接相關
查詢機制
emp員工表
字段 | 描述 | 類型 |
empno | 員工編號 | mediumint |
ename | 員工姓名 | varchar |
job | 職位 | varchar |
mgr | 領導編號 | mediumint |
hiredate | 入職日期 | date |
sal | 工資 | decimal |
comm | 獎金 | decimal |
deptno | 部門編號 | mediumint |
dept部門表
字段 | 描述 | 類型 |
deptno | 部門編號 | mediumint |
dname | 部門名稱 | varchar |
loc | 部門位置 | varchar |
salgrade工資等級
字段 | 描述 | 類型 |
grade | 等級 | mediumint |
losal | 最低工資 | decimal |
hisal | 最高工資 | decimal |
簡單查詢
查詢所有員工信息
SELECT * from emp;
查詢所有并起別名
SELECT empno '員工編號',ename '員工姓名',job '職位',mgr '領導編號' from emp;
SELECT e.empno,e.job,e.sal from emp e;
查詢公司中的職位
SELECT ?DISTINCT??job from emp;
DISTINCT :去重關鍵字
限定查詢
SELECT * FROM 表名稱 [限定條件] Where ?> ?< ?>= ?<= ?!= ??between...and... ?and ??or ?is null ??in ?like ?... |
查詢工資高于1500的所有員工信息
SELECT * from emp WHERE sal > 1500;
查詢工資高于1500低于3000的所有員工信息
SELECT * from emp WHERE sal >= 1500 and sal <= 3000;
//between...and...取的區間值
SELECT * from emp WHERE sal BETWEEN 1500 and 3000;
查詢沒有獎金的所有員工信息 ?or或者
SELECT * from emp where comm = 0 or comm is NULL;
查詢有獎金的員工信息
SELECT * from emp where comm > 0;
查詢員工姓名中帶有S的員工信息
SELECT * from emp where ename like '%S%';
模糊匹配:
%:占位符 代表0個或者多個字符
_:占位符 ?代表一個字符
查詢入職日期在1981年的員工
SELECT * from emp where hiredate BETWEEN '1981-01-01' and '1981-12-31';
SELECT * from emp where hiredate LIKE '%1981%';
查詢員工編號在7499 ?7521 ?7566 in包含
SELECT * from emp where empno in (7499,7521,7566);
排序查詢
SELECT * FROM 表名稱 [限定條件][排序條件] Order by 字段 升序/降序 ?? 升序 asc 降序 desc |
根據工資由高到底進行排序查詢
SELECT * from emp order by sal desc;
如果工資一樣,那么按照入職日期升序
SELECT * from emp order by sal desc,hiredate asc;