1. 程式人生 > >Spring Boot入門7

Spring Boot入門7

回顧:

SQL分類:
    DDL: 資料定義語言,定義資料庫/表的結構:drop,alter,create,truncate
    DML: 資料操縱語言,操縱的是資料:      insert ,delete, update,
    DQL: 資料查詢語言,查詢資料:select,where,group by, having, order by 
    DCL: 資料控制語言,控制的許可權: grant,revoke 

資料庫CRUD:
    增加:create database 名稱
    刪除:drop database 名稱
    修改:alter database 名稱 character set utf8; 
    查詢:show databases;
        show create database 名稱
    其他: use 名稱 : 選中資料庫,切換資料庫    
表的CRUD:
    增加:create table 名稱(
            列明 列的型別 列的約束,
            列名 列的型別 列的約束
        );
        列的型別: int,float,double,date,datetime,timestamp,char(10)/varchar(10)
        列的約束:
            主鍵約束:primary key 唯一併且不能為空 (編號)
            唯一約束:unique 唯一允許為空
            非空約束:not null 不允許為空

            檢查約束: check msyql不支援這種約束

            外來鍵約束: foreign key 多表之間的約束
    刪除:drop table 名稱
    修改:
        新增列: alter table 名稱 add 列明 列的型別
        重定義列: alter table 名稱 modify 列名 列的型別
        刪除列: alter table 名稱 drop 列明
        修改列明: alter table 名稱 change 舊列明 新列名 列的型別
        修改表名: rename table 表名 to 新表名
    查詢:
         show tables;
         show create table 名稱
         desc 名稱

表中資料的CRUD:  
    增加: insert into 名稱(列名1,列名2) values(值1,值2)
           insert into 名稱 values(值1,值2);
    刪除: delete from 名稱 【where 條件】       
          truncate table 名稱
    修改: update 名稱 set 列名1=值1,列名2=值 [where 條件]
    查詢:
        select * from 名稱
        select * from 名稱 where 條件
        select 分組的條件,分組的目標 from 表名 where 條件 group by 分組的條件 having 分之後的過濾
        order by 
        limit   

一、表關係介紹

1. 表之間為什麼要有關係

一般來講,通常都是一張表某一型別資料,比如學生資料儲存在學生表,教師資料儲存在教師表,學科資料儲存在學科表。但是有時候我們需要表示一個學生屬於哪一個班級。我們可以有兩種形態表示,

一、直接在學生表裡面表示屬於哪一個班級。(@1) 如果我們還想表示班級更多的資訊。 class表。

二、學生表表示學生資訊,班級表表示班級資訊,然後讓學生表和班級表存在關係引用即可。

從擴充套件角度來看,應該是第二種方式更優秀一點,因為如果我們要擴充套件班級的資訊,比如,位於哪個教室,班主任是誰等等資訊 ,第一種方式就顯得捉襟見肘,如果都把這些要擴充套件的資訊宣告在學生表裡面,就打破了資料的完整性。

  • 圖1

這裡寫圖片描述

  • 圖2

這裡寫圖片描述

2. 表關係維繫的點

一般資料表就表示某一種型別的資料。比如: 學生表、班級表。如果要讓兩張表存在關係,必須得有維繫關係的點存在。就好比生活中怎麼表示對面這位美女就是你的夫人呢?把結婚證拿出來一擺就可以了。

資料庫表形成關係,並不需要額外的第三方物件來表示。只要某一張表中的某一列存放的是另一張表的一個標識即可(一般是主鍵id。) , 如下圖表示一個學生是哪一個班級的。則需要在學生表中使用一個列cid 來儲存班級的id值。 以後查詢學生資訊的時候,即可知道它屬於的班級id。

當某一列中存放的值是另一個表的主鍵值,那麼這個列一般會稱之為外來鍵 如:學生表的 cid列

, 所以一般表的關係,我們也可以看成是主外來鍵關係。

