mysql表关系

约束
主键约束
主键使用ID表示,代表的是当前数据的唯一标识,特点不能重复,不能为空,且只有一个。
关键字:primary key
主键的自增长策略,只能适用于主键是int类型才可以,根据当前最大值增长
关键字:auto_increment
CREATE TABLE student
(
# 11
sid INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
sex VARCHAR(10)
)
默认约束
就是给提供的默认值。
关键字:default

非空约束
CREATE TABLE student
(
# 11
sid INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
sex VARCHAR(10),
mark VARCHAR(100) DEFAULT “学习非常用功”
)
唯一约束
也是唯一标识,可以为null.约束能力没有主键约束强。
关键字:unique
null可以多次存放,如果有内容的情况,unique的内容不能重复。
CREATE TABLE student
(
# 11
sid INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
sex VARCHAR(10),
mark VARCHAR(100) DEFAULT “学习非常用功”,
username VARCHAR(20) UNIQUE
)
外键约束
3.表和表之间有关联,用外键去维护,避免产生笛卡尔积
a={0,1} b={1,2,3} ab={(0,1),(0,2),(0,3),(1,1),(1,2),(1,3)}
关键字:foreign key()
4.表和表关系 *****
一对多/多对一
多对多
一对一
5.一对多
外键的作用就是维护数据的完整性。
连接查询:多表操作的时候,不再按照每张表单进行单独查询,使用连接查询展示两个表的内容。
内连接*****
隐式内连接
SELECT u.name ,o.oname FROM USER u,morder o WHERE u.uid=o.uid AND u.name=‘张飞’;
显示内连接: inner join on
SELECT * FROM USER u INNER JOIN morder o ON u.uid=o.uid AND u.name=‘张飞’;
外连接
**
左外连接 left join on
左外连接,以左边的表数据为主,如果右表中没数据使用null填充
右外连接 right join on
右外边接,以右边的表数据为主,如果左表中没数据使用null填充
以一张表为基准,查找满足条优的记录,如果没有满足此条件,基准表全部显示,关联表使用null填充
6.多对多
#查找夏候蹲所学的课程内容
#aa mybaits 接口
SELECT s.name,c.cname FROM student s,course c,student_course sc WHERE s.name=“夏候蹲” AND s.sid=sc.sid AND sc.cid=c.cid;
#查询选择毛概的同学
SELECT c.cname,s.name FROM student s,course c,student_course sc WHERE c.cname=“毛概” AND s.sid=sc.sid AND sc.cid=c.cid;
7.一对一
CREATE TABLE husband(
hid INT PRIMARY KEY,
hname VARCHAR(20)
);
CREATE TABLE wife(
wid INT PRIMARY KEY,
wname VARCHAR(20),

FOREIGN KEY(wid) REFERENCES husband(hid)
);
8.综合查询
1.基本查询
#查询员工的姓名
SELECT ename FROM emp;
#查询员工的薪水及姓名
SELECT ename, sal FROM emp;
#查询员工表所有的数据
SELECT * FROM emp;
#查询每一个员工的年薪
SELECT sal*16 AS 年薪 FROM emp;
2.条件查询
#1.查询薪水为5000的员工
SELECT * FROM emp WHERE sal=5000;
#2.查询薪 水不等于5000的员工
SELECT * FROM emp WHERE sal<>5000;
SELECT * FROM emp WHERE sal NOT IN (5000);
#3.查询薪水在1600-3000之间
SELECT * FROM emp WHERE sal BETWEEN 1600 AND 3000;
#4.查询部门编号为20或者30的部门信息
SELECT * FROM dept;
SELECT * FROM dept WHERE deptno=20 OR deptno=30;
SELECT * FROM dept WHERE deptno IN (20,30);
#5.查询部门编号不为20或者30的部门信息
SELECT * FROM dept WHERE deptno NOT IN (20,30);
#6.查询补助为空(不为空)的员工isn’t
SELECT * FROM emp WHERE comm IS NOT NULL;
#7.员工姓名第一个字母带S的员工信息
SELECT * FROM emp WHERE ename LIKE ‘s%’;
SELECT * FROM emp WHERE ename LIKE ‘%s%’;
#8.名字总共5个字母并且以S结尾
SELECT * FROM emp WHERE ename LIKE ‘____s’;
3.排序查询

order by 字段 asc(升序,默认) desc(降序)

#1.根据员工的薪水排序
SELECT * FROM emp ORDER BY sal;
#2.根据员工的薪水降序
SELECT * FROM emp ORDER BY sal DESC;
#3.根据员工的入职日期进行降序
SELECT * FROM emp ORDER BY hiredate DESC;
#4.查询职位为manager,并且按照薪资从低到高排序
SELECT * FROM emp WHERE job=‘MANAGER’ ORDER BY SAL;
4.聚合函数
#聚合函数 max min count sum avg
#1.求当前所有员工的最高工资
SELECT MAX(sal) AS ‘最牛工资’ FROM emp;
#2.求当前所有员工年支出
SELECT SUM(sal12) AS ‘年支出工资’ FROM emp;
#3.每个月的平均薪水
SELECT AVG(sal) FROM emp;
#4.公司总共多少个人
SELECT COUNT(
) FROM emp;###
SELECT COUNT(comm) FROM emp;
SELECT * FROM emp;
5.去重操作 distinct
#忽略人的情况,查询公司一共有几个部门
SELECT DISTINCT deptno FROM emp;
6.分组
#分组 group by having
#1.找出不同工作类别中最高的工资。
SELECT * FROM emp;
SELECT MAX(sal),job FROM emp GROUP BY job;
#2,找出不同工作类别中最高的工资,显示的时候工资按照从高到低显示
SELECT MAX(sal) AS t,job FROM emp GROUP BY job ORDER BY t DESC;
#3.求每个部门的平均薪资
SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;
#4.求每个岗位的最高薪资,除Manager之外
SELECT job,MAX(sal) FROM emp WHERE job<>‘manager’ GROUP BY job;
#5.找出每个工作岗位的平均薪水,要求显示平均薪水大于2000的
#having不能单独使用,必须配合group by
SELECT job,AVG(sal) AS t FROM emp GROUP BY job HAVING t >2000;
7.子查询
#子查询 一个查询的结果当作另一个查询的条件 嵌套查询
#找出薪水比公司平均薪水高的员工,要求显示员工的名字和薪水
SELECT AVG(sal) FROM emp;
SELECT * FROM emp WHERE sal>(SELECT AVG(sal) FROM emp);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值