4.MySQL約束

DQL(查詢語句):

排序查詢
語法:order by 子句
order by 排序字段1 排序方式1, 排序字段2 排序方式2....
SELECT * FROM student ORDER BY math DESC;--降序排序

排序方式:
ASC:升序,默認的
DESC:降序
注意:如果有多個排序條件,則儅前邊的條件值一樣時,才會判斷第二條件
SELECT * FROM student ORDER BY math DESC,english DESC;

聚合函數:將一列數據作爲一個整體,進行縱向的計算
count:計算個數
一般選擇非空的列:主鍵
count(*)
max:計算最大值
min:計算最小值
sum:計算和
avg:計算平均值
注意:聚合函數的計算,排除null值
解決方案:
選擇不包含非空的列進行計算
IFNULL函數【IFNULL(可能爲null的字段,取代null的值)】如:IFNULL(score,0)
SELECT COUNT(IFNULL(english,0)) FROM student;

分組查詢
語法:group by 分組字段
注意:
分組之後查詢的字段:分組字段、聚合函數
where和having的區別:
where在分組之前進行限定,如果不滿足條件,則不參與分組。having在分組之後進行限定,如果不滿足結果,則不會被查詢出來。
where后不可以跟聚合函數,having可以進行聚合函數的判斷。
--按照性別分組。分別查詢男、女同學平均分
SELECT sex,AVG(math) FROM student GROUP BY sex;
--按照性別分組。分別查詢男、女同學平均分、人數
SELECT sex,AVG(math),COUNT(id) FROM student GROUP BY sex;
--按照性別分組。分別查詢男、女同學平均分、人數 要求:分數低於70分的人不參與分組
SELECT sex,AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;
--按照性別分組。分別查詢男、女同學平均分、人數 要求:分數低於70分的人不參與分組。人數要大於2個人
SELECT sex,AVG(math),COUNT(id) 人數 FROM student WHERE math > 70 GROUP BY sex HAVING 人數 > 2;

分頁查詢
語法:limit 開始的索引,每頁查詢的條數
公式:開始的索引 = (當前頁碼-1)* 每頁顯示的條數
--每頁顯示3條記錄
SELECT * FROM student LIMIT 0,3; -- 第1页
SELECT * FROM student LIMIT 3,3; -- 第2页
SELECT * FROM student LIMIT 6,3; -- 第3页

limit是一個MySQL“方言”

約束:
對表中的數據進行限定,保證數據的正確性、有效性和完整性。

分類:
主鍵約束:peimary key
非空約束:not null
唯一約束:unique
外鍵約束:foreign key

非空約束:not null,值不能為null
創建表時添加約束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name为非空
);

創建表完後,添加非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

刪除name的非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20);

唯一約束:unique,值不能重複
創建表時,添加唯一約束
CREATE TABLE stu(
id INT,
phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束
);

注意mysql中,唯一約束限定的列的值可以有多個null
刪除唯一約束
ALTER TABLE stu DROP INDEX phone_number;

在創建表,添加唯一約束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

主鍵約束:primary key
注意
含義:非空且唯一
一張表只能有一個字段為主鍵
主鍵就是表中記錄的唯一標識
在創建表時,添加主鍵約束
create table stu(
id int primary key,-- 给id添加主键约束
name varchar(20)
);

刪除主鍵
ALTER TABLE stu DROP PRIMARY KEY;

創建完表后,添加主鍵
ALTER TABLE stu MODIFY id INT PRIMARY KEY;

自動增長
概念:如果某一列是數值類型的,使用auto_increment可以來完成值得自動增長
在創建表時,添加主鍵約束,并且完成主鍵自增長
create table stu(
id int primary key auto_increment,-- 给id添加主键约束
name varchar(20)
);

刪除自動增長
ALTER TABLE stu MODIFY id INT;

添加自動增長
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

外鍵約束:foreign key,讓表與表產生關係,從而保證數據的正確性。
在創建表時,可以添加外鍵
create table 表名(
....
外键列
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);

create table employee(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
dep_id INT,--外鍵對應主表的主鍵
constraint emp_dep_fk foreign key (dep_id) references department(id)
);

刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;

創建表之後,添加外鍵
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

ALTER TABLE employee ADD CONSTRAINT emp_dep_fk foreign key (dep_id) references department(id);

級聯操作(謹慎使用)
添加級聯更新
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE employee ADD CONSTRAINT emp_dep_fk foreign key (dep_id) references department(id) ON UPDATE CASCADE ON DELETE CASCADE;

分類
級聯更新:ON UPDATE CASCADE
級聯刪除:ON DELETE CASCADE

