MySQL的列约束
1.列约束
(1)主键约束——PRIMARY KEY
(2)非空约束——NOT NULL
声明了非空约束的列上,不允许使用NULL
(3)唯一约束——UNIQUE
声明了唯一约束的列上不能插入重复的值,允许插入NULL,而且允许插入多个NULL
(4)默认值约束——DEFAULT
可以使用DEFAULT关键字声明默认值,有两种使用方式
INSERT INTO laptop VALUES(1, DEFAULT,…);
INSERT INTO laptop(lid,price) VALUES(2,3000); 给特定的列插入值,其它的列全部使用默认值
练习:设置笔记本分类表中,笔记本的数量默认值为1,使用两种方式插入数据。
(5)检查约束——CHECK
检查约束可以对插入的数据进行自定义的验证
CREATE TABLE student(
score TINYINT CHECK(score>=0 AND score<=100)
);
Mysql不支持检查约束,会降低数据的插入速度
(6)外键约束——FOREIGN KEY
声明了外键约束的列上,取值必须在另一个表主键列上出现过,两者的列类型保持一致,允许使用NULL。
FOREIGN KEY(列) REFERENCES 数据表(主键列)
2.自增列
AUTO_INCREMENT: 自动增长,假如一个列声明了自增列,无需手动赋值,赋值为NULL,会自动获取当前的最大值,然后加1插入。
注意事项:
只适用于整数型的主键列
允许手动赋值
练习:编写脚本文件01_tedu.sql,创建数据库tedu,进入该数据库
创建保存部门数据的表dept,包含(did, dname)
10 研发部 20 市场部 30 运营部 40 测试部
创建保存员工数据的表emp,包含(eid,ename,sex,birthday,salary工资,deptId 所属部门编号)
插入15条数据
3.简单查询
(1)查询特定的列
示例: 查询所有员工的姓名、性别
SELECT ename,sex FROM emp;
练习: 查询所有员工的编号、姓名、生日、工资
SELECT eid,ename,birthday, salary FROM emp;
(2)查询所有的列
SELECT * FROM emp;
SELECT eid,ename,sex,birthday,salary,deptId FROM emp;
(3)给列起别名
示例:查询所有员工的姓名和工资,使用汉字别名
SELECT ename AS 姓名,salary AS 工资 FROM emp;
练习:查询所有员工的编号,姓名,性别,生日,使用汉字别名
SELECT eid AS 编号,ename AS 姓名,sex 性别,birthday 生日 FROM emp;
练习:查询所有员工的编号和姓名,使用一个字母别名
SELECT eid a,ename b FROM emp;
在起别名的时候,AS关键字是可以省略的,保留空格 |
(4)显示不同的记录/合并相同的项
示例:查询出公司都有哪些性别的员工
SELECT DISTINCT sex FROM emp;
练习:查询出员工都分布在哪些部门
SELECT DISTINCT deptId FROM emp;
(5)查询时执行计算
示例:2+3-5*4.2/8.8+13
SELECT 2+3-5*4.2/8.8+13;
练习:查询所有员工的姓名及其年薪
SELECT ename,salary*12 FROM emp;
练习:假如每个员工的工资增加500,年终奖5000,查询出所有员工的姓名及其年薪,给列使用汉字别名。
SELECT ename 姓名,(salary+500)*12+5000 年薪 FROM emp;
(6)查询结果集排序
示例:查询所有的部门,结果集按照部门编号升序排列
SELECT * FROM dept ORDER BY did ASC; #ascendant
示例:查询所有的部门,结果集按照部门编号降序排列
SELECT * FROM dept ORDER BY did DESC;#descendant
练习:查询所有的员工,结果集按照工资降序排列
SELECT * FROM emp ORDER BY salary DESC;
练习:查询所有的员工,结果集按照工资升序排序
SELECT * FROM emp ORDER BY salary ASC;
练习:查询所有的员工,结果集按照年龄从小到大排序
SELECT * FROM emp ORDER BY birthday DESC;
练习:查询所有的员工,结果集按照姓名升序排序
SELECT * FROM emp ORDER BY ename;
练习:查询所有的员工,结果集按照工资降序排列,如果工资相同,按照姓名排序
SELECT * FROM emp ORDER BY salary DESC,ename;
练习:查询所有的员工,结果集按照性别升序排列,如果性别相同,按照生日降序排列
SELECT * FROM emp ORDER BY sex,birthday DESC;
ORDER BY 可以按照数值、日期时间、字符串排序 默认是升序排列(ASC) |
(7)条件查询
示例:查询出编号为5的员工
SELECT * FROM emp WHERE eid=5;
练习:查询出姓名为King的员工的编号,姓名,生日,工资
SELECT eid,ename,birthday,salary FROM emp WHERE ename='king';
练习:查询出20号部门下的员工,结果集按照工资降序排列
SELECT * FROM emp WHERE deptId=20 ORDER BY salary DESC;
练习:查询工资在5000以上的员工有哪些
SELECT * FROM emp WHERE salary>=5000;
比较运算符:> < >= >= = !=(不等于) |
练习:查询出1991-1-1后出生的员工有哪些
SELECT * FROM emp WHERE birthday>'1991-1-1';
练习:查询出不在10号部门的员工有哪些
SELECT * FROM emp WHERE deptId!=10;
练习:查询出没有明确部门的员工
SELECT * FROM emp WHERE deptId IS NULL;
练习:查询出有明确部门的员工
SELECT * FROM emp WHERE deptId IS NOT NULL;
练习:查询出工资在6000以上的男员工有哪些
SELECT * FROM emp WHERE salary>=6000 AND sex=1;
练习:查询出工资在6000以上和8000以下的所有员工
SELECT * FROM emp WHERE salary>=6000 AND salary<=8000;
SELECT * FROM emp WHERE salary BETWEEN 6000 AND 8000;
练习:查询出工资在6000以下以及8000以上的员工 OR
SELECT * FROM emp WHERE salary<6000 OR salary>8000;
SELECT * FROM emp WHERE salary NOT BETWEEN 6000 AND 8000;
练习:查询出1990年之前以及1993年之后出生的员工
SELECT * FROM emp WHERE birthday<'1990-1-1' OR birthday>'1993-12-31';
SELECT * FROM emp WHERE birthday NOT BETWEEN '1990-1-1' AND '1993-12-31';
练习:查询出1993年出生的员工有哪些
SELECT * FROM emp WHERE birthday>='1993-1-1' AND birthday<='1993-12-31';
SELECT * FROM emp WHERE birthday BETWEEN '1993-1-1' AND '1993-12-31';
练习:查询出20号和30号部门的员工有哪些
SELECT * FROM emp WHERE deptId=20 OR deptId=30;
SELECT * FROM emp WHERE deptId IN(20,30);
练习:查询出不在20号和30号部门的员工
SELECT * FROM emp WHERE deptId NOT IN(20,30);
WHERE AND / OR (NOT) BETWEEN AND IS (NOT) NULL (NOT) IN() |
(8)模糊条件查询
示例:查询出姓名中含有字母e的员工
SELECT * FROM emp WHERE ename LIKE '%e%';
练习:查询出姓名中以e结尾的员工
SELECT * FROM emp WHERE ename LIKE '%e';
练习:查询出姓名中倒数第2个字符为e的员工
SELECT * FROM emp WHERE ename LIKE '%e_';
% 任意多个字符 >=0 _ 任意一个字符 =1 以上两个字符要结合LIKE关键字使用 |
(9)分页查询
假如查询的结果集有太多的数据,一次显示不完,可以分页显示。
需要有两个条件:当前的页码、每页的数据量
开始的值 = (当前的页码-1)*每页的数据量 |
SELECT * FROM emp LIMIT start,count;
start: 开始的值
count: 每页的数据量
假如每页显示5条记录
第1页:SELECT * FROM emp LIMIT 0,5;
第2页:SELECT * FROM emp LIMIT 5,5;
第3页:SELECT * FROM emp LIMIT 10,5;
第4页:SELECT * FROM emp LIMIT 15,5;
第5页:SELECT * FROM emp LIMIT 20,5;
练习:假如每页显示6条记录,写出查询前3页的SQL语句
SELECT * FROM emp LIMIT 0,6;
SELECT * FROM emp LIMIT 6,6;
SELECT * FROM emp LIMIT 12,6;
注意: LIMIT后的两个值必须是数值型。
二.复合查询
(1)聚合查询/分组查询
示例:查询出所有员工的数量
SELECT COUNT(eid) FROM emp;
使用员工的部门编号计算员工数量
SELECT COUNT(deptId) FROM emp;
SELECT COUNT(*) FROM emp; #推荐写法
聚合函数 函数:是一个功能体,提供若干个数据,产出结果。——饺子机 COUNT总数量/SUM总和/AVG平均/MAX最大/MIN最小 |
练习:计算所有员工的工资总和
SELECT SUM(salary) FROM emp;
练习:查询出男员工的平均工资
SELECT SUM(salary)/COUNT(*) FROM emp WHERE sex=1;
SELECT AVG(salary) FROM emp WHERE sex=1;
练习:查询出女员工最高工资是多少
SELECT MAX(salary) FROM emp WHERE sex=0;
练习:查询出男员工最低工资是多少
SELECT MIN(salary) FROM emp WHERE sex=1;
分组查询:只能查询分组条件和聚合函数 |
示例:查询出男女员工的最高工资
SELECT sex,MAX(salary) FROM emp GROUP BY sex;
练习:查询出每个部门年龄最大的人和年龄最小的人
SELECT deptId,MIN(birthday),MAX(birthday) FROM emp GROUP BY deptId;
year() 获取日期中的年份 month() 获取日期中的月份 |
练习:查询出1991年出生的员工有哪些
SELECT * FROM emp WHERE YEAR(birthday)=1991;
练习:查询出3月份出生的员工有哪些
SELECT * FROM emp WHERE MONTH(birthday)=3;
(2)子查询
把一个SQL语句的结果作为另一个SQL语句的查询条件 |
示例: 查询出研发部所有的员工有哪些
步骤1: 查询出研发部的部门编号——10
SELECT did FROM dept WHERE dname='研发部';
步骤2:查询出研发部的员工
SELECT * FROM emp WHERE deptId=10;
综合:
SELECT * FROM emp WHERE deptId=( SELECT did FROM dept WHERE dname='研发部');
练习:查询出比tom工资高的员工有哪些
步骤1:查询出tom的工资——6000
SELECT salary FROM emp WHERE ename='tom';
步骤2:查询出工资比tom高的员工
SELECT * FROM emp WHERE salary>6000;
综合:
SELECT * FROM emp WHERE salary>( SELECT salary FROM emp WHERE ename='tom');
练习:查询出和tom同一年出生的员工有哪些
步骤1:获取tom的年份——1990
SELECT YEAR(birthday) FROM emp WHERE ename='tom';
步骤2:查询1990年出生的员工
SELECT * FROM emp WHERE YEAR(birthday)=1990;
综合:
SELECT * FROM emp WHERE YEAR(birthday)=(
SELECT YEAR(birthday) FROM emp WHERE ename='tom'
);
(3)多表查询
示例:查询出所有的员工姓名及其部门名称
SELECT ename,dname FROM emp,dept;
产生:笛卡尔积
解决方法:添加查询条件
SELECT ename,dname FROM emp,dept WHERE deptId=did;
无法查询出没有部门的员工,也无法查询出没有员工的部门 |
MySQL的列约束的更多相关文章
- MySQL学习笔记——约束
1.约束是在表上强制执行的数据检验规则,约束主要用于保证数据库的完整性. 2.当表中数据有相互依赖性时,可以保护相关的数据不被删除. 3.大部分数据库支持下面五类完整性约束: - NOT NULL非空 ...
- mysql 加入列,改动列,删除列。
MySQL 加入列,改动列,删除列 ALTER TABLE:加入,改动,删除表的列,约束等表的定义. 查看列:desc 表名; 改动表名:alter table t_book rename to bb ...
- MySQL之外键约束
MySQL之外键约束 MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束.InnoDB中外键约束定义的语法如下: [CONSTRAINT [symbo ...
- Mysql表的约束设计和关联关系设计
https://blog.csdn.net/u012750578/article/details/15026677 Mysql表的约束设计和关联关系设计 ======================表 ...
- mysql 外键约束及表关联
一.MYSQL中的约束 1.主键:primary key 唯一非空的特性并且可以优化查询速度 2.外键:foreign key 外键的作用保证2个或2个以上的数据表的数据一致性和完整性 3.唯一:un ...
- MySql中的约束
mysql中的约束使用和oracle使用差别不大. 1.主键约束 如同人对应身份证,主键能够唯一地标识表中的一条记录,可以结合外键来定义数据表之间的关系. 主键约束要求主键列的数据唯一,并且不允许为空 ...
- 数据库-SQL语句:删除和修改语句-列类型-列约束
使用MySQL客户端连接服务器的两种方式: (1)交互模式: ——查 mysql.exe -h127.0.0.1 -uroot -p mysql -uroot (2)脚本模式:——增删改 m ...
- 一、TCL事务控制语言 二、MySQL中的约束 三、多表查询(重点) 四、用户的创建和授权 五、MySQL中的索引
一.TCL事务控制语言###<1>事务的概念 事务是访问并可能更新数据库中各种数据项的执行单元. 事务是一条SQL语句,一组SQL语句,或者整个程序. 事务是恢复和并发控制的基本单位. 事 ...
- mysql FOREIGN KEY约束 语法
mysql FOREIGN KEY约束 语法 作用:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY. DD马达 说明:FOREIGN KEY 约束用于预防破坏表之间连接的 ...
随机推荐
- ubuntu下载速度慢的解决办法--修改下载源
操作:https://blog.csdn.net/qq_24326765/article/details/81916222 推荐源:https://blog.csdn.net/qq_36328643/ ...
- tp5--路由的使用方法(深入)
懒得写注释,直接上代码 配置文件Route: <?php use think\Route; //tp5路由测试 //动态注册 //Route::rule('路由表达式','路由地址','请求类型 ...
- curl的$post传递多维数组
php curl传数组的话只能传一维数组,如果想传多维数组:两个方法: 1.转换成json在传输 2. //通过curl模拟post的请求: function SendDataByCurl($url, ...
- MarkDown排版测试
1.标题设置 标题(大标题) 标题(小标题) 标题(一级标题) 标题( 二级标题) 标题(三级标题) 标题(四级标题) 备注:大标题与一级标题一样,小标题与二级标题一样,"#"前无 ...
- Winsock select server 与 client 示例代码
参考 https://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancediomethod5.html ...
- MySQL不同存储引擎下optimize的用法
optimize命令是mysql的常用优化命令,但是在InnoDB与MyISAM这两个存储引擎中却有很大的分别.本文将对这两个常用的存储引擎进行区分跟实例解析 1.查看mysql当前的存储引擎 一般情 ...
- UDT的Sender和Receiver
Sender算法 数据结构和变量: Sender's Loss List:发送方的loss list用来存储丢失包的序列号,序列号来自于两个地方,一是receiver通过NAK包反馈回来,二是超时事件 ...
- USACO Training Section 1.2 挤牛奶Milking Cows
题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民在1500秒开 ...
- 数学--数论--HDU1576 A / B(逆元)
问题描述 要求(A / B)%9973,但由于A很大,我们只被告知n(n = A%9973)(我们给定的A必能被B整除,且gcd(B,9973)= 1). 输入项 数据的第一行是一个T,表示有T组数据 ...
- 解决json字符串转为对象时LocalDateTime异常问题
1 出现异常 这次的异常出现在前端向后端发送请求体里带了两个日期,在后端的实体类中,这两个日期的格式都是JDK8中的时间类LocalDateTime.默认情况下,LocalDateTime只能解析20 ...