一旦形成主外來鍵關係,那麼外來鍵裡面的值只能是主鍵值,否則就無法形成主外來鍵關係了。如:我們在cid中寫了100這個數字,這就表示必須存在編號為100的班級,否則該學生的資料就是無效的資料。一般會稱外來鍵方為從表,主鍵方為主表

這裡寫圖片描述

  • 思維拓展

表示學生屬於哪一個班級,就在學生表裡面增加一個列cid , 然後cid 就存放班級表的id值。 已上圖距離, 張三就屬於三年二班的學生

如果要表示這個班級有哪些學生,我們如何在班級表這邊體現呢? 從群體關係上看,班級只有一個,學生有很多個。在班級裡面體現學生是很難的。假如一個班有100個學生,那麼班級表真的很難記住這100個學生的資訊。我們只有在學生的這邊記住,它屬於哪一個班級。 基本上這和我們日常生活是一樣的。只有多的一邊記住多的一邊, 一的那邊很少記住多的一邊。如: 我們都知道高中校長、大學校長。但是校長就很難記住我們…

要記住一個核心點: 就是在分析表關係的時候,要分清楚多的一邊,和 一的一邊。 然後在多的一邊,建立外來鍵,然後指向一的那一邊的主鍵值。

3. 表關係分類

表關係的分類主要體現以下幾種: 一對多 | 多對一多對多一對一 。表關係是資料庫操作中高階的知識,開發中經常會碰到。

  • 一對多 | 多對一

在生活中體現的有,商品分類 和 商品的關係 ,班級和學生的關係 , 教練和隊員的關係… 其實一對多的關係反向過來是多對一,所以平常也有可能聽到多對一這樣的關係,其實也是成立的。只不過是誰在前,誰在後而已。

  • 多對多【拆解成兩個一對多】

多對多,其實就是兩個一對多組合一起。生活中最能體現這個就是學生選課這個事情了。 A 這個課程有 多個學生選擇, 一個學生也可以選擇多們課程。 學生選課的關係: 一個學生可以選擇多門課程 ,一門課程也可以被多個學生選。

  • 一對一【比較少見】

一對一的關係生活中體現比較少,除了那種一對一輔導、保姆專人照顧嬰兒之外,貌似就比較少…

4. 一對多關係

此處使用商品分類 & 商品來體現一對多關係

這裡寫圖片描述

-- 分類表
CREATE TABLE category (id INT PRIMARY KEY AUTO_INCREMENT , NAME VARCHAR(20) );

-- 商品表
CREATE TABLE product (id INT PRIMARY KEY AUTO_INCREMENT , NAME VARCHAR(20) , price DOUBLE);

-- 新增外來鍵欄位,意思是給商品新增一個額外的欄位。
ALTER TABLE product ADD COLUMN cid INT ;

-- 新增額外的約束 意思是給product表新增一個外來鍵約束
-- 約束的名稱叫做product_fk  這個名字可以隨便寫。 外來鍵是是cid . 
-- 後面的REFERENCES 表示和哪一個表的哪一個列建立關係。 
ALTER TABLE product ADD CONSTRAINT product_fk FOREIGN KEY (cid) REFERENCES category(id);

5. 多對多關係

這裡使用學生選課的情形來描述 ,但是多對多比以前的一對多 或者 多對一稍顯複雜些。 一般多對多都會使用第三張表來週轉,把多對多變成兩個一對多的關係。

這裡寫圖片描述

-- 建立學生表
CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT , NAME VARCHAR(20));

