MySQL单表操作约束
目录
- 准备数据
- 单表操作
- 排序
- 聚合函数
- 常用的聚合函数
- SQL实现
- 分组查询
- limit关键字
- SQL约束
- 主键约束
- 添加主键约束
- 删除主键约束
- 主键自增
- 修改主键自增起始值
- DELETE 和 TRUNCATE 对主键自增的影响
- 非空约束
- 唯一约束
- 外键约束
- 默认值
准备数据
#创建员工表
表名 emp
表中字段:
eid 员工id,int
ename 姓名,varchar
sex 性别,char
salary 薪资,double
hire_date 入职时间,date
dept_name 部门名称,varchar#创建员工表
CREATE TABLE emp(eid INT,ename VARCHAR(20),sex CHAR(1),salary DOUBLE,hire_date DATE,dept_name VARCHAR(20)
);#添加数据
INSERT INTO emp VALUES(1,'孙悟空','男',7200,'2013-02-04','教学部');
INSERT INTO emp VALUES(2,'猪八戒','男',3600,'2010-12-02','教学部');
INSERT INTO emp VALUES(3,'唐僧','男',9000,'2008-08-08','教学部');
INSERT INTO emp VALUES(4,'白骨精','女',5000,'2015-10-07','市场部');
INSERT INTO emp VALUES(5,'蜘蛛精','女',5000,'2011-03-14','市场部');
INSERT INTO emp VALUES(6,'玉兔精','女',200,'2000-03-14','市场部');
INSERT INTO emp VALUES(7,'林黛玉','女',10000,'2019-10-07','财务部');
INSERT INTO emp VALUES(8,'黄蓉','女',3500,'2011-09-14','财务部');
INSERT INTO emp VALUES(9,'吴承恩','男',20000,'2000-03-14',NULL);
INSERT INTO emp VALUES(10,'孙悟饭','男', 10,'2020-03-14','财务部');
INSERT INTO emp VALUES(11,'兔八哥','女', 300,'2010-03-14','财务部');
单表操作
排序
通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示效果,不会影响真实数据)
语法结构:select 字段名 from 表名 [where 字段名 = 值] order by 字段名称 [asc/desc]
- ASC 升序排序(默认升序)
- DESC 降序排序
1) 单列排序 :按照某一个字段进行排序
SELECT * FROM emp ORDER BY salary; -- 默认升序排序
SELECT * FROM emp ORDER BY salary DESC; -- 降序排序
2)组合排序:同时对多个字段进行排序
-- 在薪水排序的基础上,再使用id进行排序, 如果薪水相同就以id 做降序排序
SELECT * FROM emp ORDER BY salary DESC,eid DESC;
组合排序的特点
:如果第一个字段值相同,就按照第二个字段进行排序
聚合函数
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵
向查询,它是对某一列的值进行计算,然后返回一个单一的值(另外聚合函数会忽略null空值。)
简单来说就是,将一列数据作为一个整体,进行纵向的计算
语法结构: select 聚合函数(字段名) from 表名 [where 条件]
常用的聚合函数
聚合函数 | 作用 |
---|---|
count(字段) | 统计记录数 |
sum(字段) | 求和操作 |
max(字段) | 求最大值 |
min(字段) | 求最小值 |
avg(字段) | 求平均值 |
SQL实现
# 1.查询员工的总数
SELECT COUNT(*) FROM emp;
SELECT COUNT(1) FROM emp;
SELECT COUNT(eid) FROM emp;
-- count 函数在统计的时候会忽略空值,所以不要使用含空值的列# 2.查看员工总薪水、最高薪水、最小薪水、薪水的平均值
SELECT SUM(salary) '总薪水',MAX(salary) '最高薪水',MIN(salary) '最低薪水',AVG(salary) '平均值'
FROM emp;# 3.查询薪水大于4000员工的个数
SELECT COUNT(*) FROM emp WHERE salary > 4000;# 4.查询部门为'教学部'的所有员工的个数
SELECT COUNT(*) FROM emp WHERE dept_name = '教学部';# 5.查询部门为'市场部'所有员工的平均薪水
SELECT AVG(salary) FROM emp WHERE dept_name = '市场部';
分组查询
分组查询指的是使用 GROUP BY 语句,对查询的信息进行分组,相同数据作为一组
语法结构: select 分组字段/聚合函数 from 表名 group by 分组字段
分组目的: 是为了做统计操作,一般分组会和聚合函数一起使用,另外查询的时候要查询分组字段。
需求:通过性别字段进行分组,求各组的平均薪资
SELECT sex 性别,AVG(salary) FROM emp GROUP BY sex;
#1.查询所有部门信息
SELECT dept_name AS '部门名称' FROM emp GROUP BY dept_name;#2.查询每个部门的平均薪资
SELECT dept_name,AVG(salary) FROM emp GROUP BY dept_name;#3.查询每个部门的平均薪资, 部门名称不能为null
SELECT dept_name,AVG(salary) FROM emp WHERE dept_name IS NOT NULL GROUP BY dept_name;
需求:查询平均薪资大于6000的部门
# 查询平均薪资大于6000的部门
-- 1. 首先分组求出平均薪资
-- 2. 求出 平均薪资大于6000的部门-- 在分组之后,进行条件过滤,我们使用 having 条件
SELECT dept_name,AVG(salary)
FROM emp
WHERE dept_name IS NOT NULL GROUP BY dept_name
HAVING AVG(salary) > 6000;
where 和having 的区别
- where
- 在分组前进行过滤
- where后面不能跟聚合函数
- having
- 在分组后进行过滤
- having后面可以写聚合函数
limit关键字
limit是限制的意思,用于限制返回的查询结果的行数
语法结构: select 字段 from 表名 limit offset,length;
参数说明:
offset:起始行数,默认从0开始
length:返回的行数,即要查询几条数据
需求:
查询emp表中的前 5条数据
查询emp表中 从第4条开始,查询6条
SQL实现
# 查询emp表中的前 5条数据
SELECT * FROM emp LIMIT 0,5;
SELECT * FROM emp LIMIT 5;
# 查询emp表中 从第4条开始,查询6条
SELECT * FROM emp LIMIT 3,6;
需求: 分页操作
SQL实现
-- limit 分页操作,每一页显示3条数据
SELECT * FROM emp LIMIT 0,3; -- 第一页
SELECT * FROM emp LIMIT 3,3; -- 第二页 -- 分页公式:起始行数 = (当前页码 - 1) * 每一页显示条数
SQL约束
约束是对数据进行一定的限制,来保证数据的完整性,有效性以及正确性,违反约束的错误数据,将无法插入到表中。
常见的约束:
约束名 | 关键字 |
---|---|
主键约束 | primary key |
唯一约束 | unique |
非空约束 | not null |
外键约束 | foreign key |
主键约束
特点: 不可重复、唯一、非空
作用: 用来表示数据库中的每一条记录
添加主键约束
语法格式:字段名 字段类型 primary key
需求:创建一个带有主键的表
-- 方式一:
CREATE TABLE stu(sid INT PRIMARY KEY,sname VARCHAR(20),sex CHAR(1)
);-- 方式二:
CREATE TABLE stu(sid INT,sname VARCHAR(20),sex CHAR(1),PRIMARY KEY(sid) -- 指定sid为主键
);-- 方式三:创建表之后,在添加主键
CREATE TABLE stu(sid INT,sname VARCHAR(20),sex CHAR(1)
);
-- 通过DDL语句,添加主键约束
ALTER TABLE stu MODIFY sid INT PRIMARY KEY;
ALTER TABLE stu ADD PRIMARY KEY(sid);
desc 查看表结构
DESC stu;
测试主键的唯一性和非空性
# 正常插入一条数据
INSERT INTO stu VALUES(1,'tom','男');# 插入一条数据,主键为空
INSERT INTO stu VALUES(NULL,'lucy','男');
-- Column 'sid' cannot be null 主键不能为空# 插入一条数据,主键为1
INSERT INTO stu VALUES(1,'jerry','男');
-- Duplicate entry '1' for key 'stu.PRIMARY' 主键重复
- 哪些字段可以作为主键 ?
- 通常针对业务去设计主键,每张表都设计一个主键id
- 主键是给数据库和程序使用的,只要能够保证不重复就好,比如:身份证就可以作为主键
删除主键约束
-- 删除主键
ALTER TABLE stu DROP PRIMARY KEY;
主键自增
主键自增 :auto_increment 表示自动增长,字段类型必须为整型
- 创建一张主键自动递增的表
-- 创建一张主键自动递增的表
CREATE TABLE stu(sid INT PRIMARY KEY AUTO_INCREMENT,sname VARCHAR(20),sex CHAR(1)
);
- 插入数据,观察主键的自增
INSERT INTO stu(sname,sex) VALUES('tom','男');
INSERT INTO stu(sname,sex) VALUES('lucy','男');
INSERT INTO stu VALUES(NULL,'jerry','男');
INSERT INTO stu VALUES(NULL,'lily','女');
注意:
通过观察发现,主键的值是从 1 开始自增的,然后每次加 1 。那么能不能修改,或者设置主键自增的起始值呢?
修改主键自增起始值
默认的 AUTO_INCREMENT 的开始值是 1,如果希望修改起始值,修改方式如下:
- 重新创建一张表
CREATE TABLE stu(sid INT PRIMARY KEY AUTO_INCREMENT,sname VARCHAR(20),sex CHAR(1)
)AUTO_INCREMENT=100;
- 插入数据,观察主键起始值
INSERT INTO stu(sname,sex) VALUES('tom','男');
INSERT INTO stu(sname,sex) VALUES('lucy','男');
INSERT INTO stu VALUES(NULL,'jerry','男');
INSERT INTO stu VALUES(NULL,'lily','女');
DELETE 和 TRUNCATE 对主键自增的影响
删除表中所有数据
- delete删除表中所有数据,将表中的数据逐条删除
- truncate 删除表中所有数据,先删除整张表,再创建一个结构相同的表
方式一: delete
- 删除表中所有数据
-- delete 方式删除表中所有数据
DELETE FROM stu; -- 删除对自增没有影响
- 插入数据,观察主键
INSERT INTO stu(sname,sex) VALUES('tom','男');
INSERT INTO stu(sname,sex) VALUES('lucy','男');
INSERT INTO stu VALUES(NULL,'jerry','男');
INSERT INTO stu VALUES(NULL,'lily','女');
方式二: truncate
-- truncate 方式删除表中所有数据
TRUNCATE TABLE stu;-- 自增从 1 开始
非空约束
数据表中的某一列不能为空
语法格式: 字段名 字段类型 not null
- 创建一个emp表,给ename添加非空约束
CREATE TABLE emp(eid INT PRIMARY KEY,-- 这里是指名字不能为空ename VARCHAR(20) NOT NULL,sex CHAR(1)
);
- 测试
INSERT INTO emp VALUES(1,'jerry','男');
-- 插入成功
INSERT INTO emp VALUES(2,NULL,'女');
-- Column 'ename' cannot be null 名字不能为空
唯一约束
表中的某一列不能够重复(对null值 不做唯一判断)
语法格式: 字段名 字段类型 unique
- 创建一张表,设置给ename添加唯一约束
CREATE TABLE emp2(eid INT PRIMARY KEY,-- 这里是指名字唯一,不能重复ename VARCHAR(20) UNIQUE,sex CHAR(1)
);
- 测试
INSERT INTO emp2 VALUES(1,'jerry','男');
-- 插入成功
INSERT INTO emp2 VALUES(2,'jerry','女');
-- Duplicate entry 'jerry' for key 'emp2.ename' 名字重复,插入失败
主键约束和唯一约束的区别
- 主键约束,唯一且不能为空
- 唯一约束,唯一但可以为空
- 一个表中只能有一个主键,但可以有多个唯一约束
外键约束
空
默认值
用来指定某一列的默认值
语法格式: 字段名 字段类型 default 默认值
- 创建emp表,给sex添加默认值为’男’
CREATE TABLE emp1(eid INT PRIMARY KEY,ename VARCHAR(20),sex CHAR(1) DEFAULT '男'
);
- 测试
-- 添加数据,使用默认值
INSERT INTO emp1(eid,ename) VALUES(1,'tom'); -- 插入成功-- 不使用默认值
INSERT INTO emp1(eid,ename,sex) VALUES(2,'jerry','女'); -- 插入成功
MySQL单表操作约束相关推荐
- mysql单表操作_mysql单表操作
mysql记录操作 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DEL ...
- mysql单表操作_深入学习之mysql(三)单表操作
1.创建表的结构和数据 CREATE TABLE `t_student`( `id` INT PRIMARY KEY, `stuName` VARCHAR(10) NOT NULL, `age` IN ...
- 95.第十九章 MySQL数据库 -- 单表操作(五)
3.7 DQL语句 3.7.1 单表操作 官方帮助:https://dev.mysql.com/doc/refman/8.0/en/select.html 语法: SELECT[ALL | DISTI ...
- MySQL数据库 第5章:单表操作
MySQL数据库 第5章:单表操作 5.1 数据操作 5.1.1 复制表结构和数据 5.1.2 解决主键冲突 5.1.3 清空数据 5.1.4 去除重复记录 5.2 排序与限量 5.2.1 排序 5. ...
- python代码函数字符查询宝典书籍_Django基础五之django模型层(一)单表操作
二 单表操作 一.创建表 创建模型 创建名为book的app,在book下的models.py中创建模型: from django.db importmodels#Create your models ...
- Django-5.1 模型层 单表操作
7.1 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开 ...
- django系列5.2--ORM数据库的单表操作
单表操作 在views.py中添加对数据库的操作语句 #在逻辑代码中导入你要操作的表 from app import modelsdef add_book(request):'''添加表记录:para ...
- mysql 单表关联_MySQL 基础之 单表、多表联查
使用和不使用not null 的区别: 不使用: 查询时用'name is null' 作为条件 mysql>create table t8( -> id int auto_increme ...
- Django框架——模型层单表操作、模型层多表操作、模型层常用和非常用字段和参数、模型层进阶
文章目录 1 模型层-单表操作 一 ORM简介 二 单表操作 2.1 创建表 1 创建模型 2 更多字段 3 更多参数 4 settings配置 5 增加,删除字段 2.2 添加表纪录 2.3 查询表 ...
最新文章
- 第十次课:前台首页设计及显示商品信息
- GlusterFS的安装及使用
- Python通过future处理并发
- JavaScript——面向对象之继承(原型对象)与多态(重载、重写)
- C++类型转换实现不同类型相加【复数与double类型相加】
- 【Sublime Text 3】Sublime Text 3 - cracked 3092
- Rari Capital于路印L2启动三池流动性挖矿
- 关于php变量的赋值和引用的区别
- CentOS 上MySQL报错Can't connect to local Mysql server through socket '/tmp/mysql.scok' (111)
- 网吧服务器维护工具,某某网吧专用维护工具(网吧维护管理助手)V5.1 最新版
- 对称加密算法和非对称加密算法
- 黑盒测试---等价类划分
- Dharma勒索病毒变种 ---加密后文件后缀.bkpx
- 数据库一条insert插入多条记录
- java解析json天气api,免费天气API,全国天气 JSON API接口,可以获取五天的天气预报...
- 【解决方案】VS2013外部工具中添加ildasm.exe
- Spring整合Kafka
- 数学建模学习(1) 线性规划
- 网易传媒全新知识短视频内容消费品牌网易新闻“知识公路”正式发布
- HAUE河工计院OJ1100 - 1150题解