一、约束之主键约束

约束:约束是添加在列上的,用来约束列的。

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、修改表时添加外键约束:

1 alter table t_student1 add constraint 外键名 foreign key(作为外键的列名) references t_class1(主键列名);
2 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 条件;

转载于:https://www.cnblogs.com/gdwkong/p/7487263.html

MySQL的约束、多表查询、子查询相关推荐

  1. 数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引

    1.    oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的 ...

  2. mySQL学习记录(局域网连接/基础查询/条件查询/常见函数/窗口函数/表连接/子查询/插修删建表)

    一些基础概念 DB 数据库 存储数据的容器 DBMS 数据库管理系统 又称数据库软件.产品如mysql/oracle/db2/sqlserver SQL 结构化查询语言 是所有的DBMS都使用的一种D ...

  3. MySQL核心查询-排序 分组 聚合 多表查询 合并查询 子查询

    目录 一.单表查询 排序 聚合函数 分组 limit关键字 二.SQL约束 主键的自增 DELETE和TRUNCATE对自增长的影响 三.多表查询 外键约束 删除外键约束 多表查询的分类 内连接查询 ...

  4. MySQL数据库多表查询,子查询

    写博客的第四天,今天来点数据库的操作,温故而知新,在前进的路上,多看看自己曾经走过的路,不要忘了自己是怎么一步一步走过来的,对于前方未知的道路,不要轻言放弃. 今天的内容全部是MySQL里面的语句,基 ...

  5. mysql 子表_MySQL子查询,派生表和通用表达式

    一:子查询 1.介绍 在另一个查询(外部查询)中嵌套另一个查询语句(内部查询),并使用内部查询的结果值作为外部查询条件. 2.子查询在where中 SELECT customerNumber, che ...

  6. sql 基础语法 创建数据库和数据表 数据增删改查 分组查询 子查询回顾

    参考链接: SQL教程 MySQL教程 一.创建数据库语法 --用master数据库 use master --判断数据库是否存在,若存在则删除 if exists (select * from sy ...

  7. 数据库学习之MySQL (十七)—— SQL99 主查询 与 子查询 子查询分类之WHERE的子查询

    文章目录 主查询 子查询 纲举目张--子查询的分类 WHERE语句后的 子查询 主查询 子查询 概念集中于SELECT语句 之前我们所学习的所有,都是SELECT作为独立的一句 是主干,是爸爸 后面跟 ...

  8. mysql 命令先执行子查询,MySQL必知必会--使用子查询

    子查询 版本要求 MySQL 4.1引入了对子查询的支持,所以要想使用 本章描述的SQL,必须使用MySQL 4.1或更高级的版本. SELECT语句 是SQL的查询.迄今为止我们所看到的所有 SEL ...

  9. Mysql进阶学习(六)子查询与分页查询

    Mysql进阶学习(六)子查询与分页查询 进阶7:子查询 1.含义: 2.分类: 3.where或having后面 3.1 特点: 3.2.标量子查询★ 案例1:谁的工资比 Abel 高? 案例2:返 ...

  10. 除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询...

    执行sql语句: select * from ( select * from tab where ID>20 order by userID desc ) as a order by date ...

最新文章

  1. 零基础python入门书籍推荐书目_铁粉看过来!送书啦,Python推荐书单,送书10本!...
  2. Linux下的几款svn gui工具
  3. java mail 发件人昵称,Java使用javax.mail发送邮件 解决收件人、发件人名字乱码问题...
  4. NLP十大研究方向Highlights!
  5. mysql2008分数约束_关于SQL2008对表中列的约束
  6. 在网页中加入透明flash代码
  7. CCS错误解决:#10247-D null: creating output section “ramfuncs“ without a SECTIONS specification
  8. Ceres Solver 具体案例分析
  9. win11窗口桌面管理器突然很吃内存?
  10. Codeforces 136A Presents
  11. 使用微搭搭建天气预报小程序
  12. freenom又行了-免费顶级域名白嫖一年,赶紧看看如何申请
  13. Martin对敏捷宣言中“可工作软件胜过面面俱到文档”的解释
  14. Python 生成总和一定的随机数
  15. 抖音计算机系表白,抖音最火的表白小情话50句
  16. Windows注入与拦截(3) -- 使用钩子方式完成DLL注入
  17. Android应用解析包错误原因的总结(不定时更新)
  18. 软件需求——需求规格说明书模版(三)
  19. OpenSim 使用
  20. mif2png(QQGame 专用 mif 格式转 png 格式)

热门文章

  1. union(联合)合并查询结果
  2. 【luogu2737】 [USACO4.1]麦香牛块Beef McNuggets [动态规划 完全背包][数学 扩展欧几里德]...
  3. Django - 分页器
  4. thinkphp隐藏后台地址
  5. Linux安装python3.6 和pip
  6. postman的使用方法详解!最全面的教程
  7. SPOJ 375 树链剖分学习
  8. 第三章:ioctl 函数详解
  9. 【转】Linux入门命令篇(简训)
  10. 在Eclipse中集成Ant编程之配置篇