-- 建立課程表
CREATE TABLE course (id INT PRIMARY KEY AUTO_INCREMENT , NAME VARCHAR(20));


 -- 建立中間表  中間表獨立使用沒有任何意義,它得配合其他的兩張表來使用才能體現出來。所以
 -- 該表可以沒有主鍵。當然假如主鍵也沒有什麼問題
 CREATE TABLE stu_course(sid INT, cid INT);

 -- 建立學生表和中間表的關係。 原則上學生表和課程是多對多的關係,一個學生可以選擇多門課程 , 那麼學生和
 -- 中間選課記錄表的關係應該是一對多的關係。 那麼記錄表作為多的一方,需要去記住一的一方
 ALTER TABLE stu_course ADD CONSTRAINT stu_fk  FOREIGN KEY (sid) REFERENCES student(id);

 -- 新增中間表到課程表的一用。
 ALTER TABLE stu_course ADD CONSTRAINT course_fk FOREIGN KEY(cid) REFERENCES course(id);
  • 為什麼多對多要引入中間表?

由於學生表只會存放學生資訊, 課程表也只會存放課程資訊。 那麼要體現一個學生選擇了幾門課程,一門課程被多少個學生選擇。 如果沒有中間表,我們就需要在這兩張表中各自新增額外的列來記錄這些資料(如,選課的時間)。 這就使得資料表不是那麼的乾淨。通用的做法都是採用中間表存放他們的各自關係,然後讓學生表、課程表 和 中間表產生關係即可。

二、 多表查詢

此前我們建立的表都是獨立的表,現在表之間已經存在了聯絡,那麼現在的查詢要再上一個臺階,要使用到多表聯合查詢了。通俗的意思就是:查詢A表 和 B表,然後才能得出一條完整的資料。 以前由於資料是獨立的,所以查詢A表即可得知一條完整的資料。

  • 多表查詢的分類

多表查詢的常用手段有 : 子查詢 | 內連線查詢 |外連線查詢

1. 子查詢

子查詢是將一個查詢語句巢狀在另外一個查詢語句中,內層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件 。

  • 語法規則

    1. 子查詢必須“自身就是一個完整的查詢”。即,它必須至少包括一個SELECT子句和FROM子句。
    2. 子查詢SELECT語句不能包括在ORDER BY子句中。因為ORDER BY字句只能對最終查詢結果排序,如果顯示的輸出需要按照特定順序顯示,那麼ORDER BY子句應該作為外部查詢的最後一個子句列出。
    3. 子查詢“必須包括在一組括號中”,以便將它與外部查詢分開。
  • 例子

-- 把商品分類為手機的所有商品給查詢出來。 

--1. 首先要查詢出來商品分類為 【手機】 的資訊。
-- 商品表裡面,表示分類資訊,只有一個分類id , 所以上一個步驟,要查詢出來【手機】的分類id
SELECT id FROM category WHERE NAME='手機';

--2. 根據查詢出來的分類id來查詢所有商品。  這裡使用子查詢, 前面查詢到的id 作為這次查詢的條件。
SELECT * FROM product WHERE cid = (SELECT id FROM category WHERE NAME='手機');

這裡寫圖片描述

2. 內連線查詢

內連線查詢是一種常用的連線查詢,可以查詢兩個或兩個以上的表。該查詢後面必須有兩張表的對等值才能成立。 如:倉庫中有哪一種分類有庫存的,並且列出庫存商品。

內連線有兩種分類: 隱式內連線 | 顯式內連線

  • 隱式內連線

語法格式:select * from A , B where 條件 ;

這裡寫圖片描述

-- 需求:查詢商品庫中,哪一種分類有商品,並且都有哪些商品。
SELECT  c.name , p.name , p.price FROM category c ,product p WHERE p.cid = c.id;
  • 顯式內連線

語法格式:select * from A inner join B on 條件

SELECT  c.name , p.name , p.price FROM category  c INNER JOIN product p ON p.cid = c.id;

3. 外連線查詢

外連線查詢又分為左外連線右外連線

這裡寫圖片描述

1. 左外連線

以左邊表為基準,查詢左邊表的所有資料,順便把它裡面關聯的右邊表資料給查詢出來,即便左邊表中有某些記錄在右邊表沒有關聯,那麼也會查詢出來,只不過關聯的部分值為null而已。