數據庫設計:
多表之間的關係
分類
一對一:如人和身份證--一個人只有一個身份證,一個身份證只能對應一個人
一對多:如部門和員工--一個部門有多個員工,一個員工只能對應一個部門
多對多:如學生和課程--一個學生可以選擇很多課程,一個課程也可以被很多學生選擇
實現關係
一對多(多對一):在多的一方建立外鍵,指向一的一方的主鍵
多對多:多對多關係實現需要藉助第三張中間表。中間表至少包含兩個字段,這兩個字段作爲第三張表的外鍵,分別只想兩張表的主鍵
可以在任意一方添加唯一外鍵指向另一方的主鍵(得讓外鍵唯一--unique),一般合成一張表
案例
--創建旅游綫路分類表,tab_category
--cid旅游綫路分類主鍵,自動增長
--cname旅游綫路分類名稱非空,唯一
CREATE TABLE tab_category (
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(100) NOT NULL UNIQUE
);

--創建旅游綫路表,tab_route
--rid旅游綫路主鍵,自增長
--rname旅游綫路名稱非空,唯一
--peice價格
--rdate上架時間,日期類型
--cid外鍵,所屬分類
CREATE TABLE tab_route(
rid INT PRIMARY KEY AUTO_INCREMENT,
rname VARCHAR(100) NOT NULL UNIQUE,
price DOUBLE,
rdate DATE,
cid INT,
FOREIGN KEY (cid) REFERENCES tab_category(cid)
);

--创建用户表 tab_user
--uid 用户主键,自增长
--username 用户名长度 100,唯一,非空
--password 密码长度 30,非空
--name 真实姓名长度 100
--birthday 生日
--sex 性别,定长字符串 1
--telephone 手机号,字符串 11
--email 邮箱,字符串长度 100
CREATE TABLE tab_user (
uid INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100) UNIQUE NOT NULL,
PASSWORD VARCHAR(30) NOT NULL,
NAME VARCHAR(100),
birthday DATE,
sex CHAR(1) DEFAULT '男',
telephone VARCHAR(11),
email VARCHAR(100)
);

--創建收藏表,tab_favorite
--rid旅游綫路id,外鍵
--date收藏時間
--uid用戶id,外鍵
--rid和uid不能重複,設置複合主鍵,同一個用戶不能收藏同一條綫路兩次
CREATE TABLE tab_favorite (
rid INT, -- 线路id
DATE DATETIME,
uid INT, -- 用户id
-- 创建复合主键
PRIMARY KEY(rid,uid), -- 联合主键
FOREIGN KEY (rid) REFERENCES tab_route(rid),
FOREIGN KEY(uid) REFERENCES tab_user(uid)
);

數據庫設計的範式
概念:設計數據庫時,需要遵循的一些規範。要遵循後邊的範式要求,必須先遵循前邊的所有範式要求
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

分類(主要):
第一範式:每一列都是不可分割的原子數据項
第二範式:在1NF的基礎上,非碼屬性必須完全依賴於候選碼(在1NF基礎上消除非主屬性對主碼的部分依賴)
函數依賴:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
例如:学号-->姓名。 (学号,课程名称) --> 分数
完全函數依賴:A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
例如:(学号,课程名称) --> 分数
部分函數依賴:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
例如:(学号,课程名称) -- > 姓名
傳遞函數依賴:A-->B, B -- >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
例如:学号-->系名,系名-->系主任
碼:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
主属性:码属性组中的所有属性
非主属性:除过码属性组的属性
第三範式:在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

數據庫的備份和還原:
命令行:
語法:
備份:mysqldump -u用戶名 -p密碼 數據庫名稱 > 保存的路徑
還原:
登陸數據庫
創建數據庫
使用數據庫
執行文件--source 文件路徑
mysqldump -uroot -p123456 dn1 > d.//a.sql

mysql -uroot -p123456
show databases;
drop database db1;
show databases;
create database db1;
use db1;
source d://a.sql
show tables;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容

  • 数据库对于后端开发来说是必不可少所要用到的,而MySQL数据库是其中的主流之一,在中小型公司中使用的较为广泛,作为...
    Steven_SHH阅读 1,461评论 0 2
  • 一、MySQL基础 数据库的基本概念 数据库的英文单词: DataBase 简称 : DB 什么数据库?用于存储和...
    wdx0000阅读 319评论 0 0
  • MySQL笔记 一、前期准备 SQL语句分类DQL - 数据查询语言 --> 查询语句,select 语句都是DQ...
    你练不练硬笔啊阅读 340评论 0 1
  • 複雜的資料處理可以讀出來使用pandas處理後存回SQL。 安裝及基本操作 安裝 載點:windows下載安裝程式...
    RJ阿杰阅读 354评论 0 0
  • ubuntu启动mysql、停止mysql、重置mysql服务: sudo service mysql start...
    dream_seeker阅读 259评论 0 0