菜雞學開發-04:MySQL約束以及查詢學習

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;

未完待續

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