使用關鍵字: LEFT JOINLEFT OUTER JOIN

此處以 : 列出倉庫中所有分類 以及 每一種分類具體的商品資訊 為例子演示 , 此處優先的是分類,所以應該以分類為基準。

這裡寫圖片描述

-- 列出所有分類的庫存情況
SELECT * FROM category c LEFT OUTER JOIN product p  ON c.id = p.cid;

2. 右外連線

這和左外連線正好是反過來的,右外連線是以右邊表Wie基準,查詢右邊表的所有資料,順便把它關聯的左邊表資料也給查詢出來,即便右邊表的某些記錄在左邊表沒有關聯,那麼也會查詢出來,只不過關聯部分的值為null而已。

使用關鍵字: RIGHT JOINRIGHT OUTER JOIN

此處以: 列出列出倉庫中仍有庫存的商品 以及 所屬分類資訊 為例子演示 , 這裡的優先是有庫存,所以應該以商品表為基準。

這裡寫圖片描述

-- 列出有庫存的商品,並且把分類也顯示出來
SELECT * FROM category c RIGHT OUTER JOIN product p ON c.id = p.cid;
  • 練習

# 查詢分類為電腦的商品 -- 內連線查詢

SELECT * FROM category c, product p WHERE c.name = '電腦' AND p.cid = c.id;

# 列出來所有的分類,並且顯示該分類的商品 -- 左外
SELECT * FROM category c LEFT JOIN product p ON c.id = p.cid;

# 列出來庫存中的所有商品,並且顯示所屬的分類 -- 右外
SELECT * FROM category c RIGHT JOIN product p ON c.id = p.cid;

# 列出來每一種分類有多少件商品
SELECT * FROM category c LEFT JOIN product p  ON c.id =p.cid;

SELECT c.name , COUNT(*) FROM category c LEFT JOIN product p  ON c.id =p.cid GROUP BY c.id;


SELECT c.name , COUNT(p.id) FROM category c LEFT JOIN product p  ON c.id =p.cid GROUP BY c.id;

今日列題演練

多表之間的關係: 多張表之間的關係

多表之間的關係約束: 向A表中插入的記錄,需要存在於B表中

insert into product values(null,'紅牛',6,'喝了就不困了',44);

– 刪除分類編號為44的記錄
delete from product where cno=44;

– 多表之間的關係,由什麼來維護/約束 foreign key 外來鍵約束
– 新增一個外來鍵約束:
– 修改 product 這張表 新增 外來鍵約束(cno) 讓它參考 category表中的cid欄位
alter table product add foreign key(cno) references category(cid);

insert into product values(null,'紅牛',6,'喝了就不困了',4);

/*
表的關係分類:
一對多|多對一: 商品和商品分類, 教室和學生, 教師和學生,一個爸爸和多個孩子
建表原則: 在多的一方新增一列,並且指定一個外來鍵約束,讓他指向一的一方
多對多: 學生和選課
一對一: 人和身份證號 , 公司 和 地址

*/
– 把商品分類為手機數碼的所有商品給查詢出來
– 連線查詢
select * from category,product where category.cid = product.cno;
– 連線查詢,並且限定條件
select * from category,product where category.cid = product.cno and category.cname='手機數碼';

– 內連線查詢 (隱式內連線) 兩張表公有的資料
select * from category,product where category.cid = product.cno;
– 顯式內連線
select * from category inner join product on category.cid = product.cno where category.cname='手機數碼';

/*
外連線:
左外連線: 以左表為基礎,查詢左表中的所有資料以及右表對應的記錄,若右表沒有對應的記錄,則顯示null
left outer join ... on ..
右外連線: 以右表為基礎,查詢右表中所有的記錄以及左表對應的記錄,若左表沒有對應的記錄,則顯示null
right outer join ... on ..

*/
– 左外連線
select * from category left outer join product on category.cid = product.cno;
– 右外連線:
insert into product values(null,'測試',190,'fasdfa',null);
select * from category right outer join product on category.cid = product.cno;

