Java基礎學習資料庫之多表查詢
阿新 • • 發佈:2018-12-22
建立外來鍵的第二種方式
建立兩個表
CREATE table student(
sid int PRIMARY key,
sname VARCHAR(10)
);
CREATE table score(
sid int ,
score INT
);
給score新增外來鍵alter table score add constraint fk_student_score_sid foreign key(sid) references student(sid);
刪除外來鍵(要使用約束的別名來刪除 因為一個表中可以有多個外來鍵 需要使用約束名字)-- 注意:約束名(外來鍵名)不能重複
alter table score drop foreign key fk_student_score_sid;
表與表之間的關係
多對多的關係: 利用第三張表來表示關係的 並且第三張表作為從表擁有其他兩個主表的外來鍵
看下面一個例子:
-- 學生表
CREATE TABLE stu(
sid int PRIMARY key,
sname VARCHAR(20)
);
-- 老師表
create table tea(
tid int primary key,
tname varchar(20)
);
-- 中間表建立關係
CREATE TABLE stu_tea (
sid int,
tid int
);
ALTER TABLE stu_tea add CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES stu(sid); ALTER TABLE stu_tea add CONSTRAINT fk_tea_stu_tid FOREIGN KEY(tid) REFERENCES tea(tid);
一對一的關係(不常用 完全可以寫成一張表)
如果考慮查詢效率問題 可以對錶進行拆分, 拆分有度)
多表查詢
一合併查詢
create table A(
name varchar(10),
score int
);
create table B(
name varchar(10),
score int
);
insert into A values('a',10),('b',20),('c',30);
insert into B values('a',10),('b',20),('d',40);
:UNION 取兩個表的並集 (欄位名 型別相同); UNION all 把兩個表的資料合併到一起查詢結果:SELECT * FROM A UNION all SELECT * FROM B;
a 10
b 20
c 30
a 10
b 20
c 30
a 10
b 20
d 40
a 10
b 20
d 40
select * from a,b;
select * from student,score;
這樣查詢會產生笛卡爾積(會產生大量無效資料)**去除錯誤資料(利用兩張表的編號相同去除)
select * from student,score where student.stuid = score.stuid;
select student.stuid,score.score from student,score where student.stuid = score.stuid;
另外為了方便書寫可以給表起個別名
別名查詢
select s.stuid,c.score from student s,score c
where s.stuid = c.stuid;
三表合併查詢
建立科目表
create table course(
courseid int,
cname VARCHAR(20)
);
查詢學生 老師 科目SELECT
s.stuname,
c.score,
u.cname
FROM
student s,
score c,
course u
WHERE
s.stuid = c.stuid
AND c.courseid = u.courseid;
連結查詢(多表查詢) on加條件-- 內連線查詢(inner 可以省略)
SELECT
*
FROM
student s
INNER JOIN score c ON s.stuid = c.stuid;
-- 三表內查詢
SELECT
*
FROM
student s
INNER JOIN score c
JOIN course u ON s.stuid = c.stuid
AND c.courseid = u.courseid;
查詢表中80分以上的學生資訊 (姓名 分數 科目)-- 1
SELECT
s.stuname,
c.score,
u.cname
FROM
student s
INNER JOIN score c
JOIN course u ON s.stuid = c.stuid
AND c.courseid = u.courseid
where c.score>80;
-- 2
SELECT
s.stuname,
c.score,
e.cname
FROM
student s
JOIN score c ON s.stuid = c.stuid
JOIN course e ON e.courseid = c.courseid
WHERE
c.score > 80;
外連結 左外連結 右外連結 (outer可以省略)左外連結以左邊的表為主 會查出左邊表單的所有資料
select * from score LEFT OUTER JOIN student on
student.stuid = score.stuid;
自然連結 關鍵詞 nature join自動匹配兩個表中 相同欄位的值;
要求欄位名和型別相同
select * from student NATURAL JOIN score;
子查詢 (巢狀查詢)
-- 員工表 部門表測試 查詢工資高於JONES的員工資訊
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` 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 = 'MARTIN');
有2個以上直接下屬的員工資訊SELECT * FROM emp WHERE empno IN(
select mgr from emp GROUP BY mgr HAVING COUNT(mgr)>=2);
查詢員工編號為7788的員工名稱、員工工資、部門名稱、部門地址SELECT
e.ename,
e.sal,
d.dname,
d.loc
FROM
emp e
INNER JOIN dept d ON e.deptno = d.deptno
WHERE
empno = 7788;
求各個部門薪水最高的員工所有資訊select * from emp where (deptno,sal) in(
select deptno,MAX(sal) from emp GROUP BY deptno);
**把查詢出來的結果當做一張表來查詢SELECT
*
FROM
emp e1,
(
SELECT
deptno,
MAX(sal) masl
FROM
emp
GROUP BY
deptno
) e2
WHERE
e1.sal = e2.masl
AND e1.deptno = e2.deptno;
求7369員工編號、姓名、經理編號和經理姓名-- 自連線查詢 要查詢的資訊在一張表中 單一次查不出來 把自己這個表當成 兩個表來連結查詢
SELECT
e.empno,
e.ename,
p.ename
FROM
emp e,
emp p
WHERE
p.empno = 7369
AND e.empno = p.mgr;