1. 程式人生 > >mysql:查詢與約束

mysql:查詢與約束

1、DQL語句

單表的條件查詢:

-- 滿足條件的欄位將被顯示查詢
SELECT 欄位名 FROM 表名 WHERE 條件;

準備資料

-- 建立表
CREATE TABLE student (
  id int,
  name varchar(20),
  age int,
  sex varchar(5),
  address varchar(100),
  math int,
  english int
);
-- 插入記錄
INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES 
(1,'馬雲',55,'男','杭州'
,66,78), (2,'馬化騰',45,'女','深圳',98,87), (3,'馬景濤',55,'男','香港',56,77), (4,'柳巖',20,'女','湖南',76,65), (5,'柳青',20,'男','湖南',86,NULL), (6,'劉德華',57,'男','香港',99,99), (7,'馬德',22,'女','香港',99,99), (8,'德瑪西亞',18,'男','南京',56,65);

1.1 條件

-- 格式
select ... from 表名 where 條件;
比較運算子 < <= = > >= != <> 小於,大於,小於(大於)等於,不等於
BETWEEN…AND… 顯示在某區間的值(包頭包尾)
IN(set) 顯示在in列表中的值
LIKE"%張%" 模糊查詢,like語句中,%表示0個或多個任意的字元,_代表一個字元
IS NULL 判斷是否為空
邏輯運算子 AND 多個條件同時成立(且)
OR 多個條件任一成立(或)
NOT 不成立(非)

a)比較運算子

-- 格式
> < >= <= = != <>
# 關係運算符
-- 查詢math分數大於80分的學生
SELECT * FROM student WHERE math >80;
-- 查詢english分數小於或等於80分的學生
SELECT * FROM student WHERE english <= 80; -- 查詢age等於20歲的學生 SELECT * FROM student WHERE age = 20; -- 查詢age不等於20歲的學生 SELECT * FROM student WHERE age != 20; SELECT * FROM student WHERE age <> 20;

b)邏輯運算子

-- 格式
&& -> and -- 條件同時滿足(且)
|| -> or -- 條件滿足一個(或)
! -> not -- 條件不滿足(非)

in關鍵字

-- 格式
欄位 in (1,值2...) -- 使用or進行拼接,滿足條件就顯示
# 邏輯運算子
-- 查詢age大於35且性別為男的學生(兩個條件同時滿足)
SELECT * FROM student WHERE age > 35 AND sex = '男';
-- 查詢age大於35或性別為男的學生(兩個條件其中一個滿足)
SELECT * FROM student WHERE age > 35 OR sex = '男';
-- 查詢id是1或3或5的學生 7 9 11 13 ....
SELECT * FROM student WHERE id = 1 OR id =3 OR id = 5;
-- in關鍵字
-- 再次查詢id是1或3或5的學生
SELECT * FROM student WHERE id IN(1,3,5);
-- 查詢id不是1或3或5的學生
SELECT * FROM student WHERE id NOT IN(1,3,5);

c)範圍查詢

-- 格式
欄位 between 較小的值 and 較大的值 -- 包頭包尾
-- 查詢english成績大於等於77,且小於等於87的學生
SELECT * FROM student WHERE english >= 77 AND english <=87;
-- 推薦
SELECT * FROM student WHERE english BETWEEN 77 AND 87;

d)模糊查詢

-- 格式
欄位 like '萬用字元字串';
% -- 任意字元 零個或多個
_ -- 一個字元
# like模糊匹配
-- 查詢姓馬的學生
SELECT * FROM student WHERE `name` LIKE '馬%';
-- 查詢姓名中包含'德'字的學生
SELECT * FROM student WHERE `name` LIKE '%德%';
-- 查詢姓馬,且姓名有三個字的學生
SELECT * FROM student WHERE NAME LIKE '馬__';

1.2 排序

對查詢結果進行排序:多欄位排序,後者是在前者基礎之上,再進行排序

-- 格式
select ... from 表名 order by 排序欄位 [asc | desc],排序欄位 [asc | desc];
asc -- 升序 預設值
desc -- 降序
# 排序
-- 查詢所有資料,使用年齡降序排序
SELECT * FROM student ORDER BY age DESC;
-- 查詢所有資料,在年齡降序排序的基礎上,如果年齡相同再以數學成績降序排序
SELECT * FROM student ORDER BY age DESC,ma C;

-- 拓展知識點 資料庫字符集 utf8 沒有按照 拼音排序 必須使用 GBK
-- 使用java程式碼  convert() 轉換函式
SELECT * FROM student ORDER BY NAME ;
SELECT * FROM student ORDER BY CONVERT(NAME USING gbk) ;

1.3 聚合函式

對一列資料進行計算,返回一個結果;忽略NULL

