您的位置:首页 > 数据库 > MySQL

Mysql语句总结(3)

2017-07-27 19:38 127 查看

多表查询(重要)

多表查询分为:

合并结果集 - UNION /UNION ALL

连接查询 -

内连接 (inner) join on

外连接 outer join on

左外连接 left (outer) join

右外连接 right (outer) join

自然连接 nature join

子查询

1 合并结果集

UNION - 去重复记忆

UNION all -不去重复记忆

要求 被合并的两个结果列数 和列类型必须相同

SELECT * FROM emp UNION SELECT *FROM dept;

SELECT * FROM emp UNION ALL SELECT *FROM dept;

SELECT deptno FROM emp UNION SELECT deptno FROM dept;

SELECT * FROM emp UNION ALL SELECT *FROM dept;

注意 这个时候出现的是笛卡尔积 类似排列组合

SELECT * FROM emp,dept;

筛选出我们想要的结果

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;

2.1内连接

上面的连接语句就是内连接 只不过不是SQL标准的查询方式

SELECT * FROM emp INNER JOIN dept ON emp.deptno=dept.deptno;

inner 可以省略

SELECT * FROM emp JOIN dept ON emp.deptno=dept.deptno;

别名

SELECT * FROM emp e JOIN dept d ON e.deptno=d.deptno;

外连接(左连接,右连接)

查询出的结果存在不满足条件的可能

左连接

先查询左表(主),再查询右表,

右表中满足条件的显示出来 否则null

SELECT *FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno;

SELECT *FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno;

3 自然连接

与内连接一样,会自动匹配相同的名字,相同类型的字段

SELECT *FROM emp NATURAL JOIN dept;

SELECT *FROM emp NATURAL LEFT JOIN dept;

SELECT *FROM emp NATURAL RIGHT JOIN dept;

合并结果集

4子查询(非常重要)

SELECT *

FROM emp;

工资高于jones 的员工

1,找到JONES的工资

SELECT sal FROM emp WHERE ename = ‘JONES’;

2,找到工资高于2975的人

SELECT *FROM emp WHERE sal > 2975;

SELECT *FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename = ‘JONES’);

查询与SCOTT同一个部门的员工

SELECT *FROM emp WHERE deptno = (SELECT deptno FROM emp WHERE ename =’SCOTT’);

工资高于30号部门所有人的员工信息

SELECT *FROM emp WHERE sal>(SELECT max(sal)FROM emp WHERE deptno = 30);

查询工作和工资与MARTIN完全相同的员工信息

SELECT *FROM emp WHERE job =(SELECT job FROM emp WHERE ename =’MARTIN’) AND sal = (SELECT sal FROM emp WHERE ename =’MARTIN’)

SELECT *FROM emp WHERE (job,sal) IN (SELECT job,sal FROM emp WHERE ename = ‘MARIN’);

查询有两个以上直接下属的员工信息

SELECT *FROM emp WHERE empno IN (SELECT mgr FROM emp GROUP BY mgr

HAVING COUNT(mgr)>=2);

查询7369员工编号,姓名,经理编号,经理姓名

子连接

SELECT e1.empno,e1.ename,e1.mgr,e2.ename FROM emp e1,emp e2 WHERE e1.mgr=e2.empno AND e1.empno=7369;

SELECT * FROM emp;

表与表之间的关系;

一对多

多对一

一对一

多对多

一对多 多对一(常见)

CREATE TABLE stu(

sid INT PRIMARY KEY ,

name VARCHAR(50),

sex VARCHAR(10)DEFAULT ‘男’

);

CREATE TABLE score(

id INT,

score DOUBLE,

sid INT

);

多对多

CREATE TABLE teacher(

tid INT PRIMARY KEY ,

name VARCHAR(50)

);

CREATE TABLE stu(

sid INT PRIMARY KEY ,

name VARCHAR(50)

);

CREATE TABLE tea_stu_rel(

tid INT,

sid INT

);

一对一,在一对多的模型下 将关联的两个字段设置为主键

外键约束:FOREIGN KEY

CREATE TABLE score(

sid INT PRIMARY KEY ,

name VARCHAR(50),

sex VARCHAR(10)DEFAULT ‘男’);

CREATE TABLE score(

id INT,

score DOUBLE,

sid INT, – 外键类型一定要与关联的主键类型一致

#方式1

fk_score_sid 是我们自己起的名字 可以任意改变

CONSTRAINT fk_score_sid FOREIGN KEY (sid) REFERENCES stu(sid)


);

方式2

注意 当表中已经存在不合法数据 就无法再添加外键约束

ALTER TABLE score ADD CONSTRAINT fk_score_sid FOREIGN KEY (sid) REFERENCES stu(sid);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: