MySQL的约束、多表查询、子查询
一、约束之主键约束
约束:约束是添加在列上的,用来约束列的。
1、主键约束(唯一标识):非空、唯一、被引用
- 当表的某一列被指定为主键后,该类就不能为空,不能有重复值出现
- 创建表时指定主键的两种方式:
- CREATE TABLE stu(
- sid CHAR(6) PRIMARY KEY,
- sname VARCHAR(20),
- age INT,
- sex VARCHEAR(10)
- );
- CREATE TABLE stu(
- sid CHAR(6) ,
- sname VARCHAR(20),
- age INT,
- sex VARCHEAR(10),
- PRIMARY KEY(sid)
- );
指定sid列为主键列,即为sid列添加主键约束
- 修改表时指定主键:
ALTER TABLE stu ADD PRIMARY KEY(sid);
- 删除主键:
ALTER TABLE stu DROP PRIMARY KEY;
2、主键自增长
- 因为主键列的特性是:必须唯一,不能为空,所以我们通常会指定主键为整型,然后设置其自动增长,这样可以保证在插入数据时主键列的唯一和非空特性。
- 创建表时指定主键自增长
- CREATE TABLE stu(
- sid INT PRIMARY KEY AUTO_INCREMENT,
- sname VARCHAR(20),
- age INT,
- sex VARCHEAR(10)
- );
- 修改表时设置主键自增长:
ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
- 修改表时删除主键自增长:
ALTER TABLE stu CHANGE sid sid INT ;
- 测试主键自增长:
INSERT INTO stu VALUES(NULL,'zhangsan',23,'man');
INSERT INTO stu(sname,age,sex) VALUES(NULL,'zhangsan',23,'man');
3、非空约束
因为某些列不能设置为null值,所以可以对添加非空约束。
例如:
- CREATE TABLE stu (
- sid INT PRIMARY KEY AUTO_INCREMENT,
- sname VARCHAR(20) NOT NULL,
- age INT,
- sex VARCHAR(10)
- );
对sname列设置了非空约束。
4、唯一约束
车库某些列不能设置重复的值,所以可以对列添加唯一约束。
例如:
- CREATE TABLE stu (
- sid INT PRIMARY KEY AUTO_INCREMENT,
- sname VARCHAR(20) NOT NULL UNIQUE,
- age INT,
- sex VARCHAR(10)
- );
二、概念模型
1、对象模型:在Java中是domain ,例如:User、Student .
2、关系模型:在数据库中表,1对多,1对1,多对多。
三、外键约束
- 外键必须是另一表的主键的值(外键要引用主键。)
- 外键可以重复
- 外键可以为空
1、创建时添加外键约束
- CREATE TABLE dept (
- deptno INT PRIMARY KEY AUTO_INCREMENT,
- dname VARCHAR(50)
- );
- insert into dept values(10,'研发部');
- insert into dept values(20,'人力部');
- insert into dept values(30,'财务部');
- CREATE TABLE emp (
- empno INT PRIMARY KEY AUTO_INCREMENT,
- ename VARCHAR(50),
- deptno INT,
- CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno)
- );
- CREATE TABLE dept (
- deptno INT PRIMARY KEY AUTO_INCREMENT,
- dname VARCHAR(50)
- );
- INSERT INTO dept VALUES(10,'研发部');
- INSERT INTO dept VALUES(20,'人力部');
- INSERT INTO dept VALUES(30,'财务部');
- INSERT INTO emp(empno,ename) VALUES(null,'zhangsan');
- INSERT INTO emp(empno,ename,deptno) VALUES(null,'lisi',10);
- INSERT INTO emp(empno,ename,deptno) VALUES(null,'zhangsan',80);
- /* Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails
- (`mydb2`.`emp`, CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`))
- */
2、修改表时添加外键约束:
- alter table t_student1 add constraint 外键名 foreign key(作为外键的列名) references t_class1(主键列名);
- ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERNCES dept(deptno);
3、删除外键约束语法
- -- MySql 语法
- alter table t_student1 drop foreign key 外键名;
四、数据库关系模型
1、一对一关系
在表中建立一对一关系比较特殊,需要让其中一张表的主键,即是主键又是外键。
- CREATE TABLE hasband (
- hid INT PRIMARY KEY AUTO_INCREMENT,
- hname VARCHAR(50)
- );
- CREATE TABLE wife (
- wid INT PRIMARY KEY AUTO_INCREMENT,
- wname VARCHAR(50),
- CONSTRAINT fk_wife_hasband FOREIGN KEY (wid) REFERENCES hasband(hid)
- );
2、多对多关系
在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两张表的主键。
- CREATE TABLE student (
- sid INT PRIMARY KEY ,
- ......
- );
- CREATE TABLE teacher(
- tid INT PRIMARY KEY ,
- ......
- );
- CREATE TABLE stu_tea (
- sid INT,
- tid INT,
- ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY (sid) REFERENCES student(sid) ,
- ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY (tid) REFERENCES teacher(tid)
- );
在中间表中建立关系,如:
INSERT INTO stu_tea VALUES(5,1);
INSERT INTO stu_tea VALUES(2,2);
INSERT INTO stu_tea VALUES(3,2);
五、多表查询
1、分类
- 合并结果集
- 连接查询
- 子查询
2、合并结果查询
- 要求被合并表中,结果集列的类型和列数相同
- UNION,去除重复行
- UNION ALL,不去除重复行
SELECT * FROM 表1名
UNION ALL
SELECT * FROM 表2名;
3、连接查询
①分类
- 内连接
- 外连接
- 左外连接
- 右外连接
- 全外连接(mysql不支持)
- 自然连接(属于一种简化方式)
②内连接
- 方言:SELECT * FROM 表1 别名1,表2 别名2 WHERE 别名1.xx=别名2.xx;
SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;
SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno;
以条件筛选去除笛卡尔积中无用的信息。
- 标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
SELECT e.ename, e.sal , d.dname FROM emp e INNER JOIN dept d ON e.deptno=d.deptno;
- 自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2 ;
SELECT e.ename, e.sal , d.dname FROM emp e NATURAL JOIN dept d;
- 内连接查询出的所有记录都满足条件
③外连接
- 左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
- 左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表中不满足条件的记录,右表部分都为null。
SELECT e.ename, e.sal , IFNULL(d.dname,'无部门') AS dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno;
- 左外自然:SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
- 右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
- 右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来。右表中不满足条件的记录,左表部分都为null。
- 右外自然:SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
- 全链接:可以使用UNION来完成全连接。
SELECT e.ename, e.sal , d.dname
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno=d.deptno
UNION
SELECT e.ename, e.sal , d.dname
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno;
4、子查询
查询中有查询(查看select关键字的个数)
①出现的位置
- WHERE后作为条件存在
- FROM后作为表存在(多行多列)
②条件
- 单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件) ;
SELECT * FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);
- 多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN,ALL,ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件);
SELECT * FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE job='经理') ;
- 单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2)IN (SELECT 列1,列2 FROM 表2 别名2 WHERE 条件);
SELECT * FROM emp WHERE (job,deptno) IN (SELECT job,deptno from emp WHERE deptno=30) ;
- 多行多列:SELECT * FROM 表1 别名1,(SELECT......)表2 别名2 WHERE 条件;
MySQL的约束、多表查询、子查询的更多相关文章
- MySQL进阶:约束,多表设计,多表查询,视图,数据库备份与还原
MySQL进阶 知识点梳理 一.约束 1. 外键约束 为什么要有外键约束 例如:一个user表,一个orderlist 如果现在想要直接删除id为1的张三,但是orderlist里还有用户id为1的订 ...
- mysql中【update/Delete】update中无法用基于被更新表的子查询,You can't specify target table 'test1' for update in FROM clause.
关键词:mysql update,mysql delete update中无法用基于被更新表的子查询,You can't specify target table 'test1' for update ...
- MySQL(18):Select- subquery子查询
1. Select- subquery子查询 子查询:是将一条查询语句嵌套在另一条查询语句之中. 2. 案例 需求:查询获得代课天数最多的那个老师的信息. 思路:先获得最多的代课天数是多少天,然后再判 ...
- Python-select 关键字 多表查询 子查询
sql 最核心的查询语句!!!! 增删改 单表查询 select语句的完整写法 关键字的书写顺序 执行顺序 多表查询 笛卡尔积 内连接 左外连接 右外连接 全外连接 通过合并左外连接和右外连接 子查询 ...
- MySQL的查询,子查询,联结查询,联合查询
MySQL的查询,子查询,联结查询,联合查询 一.mysql查询的五种子句where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数) 二 ...
- [sql Server]除非另外还指定了TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效
今天遇到一个奇怪的问题,项目突然要从mysql切换到sql server数据库,包含order by 子句的嵌套子查询报错. 示例:select top 10 name,age,sex from ( ...
- sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询
执行sql语句: select * from ( select * from tab where ID>20 order by userID desc ) as a order by date ...
- MySQL订单分库分表多维度查询
转自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL订单分库分表多维度查询 MySQL分库分表,一般只能按照一个维度进行查询. 以订单 ...
- oracle 基础SQL语句 多表查询 子查询 分页查询 合并查询 分组查询 group by having order by
select语句学习 . 创建表 create table user(user varchar2(20), id int); . 查看执行某条命令花费的时间 set timing on: . 查看表的 ...
- ORDER BY 子句在视 图、内联函数、派生表、子查询和公用表表达式中无效
SQL语句: select * from (select distinct t2.issue,cashmoney from (select distinct issue from lot_gamepa ...
随机推荐
- Linux下安装pip(遇到了python2.6升级为python2.7道路上的坑,原因已经找到,只差临门一脚了,以后补上)
1.先说一下什么是pippip 是“A tool for installing and managing Python packages.”,也就是说pip是python的软件安装工具2.下面介绍怎么 ...
- SQL 中用户建立与权限授予
SQL 中用户建立与权限授予 一.原有 如果大家对我的博客动态非常关注的话,应该又看到我弄了一个随机MAN信息的小工具.但是呢,那个工具还有待加强(显示效果不是那么的好). 所以我就希望可以显示一些简 ...
- SpringData JPA实现CRUD,分页与多参数排序
Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问计数,包括非关系数据库.Map-Reduce 框架.云数据服务等等,SpringData JPA是简化创建 JPA ...
- HDU 4508 湫湫系列故事——减肥记I
原题链接:点击此处 解题思路: 思路与01背包差不多,思路用二维数组表示: dp[i][v]=max{dp[i-1][v-k*b[i]]+k*a[i]|0<=k*b[i]<=v} 其dp( ...
- Codeforces Global Round 2 部分题解
F.Niyaz and Small Degrees 挺sb的一题,为什么比赛时只过了4个呢 考虑当\(x\)固定的时候怎么做.显然可以树形DP:设\(f_{u,i=0/1}\)表示只考虑\(u\)子树 ...
- webpack打包报错Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead
npm install –save-dev extract-text-webpack-plugin@next 会下载到+ extract-text-webpack-plugin@4.0.0-beta. ...
- c# java数据类型不同点
导读:C#和Java是当今最火热的两门面向对象编程语言,很多程序都是既开发Java,也涉足C#.不得不说这两门编程语言有很多共同点,这里主要比较一下Java和C#数据类型的不同之处,这些小的区别有时甚 ...
- Linux下ls命令使用详解(转)
说明:我们在linux下使用ll时,其实就是ls -l.ls才是最终的命令程序. ls命令是linux下最常用的命令之一,ls跟dos下的dir命令是一样的都是用来列出目录下的文件,List即列表的意 ...
- 分享:Android浏览器,用NDK C++做底层开发的Android浏览器,纯免费,无广告
分享:用 NDK C++做底层开发的Android 浏览器,纯免费,无广告 分享:用 NDK C++做底层开发的Android 浏览器,纯免费,无广告 操作简单,傻瓜一看就会 无毒.无广告.无负作用, ...
- (转)aix非计算内存 占用过高 案例一则
原文:http://www.talkwithtrend.com/Article/28621 两台小型机组成的RAC环境,在用topas查看资源使用情况时,发现一台机器的非计算内存占用过高: MEMOR ...