-- 格式
count(欄位名) -- 統計
sum(欄位名) -- 求和,如果指定列型別不是數值型別,那麼計算結果為0
avg(欄位名) -- 平均值,如果指定列型別不是數值型別,那麼計算結果為0
max(欄位名) -- 最大值,如果指定列是字串型別,那麼使用字串排序運算
min(欄位名) -- 最小值,如果指定列是字串型別,那麼使用字串排序運算
# 聚合函式
-- 查詢學生總數(不包含null值)
SELECT COUNT(id) FROM student;
SELECT COUNT(english) FROM student;
-- count(*) count(number) 包含NULL
SELECT COUNT(*) FROM student;
SELECT COUNT(7) FROM student;
-- 查詢年齡大於40的總數
SELECT * FROM student WHERE age > 40;
SELECT COUNT(*) FROM student WHERE age > 40;
-- 查詢數學成績總分
SELECT SUM(math) FROM student;
-- 查詢數學成績平均分
SELECT AVG(math) FROM student;
-- 查詢數學成績最高分
SELECT MAX(math) FROM student;
-- 查詢數學成績最低分
SELECT MIN(math) FROM student;

1.4 分組

對查詢結果進行分組,相同的內容分為一組;通常與聚合函式一起使用

-- 格式
select 分組欄位 from 表名 group by 分組欄位 having 條件;

總結

where在分組前條件過濾,不能使用聚合函式

having在分組後條件過濾,可以使用聚合函式

# 分組
-- 按性別分組
SELECT COUNT(*) FROM student WHERE sex = '男';
SELECT COUNT(*) FROM student WHERE sex = '女';
SELECT sex FROM student GROUP BY sex;  
-- 查詢男女各多少人
SELECT sex,COUNT(*) FROM student GROUP BY sex;
-- 查詢年齡大於25歲的人,按性別分組,統計每組的人數
SELECT sex,COUNT(*) FROM student WHERE age >25 GROUP BY sex;
-- 查詢年齡大於25歲的人,按性別分組,統計每組的人數,並只顯示性別人數大於2的資料
SELECT sex,COUNT(*) FROM student WHERE age >25 AND COUNT(*)>2 GROUP BY sex;-- 錯誤,where不可以使用聚合函式進行判斷
SELECT sex,COUNT(*) FROM student WHERE age >25 GROUP BY sex HAVING COUNT(*)>2;

1.5 分頁

準備資料

# 分頁
INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES 
(9,'唐僧',25,'男','長安',87,78),
(10,'孫悟空',18,'男','花果山',100,66),
(11,'豬八戒',22,'男','高老莊',58,78),
(12,'沙僧',50,'男','流沙河',77,88),
(13,'白骨精',22,'女','白虎嶺',66,66),
(14,'蜘蛛精',23,'女','盤絲洞',88,88);
-- 格式
select ... from 表名 limit [ 起始索引(0)]向後查詢的個數;
-- 查詢學生表中資料,從第三條開始顯示,顯示6條
SELECT * FROM student LIMIT 2,6;
-- 查詢學生表中資料,顯示前6條 
SELECT * FROM student LIMIT 0,6;
SELECT * FROM student LIMIT 6;
-- 模擬百度分頁,一頁顯示5條

-- 第一頁
SELECT * FROM student LIMIT 0,5;
-- 第二頁
SELECT * FROM student LIMIT 5,5;
-- 第三頁
SELECT * FROM student LIMIT 10,5;

-- 額外知識點
-- 第N頁 (n-1)*size,size

1.6 格式

select ... from 表名 [where 子句] [group by 子句] [having 子句] [order by 子句] [limit 子句]

2、資料庫備份與還原

資料庫遷移:備份、還原

2.1 dos視窗

-- 備份 轉存
mysqldump -u使用者名稱 -p密碼 資料庫名 > 匯出檔案路徑
-- 還原 登入mysql
source 匯入檔案路徑;

2.2 圖形化工具

3、資料庫約束

3.1 概述

對資料的進一步限制,來保證資料的正確性有效性完整性

約束的分類

primary key -- 主鍵約束 類似於 身份證號
unique -- 唯一
not null  -- 非空 
default -- 預設值
foreign key --外來鍵

3.2 主鍵

用來唯一標識一條記錄,一般使用id作為主鍵

新增主鍵約束

-- 建立表
create table 表名(
    欄位名 欄位型別 primary key,
    ... 
);
-- 已有表
alter table 表名 add primary key(欄位名);

主鍵要求唯一和非空

一張表只能有一個主鍵;(主鍵可以包含多個欄位,一般最多設定2個)

-- 主鍵
-- 錯誤Duplicate entry '14' for key 'PRIMARY'
ALTER TABLE student ADD PRIMARY KEY(id);