select * from product;

– 列出來每一種分類有多少件商品
– 顯示所有的分類 –
select * from category left outer join product on category.cid = product.cno;
– 分組統計
select cname,COUNT(*) from category left outer join product on category.cid = product.cno group by cname;

– 列出商品分類為手機數碼的所有商品
select * from product where cno = 1;

– 1.查詢分類表中,手機數碼的編號是多少
select cid from category where cname = '手機數碼'

– 2. 子查詢的結果
select * from product where cno = (select cid from category where cname = '手機數碼');

/*
子查詢: 查詢語句中巢狀查詢語句
作用: 是去解決一些複雜的查詢需求
*/
– 請查詢出商品表中價格最低的商品資訊
select * from product;
– 1.查詢最低價格是多少 5
select MIN(price) from product;
– 2. 看誰的價格等於最低價格
select * from product where price =5;

select * from product where price = (select MIN(price) from product);

/*
擴充套件: 子查詢補充

單行子查詢: 子查詢出來的結果只有一行
關鍵字: > >= = < <= != <>
多行子查詢: 子查詢出來的結果有多行
關鍵字: in , not in , any , all
*/

create database mysqltest2;
use mysqltest2;

– 部門表

create table DEPT(
DEPTNO int primary key, – 部門編號
DNAME varchar(14) , – 部門名稱
LOC varchar(13) ) ; – 部門地址

insert into DEPT values (10,’ACCOUNTING’,’NEW YORK’);
insert into DEPT values (20,’RESEARCH’,’DALLAS’);
insert into DEPT values (30,’SALES’,’CHICAGO’);
insert into DEPT values (40,’OPERATIONS’,’BOSTON’);

– 員工表

create table EMP(
EMPNO int primary key, – 員工編號
ENAME varchar(10), – 員工名稱
JOB varchar(9), – 工作
MGR double, – 直屬領導編號
HIREDATE date, – 入職時間
SAL double, – 工資
COMM double, – 獎金
DEPTNO int – 部門號
);

insert into EMP values
(7369,’SMITH’,’CLERK’,7902,’1980-12-17’,800,null,20);
insert into EMP values
(7499,’ALLEN’,’SALESMAN’,7698,’1981-02-20’,1600,300,30);
insert into EMP values
(7521,’WARD’,’SALESMAN’,7698,’1981-02-22’,1250,500,30);
insert into EMP values
(7566,’JONES’,’MANAGER’,7839,’1981-04-02’,2975,null,20);
insert into EMP values
(7654,’MARTIN’,’SALESMAN’,7698,’1981-09-28’,1250,1400,30);
insert into EMP values
(7698,’BLAKE’,’MANAGER’,7839,’1981-05-01’,2850,null,30);
insert into EMP values
(7782,’CLARK’,’MANAGER’,7839,’1981-06-09’,2450,null,10);
insert into EMP values
(7788,’SCOTT’,’ANALYST’,7566,’1987-07-13’,3000,null,20);
insert into EMP values
(7839,’KING’,’PRESIDENT’,null,’1981-11-17’,5000,null,10);
insert into EMP values
(7844,’TURNER’,’SALESMAN’,7698,’1981-09-08’,1500,0,30);
insert into EMP values
(7876,’ADAMS’,’CLERK’,7788,’1987-07-13’,1100,null,20);
insert into EMP values
(7900,’JAMES’,’CLERK’,7698,’1981-12-03’,950,null,30);
insert into EMP values
(7902,’FORD’,’ANALYST’,7566,’1981-12-03’,3000,null,20);
insert into EMP values
(7934,’MILLER’,’CLERK’,7782,’1982-01-23’,1300,null,10);

– 給員工表新增外來鍵約束
alter table emp add foreign key(deptno) references dept(deptno);

