1. 程式人生 > >Java基礎學習資料庫之多表查詢

Java基礎學習資料庫之多表查詢

建立外來鍵的第二種方式

建立兩個表


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;