-- 建立表【掌握】
CREATE TABLE stu1(
	id INT PRIMARY KEY,
	NAME VARCHAR(32)
);
-- 插入記錄
INSERT INTO stu1 VALUES(1,'tom');
-- 錯誤Duplicate entry '1' for key 'PRIMARY'
INSERT INTO stu1 VALUES(1,'tom');
-- 錯誤 Column 'id' cannot be null
INSERT INTO stu1 VALUES(NULL,'jerry');

-- 讓name 也作為主鍵 唯一和非空
-- 錯誤 Multiple primary key defined
ALTER TABLE student ADD PRIMARY KEY (NAME);

-- 聯合主鍵(id,name)
CREATE TABLE stu2(
	id INT ,
	NAME VARCHAR(32),
	PRIMARY KEY (id,NAME)
);
-- 插入記錄
INSERT INTO stu2 VALUES(1,'tom');
INSERT INTO stu2 VALUES(1,'jerry');
-- 錯誤 Duplicate entry '1-jerry' for key 'PRIMARY',只有id和name完全相同才會報錯
INSERT INTO stu2 VALUES(1,'jerry');

主鍵自增

自增器起始值為1

-- 建立表  
create table 表名(
	欄位名 欄位型別 primary key auto_increment,
    ....
);
-- 已有表
alter table 表名 addprimary key(欄位名) auto_increment;
-- 主鍵自增
CREATE TABLE stu3 (
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(32)
);
-- 插入記錄
INSERT INTO stu3 VALUES(1,'tom');
INSERT INTO stu3 VALUES(NULL,'jack');-- 自增為2

ALTER TABLE stu3 AUTO_INCREMENT=10000;-- 設定自增初始值

-- 拓展知識點 id 型別為varchar 要求唯一的  生成全球唯一  36位隨機字串
SELECT UUID();

-- truncate 和 delete 區別
DELETE FROM stu3;
INSERT INTO stu3 VALUES(NULL,'jack');

TRUNCATE TABLE stu3;
INSERT INTO stu3 VALUES(NULL,'jack');

turncate 和 delete 區別

delete,記錄刪除,DML語句

truncate,表摧毀,DDL語句

刪除主鍵

-- 格式
alter table 表名 drop primary key;
-- 刪除主鍵
ALTER TABLE stu3 DROP PRIMARY KEY;
-- 需要先移出自增器
ALTER TABLE stu3 MODIFY id INT ;

3.3 唯一

NULL為特殊的值,可以重複出現

-- 建立表
create table 表名(
	欄位名 欄位型別 unique,
    .....
);
-- 已有表
alter table 表名 add unique(欄位名);
-- 唯一
CREATE TABLE stu4(
	id INT,
	NAME VARCHAR(32) UNIQUE
);
-- 插入記錄
INSERT INTO stu4 VALUES(1,'tom');
-- 錯誤 Duplicate entry 'tom' for key 'name'
INSERT INTO stu4 VALUES(2,'tom');
INSERT INTO stu4 VALUES(3,NULL);
INSERT INTO stu4 VALUES(4,NULL);

3.4 非空

-- 建立表
create table 表名(
	欄位名 欄位型別 not null,
    ...
);
-- 已有表
alter table 表名 modify 欄位名 欄位型別 not null;
-- 非空
CREATE TABLE stu5(
	id INT,
	NAME VARCHAR(32) NOT NULL
);
-- 插入記錄
INSERT INTO stu5 VALUES(1,'tom');
-- 錯誤 Column 'name' cannot be null
INSERT INTO stu5 VALUES(2,NULL);
INSERT INTO stu5 VALUES(1,'tom');

3.5 預設值

資料庫所有欄位的預設值為NULL

-- 建立表
create table 表名(
	欄位名 欄位型別 DEFAULT '預設值';
	...
);
-- 已有表
alter table 表名
-- 預設值
CREATE TABLE stu6(
	id INT,
	NAME VARCHAR(32),
	sex VARCHAR(6) DEFAULT '男'
);

-- 插入記錄
INSERT INTO stu6 VALUES(1,'rose','女');
INSERT INTO stu6(id,NAME) VALUES(2,'tom');

INSERT INTO stu6 VALUES(3,'jerry',NULL);-- 更改為null

4、表關係

4.1 概述

在現實生活中,我們實體與實體之間是存在關係的,那麼我們在設計資料庫表的時候也應該體現出這種關係;

一對多

例如:班級和學生、部門和員工

多對多

例如:學生和課程、老師和學生

一對一

例如:公司和註冊地、居民和身份證號

4.2 一對多

例如:班級和學生

在這裡插入圖片描述

-- 表關係
CREATE DATABASE db_day02_1;
USE db_day02_1;
-- 一對多
-- 班級表 主表
CREATE TABLE class(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(32)
);
-- 插入記錄
INSERT INTO class VALUES(1,'黑馬76期');
INSERT INTO class VALUES(2,'黑馬77期');