– 練習
– 1.返回擁有員工的部門名、部門號。(dept,emp)
SELECT DISTINCT d.DNAME,d.DEPTNO FROM emp e,dept d WHERE d.DEPTNO=e.DEPTNO;
– 2.工資多於smith的員工資訊。
一、拿到這個人的工資
SELECT SAL FROM emp WHERE ENAME="smith";
二、用所有員工的工資比對大於這個人的工資
SELECT * FROM emp WHERE SAL>(SELECT SAL FROM emp WHERE ENAME="smith")

– 所有員工的資訊
select * from emp;
– 薪資大於等於1000並且小於等於2000的員工資訊
select * from emp where sal between 1000 and 2000;
– 從員工表中查詢出所有的部門編號
select distinct deptno from emp;
– 查詢出名字以A開頭的員工的資訊
select * from emp where ename like 'A%';
– 查詢出名字第二個字母是L的員工資訊
SELECT * FROM emp WHERE ename LIKE "_L%";
– 查詢出沒有獎金的員工資訊
SELECT * FROM emp WHERE COMM IS NULL;
– 所有員工的平均工資
SELECT AVG(SAL) FROM emp;
– 所有員工的工資總和
SELECT SUM(SAL) FROM emp;
– 所有員工的數量
SELECT COUNT(ENAME) FROM emp;
– 最高工資的員工資訊
SELECT *,MAX(SAL) FROM emp;
– 1.得到最高工資 5000
select MAX(sal) from emp;
– 2. 看誰的工資等於最高工資
select * from emp where sal = (select MAX(sal) from emp);
– 3.返回員工和其所屬領導的姓名。(自連線)
SELECT e.ename,d.ename FROM emp e,emp d WHERE e.mgr=d.empno;
– 最少工資的員工資訊
SELECT *,MIN(SAL) FROM emp;

– 查詢員工編號,員工姓名,經理編號,經理姓名

select e.empno,e.ename,e.mgr,m.ename from emp e,emp m where e.mgr = m.empno;

– 查詢出高於10號部門的平均工資的員工資訊
– 1.查詢10號的平均工資 2916
select avg(sal) from emp where deptno=10;
– 2. 看哪些員工的工資 > 10號部門的平均工資
select * from emp where sal > 2916;
– 3.返回員工和其所屬領導的姓名。(自連線)
SELECT e.ename,d.ename FROM emp e,emp d WHERE e.mgr=d.empno;
– 4.返回僱員的僱傭日期 早於其領導僱傭日期的 員工及其領導姓名。(在日期型別可以直接比較)
SELECT e.ename,d.ename FROM emp e,emp d WHERE e.MGR=d.EMPNO AND e.HIREDATE<d.HIREDATE;
– 5.返回員工姓名及其所在的部門名稱。
SELECT e.ename,d.dname FROM emp e,dept d WHERE e.DEPTNO=d.DEPTNO;
– 6.返回從事clerk工作的 員工姓名和 所在部門名稱
SELECT e.ename,d.dname FROM emp e,dept d WHERE e.DEPTNO=d.DEPTNO AND e.JOB="clerk";
– 7.返回部門號及其本部門的最低工資。
SELECT deptno,MIN(sal) FROM emp GROUP BY deptno;
– 8.返回銷售部(sales)所有員工的姓名。
SELECT ename FROM emp WHERE job="salesman";
– 9.返回工資多於平均工資的員工。
SELECT ename FROM emp WHERE sal>(SELECT AVG(sal) FROM emp)
– 10.返回與SCOTT從事相同工作的員工。
SELECT ename FROM emp WHERE job = (SELECT job FROM emp WHERE ename="smith")
– 11.返回與30部門員工工資相同的員工姓名與工資。

SELECT sal FROM emp WHERE deptno=30
SELECT ename sal FROM emp WHERE sal IN(SELECT sal FROM emp WHERE deptno=30)

