MySQL約束
主鍵約束 Primary Key
保證記錄唯一,一張表必須有主鍵
該字段不能有空值,不能有重複的值,一張表僅有一個主鍵,一般自動生成(auto_increment)
create table student(
`id` BIGINT,
`name` varchar(255),
`gender` tinyint(1),
`birth` date,
`job` enum('班長','學委','文娛'),
`course` set('java','python','大數據','C#'),
#設置id字段爲主鍵
PRIMARY KEY(id)
);
唯一鍵約束 Unique
該字段可以爲空,不能有重複的值,一張表可以有多個唯一鍵
create table user_(
`id` BIGINT auto_increment,
`name` varchar(255),
`idCard` varchar(255),
PRIMARY KEY(`id`),
#定義idCard字段爲唯一鍵,使不能爲重複的值
UNIQUE(`idCard`),
)auto_increment = 100;
非空約束 NOT NULL
create table user_(
`id` BIGINT auto_increment,
#定義name字段的值不爲空
`name` varchar(255) NOT NULL,
`idCard` varchar(255),
PRIMARY KEY(`id`),
UNIQUE(`idCard`),
)auto_increment = 100;
unique + not null 可以達到 定義字段的值 不重複且不爲空的效果,類似主鍵但是並不是主鍵,使用較少
外鍵約束 Foreign Key
#新建兩個表,學生&班級
create table student(
`id` bigint auto_increment,
`name` varchar(255) not null,
`cnum` int(4),
PRIMARY KEY(`id`)
);
create table `class` (
`id` int(4) auto_increment,
`cname` varchar(255) not null,
PRIMARY KEY(`id`)
);
#由表可知,student表中的cnum的取值範圍取決於class表中的id,此時需要引入外鍵
#重新建立student表加入外鍵約束,student依賴於class,故先創建class,在創建student
create table student(
`id` bigint auto_increment,
`name` varchar(255) not null,
`cnum` int(4),
PRIMARY KEY(`id`),
#定義cnum爲外鍵,連接到class表的id字段
#注意這兩個字段的屬性需要一致,且被連接的鍵應該爲唯一鍵或主鍵
FOREIGN KEY(`cnum`) REFERENCES class (`id`)
);
create table class (
`id` int(4) auto_increment,
`cname` varchar(255) not null,
PRIMARY KEY(`id`)
);
#此時向class中插入數據
insert into class VALUES
(DEFAULT,'1班'),
(DEFAULT,'2班');
#限制了class中id的字段爲1和2,此時若插入student中cnum的字段值非1或2,則會報錯
insert into student VALUES
(DEFAULT,'bob',3),
(DEFAULT,'dily',2);
#報錯
[Err] 1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`cnum`) REFERENCES `class` (`id`))
#此時修改3爲1或2即可
(Oracle還有一個檢查性約束)
MySQL 規範建表
#建表語法:列名 數據類型 約束 默認值 備註
CREATE TABLE `order`(
`id` INT auto_increment,
`orderid` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '訂單號',
`orderdate` datetime NOT NULL DEFAULT NOW() COMMENT '下單時間',
`orderstate` INT NOT NULL DEFAULT 3 COMMENT '訂單狀態' COMMENT '1-未付款/2-已付款/3-未結算',
PRIMARY KEY (`id`)
);
MySQL 插入數據
#單條插入
insert into `order`
(id,orderid,orderdate,orderstate)#當所有字段都插入數據的時候可以省略該行,如下多條插入。
VALUES
(DEFAULT,001,'2020-12-10 15:50:30',1);
#多條插入
insert into `order`
VALUES
(DEFAULT,002,DEFAULT,1),
(DEFAULT,003,DEFAULT,2),
(DEFAULT,004,DEFAULT,DEFAULT);
MySQL 查詢
下面講解mysql查詢,首先按照下表新建數據庫,數據表emp和數據表dept
表emp結構
表dept結構
兩個表格的數據
簡單查詢
#查詢所有數據
select * from emp;
#等同於
select empno,ename,job,mgr,hiredate,,sal,comm,deptno from emp;
#查詢指定列數據
select empno,ename from emp;
#表達式查詢
select 字段&算式 from 表名;
#去重查詢
select DISTINCT 字段 from 表名;
注意null與任何值相加結果爲空,股可以設置 ifnull(column,0),將爲null的列值轉化爲0後進行運算
WHERE 條件查詢
select 列名 from 表名 where 條件;
#查詢在部門20的員工信息
select * from emp
where
deptno = 20;
between … and …
#查詢月薪在5000-7000內的所有員工姓名 between ... and ...
select ename as 員工姓名 from emp
where
sal BETWEEN 5000 and 7000;
in(… , …)
#查詢職位是clerk或者saleman的員工姓名 in (x,x)
SELECT ename as 員工姓名 from emp
where
job in ('saleman','clerk');
like 模糊查詢
#%任意多個字符 / _一個字符 模糊查詢不能用於查詢日期
#查詢姓名以A開頭的員工姓名
select ename as 員工姓名 from emp
where
ename like 'A%';
#查詢姓名中含有A的員工姓名
select ename as 員工姓名 from emp
where
ename like '%A%';
#查詢姓名以A結尾的員工姓名
select ename as 員工姓名 from emp
where
ename like '%A';
#查詢姓名兩位且第二位是L的員工姓名
select ename as 員工姓名 from emp
where
ename like '_L';
#查詢姓名第二位是L的員工姓名
select ename as 員工姓名 from emp
where
ename like '_L%';
#查詢姓名倒數第二位是L的員工姓名
select ename as 員工姓名 from emp
where
ename like '%L_';
is null 查詢空值
#查詢獎金爲空的員工姓名
select ename,comm from emp
where comm IS NULL;
and / or /not
#查詢20部門職位爲clerk的員工的姓名 AND
select ename as 員工姓名 from emp
WHERE
deptno = 20
AND
job = 'clerk';
order by 查詢結果排序
#查詢員工姓名職位工資,並將結果按照工資升序排列
SELECT ename,job,sal from emp
ORDER BY sal;
#查詢員工姓名職位工資,並將結果按照工資降序排列
SELECT ename,job,sal from emp
ORDER BY sal DESC;
#查詢結果可以按照別名排序
SELECT ename,job,sal*12+IFNULL(comm,0) as 年薪 from emp
ORDER BY 年薪;
#可以按照多個列排序
#查詢員工信息,按照部門升序,工資降序
SELECT * from emp
order BY
deptno,
sal DESC;
limit 分頁
#查詢從0行開始,長度爲5的數據記錄
SELECT * from emp
limit 0,5;
未完待續…