– 查詢出比10號部門任何員工薪資高的員工資訊 (多行子查詢)
select * from emp where deptno = 10;
– 查詢10號最低工資
select MIN(sal) from emp where deptno =10;
– 結果
select * from emp where sal > (select MIN(sal) from emp where deptno =10);

– 1. 查詢10號部門所有的工資
select sal from emp where deptno =10;
– 2. 查詢出比10號部門任何員工薪資高的員工資訊
select * from emp where sal >any(select sal from emp where deptno =10);

– from 後面子查詢
– 查詢emp表中經理資訊
– 1.查詢經理的編號
select distinct mgr from emp;

– 2.將上面的查詢結果當作是一張表

from 
   emp e,
   (select distinct mgr from emp) t
where 
   e.empno = t.mgr;```


-- 查詢 薪資 大於 薪資最高的員工 所在部門 的平均工資 和 薪資最低的員工 所在部門 的平均工資 的平均工資 的員工資訊
--      sal  >                     10       100        and                 20        80          (100+80)/2    
--   sal > (100+80)/2
-- 1. 薪資最高的員工 所在部門 10
```select MAX(sal) from emp; --5000```
```select deptno from emp where sal=(select MAX(sal) from emp);```

-- 2.10號部門的平均工資 2916
```select avg(sal) from emp where deptno=(select deptno from emp where sal=(select MAX(sal) from emp));```


-- 3. 薪資最低的員工 所在部門  20
```select MIN(sal) from emp; --800```
```select deptno from emp where sal=(select MIN(sal) from emp);```

-- 4.20號部門的平均工資 2175
```select avg(sal) from emp where deptno=(select deptno from emp where sal=(select MIN(sal) from emp));```

-- 5. 10號部門 和 20號部門的平均工資
```select (10+20)/2;```

-- 6. 結果
select * from emp where sal > (2916+2175)/2;





<div class="se-preview-section-delimiter"></div>

```select * from emp where sal > (
                (select avg(sal) from emp where deptno=(select deptno from emp where sal=(select MAX(sal) from emp)))
                +
                (select avg(sal) from emp where deptno=(select deptno from emp where sal=(select MIN(sal) from emp)))
                )/2;

– 筆試題
create table test(
name char(20),
kecheng char(20),
fenshu char(20)
);
insert into test values(‘張三’,’語文’,81),
(‘張三’,’數學’,75),
(‘李四’,’語文’,76),
(‘李四’,’數學’,90),
(‘王五’,’語文’,81),
(‘王五’,’數學’,82);

– 請用一條Sql語句查處每門分數都大於80的學生
– 1.先查哪些人分數小於等於80

select name from test where fenshu <=80;

– 2.結果:

select * from test where name not in(select name from test where fenshu <=80);
select * from emp;

/*
什麼多表查詢: 一次查詢多張表
多表之間的關係如何維護: 外來鍵約束,foreign key , 約束一張表中的資料必須是參考另外一張表中的資料

      alter table product add foreign key(cno) references category(cid)

表關係的分類:
一對多|多對一: 在多的一方新增一列,指向一的一方,新增外來鍵約束
多對多: 插入一張中間表,中間表至少要有兩列,分別指向原來兩張表的主鍵, 將多對多的關係拆成了兩個一對多關係
一對一:
1.將兩張表建在同一張表中
2.將一對一的關係當作是一對多的關係,在多的一方新增的列要給它指定外來鍵約束和唯一約束
3.將兩張表的主鍵填寫一致

多表之間的查詢:
1.內連線查詢:

        select * from A , B where A.欄位 = B.欄位  (隱式內連線)
        select * from A inner join B on A.欄位 = B.欄位 (顯式內連線)

    2.左外連線:
            select * from A left outer join B on A.欄位 = B.欄位
    3.右外連線: 
        select * from A right outer join B on A.欄位 = B.欄位

子查詢: 查詢語句中巢狀查詢語句
*/