1. 程式人生 > 其它 >第六週筆記

第六週筆記

第六週

週一

正規化

  • 正規化是符合某一種級別的關係模式的集合

  • 關係資料庫中的關係必須滿足一定的要求,滿足不同程度的要求的為不同正規化

  • 正規化的種類:

    • 第一正規化(1NF)
    • 第二正規化(2NF)
    • 第三正規化(3NF)
    • BC正規化(BCNF)

正規化的目的

1、消除冗餘

1NF第一正規化

表中沒有多值欄位

2NF 第二正規化

  • 不存在非關鍵欄位對任一侯選關鍵欄位的部分函式依賴

    選課表(學號、姓名、年齡、課程名稱、成績、學分) “不滿足”

  • 反過來說:在關係模式裡面,一個候選鍵能夠完全決定所有的非關鍵欄位

候選鍵:學號、課程名稱

非關鍵欄位:其餘全部

部分函式依賴:如成績

拆分後的關係 "滿足"

  • 學生(學生,姓名,年齡)
  • 課程(課程名稱,學分)
  • 選課表(學號,課程名稱,成績)

3NF 第三正規化

  • 沒有非關鍵欄位傳遞依賴主鍵

  • 非關鍵欄位只依賴於主鍵

    學生(學號,姓名,系名,系主任名)

沒有傳遞正規化就滿足第三正規化

  • 不符合第三正規化的需要拆分關係
    • 學生(學號,姓名,系名)
    • 系(系名,系主任名)

總結:一個關係模式就只描述一個事情

SQL

Oraacle體系結構

一個表空間可以建立多個使用者、一個使用者下可以建立多個表。

1、例項:一個數據庫可以有n個例項。

2、使用者:在例項下建立,是管理表的基本單位。

3、表空間:對資料檔案的邏輯對映。

4、資料檔案:.dbf、.ora檔案。 資料檔案是資料庫的物理儲存單位

5、表:

SQL> select instance_name from v$instance;

INSTANCE_NAME
--------------------------------
orcl

建立表空間

create tablespace 名字 datafile '路徑/stx.dbf' size 64m;

stx.dbf是表示檔名字

SQL> create tablespace stx datafile 'F:\Oracle\database\stx.dbf' size 64m;

表空間已建立。

建立使用者

create user 使用者名稱 identified by 密碼 default tablespace stx;

SQL> create user ljy identified by ljy123456 default tablespace stx;

使用者已建立。

授權

grant dba to 使用者名稱

SQL> grant dba to ljy;

授權成功。

SQL語法

SQL:{

DQL--->查詢 (R)

  • 基本查詢
  • 條件查詢
  • 排序
  • 聚合函式
  • 聯表

DML--->增、刪、改(C、D、U)

DDL

DCL

}

warchar2(10) utf-8一個漢字佔三個位元組

number

注:warchar2()、number() ()裡面都可能指定大小

建立表

create table 表名 (
id varchar2(128),
name varchar2(256),
gender varchar2(3)
);

簡單的查詢與條件查詢

-- 基本查詢
 -- 查詢所有資料資訊 
SELECT * FROM t_student;
-- 只查詢學生姓名和院系 -
SELECT stu_name , college FROM T_STUDENT;

--給欄位名起別名
SELECT stu_name 姓名,college 院系 FROM T_STUDENT;

--**************************************
-- 條件查詢 
-- 查詢所有男生
SELECT * FROM T_STUDENT WHERE  GENDER = '男';

SELECT * FROM t_student ts WHERE PROVINCE ='廣西';

-- 查詢分數在80-90之間的學生姓名和分數 
SELECT STU_NAME,SCORE FROM T_STUDENT WHERE SCORE >80 AND  SCORE < 90; 

-- 查詢姓名中包含宇的 
SELECT STU_NAME FROM T_STUDENT WHERE STU_NAME LIKE  '%宇%';

-- 查詢姓名只有兩個字的人 
SELECT stu_name, college , major FROM T_STUDENT WHERE stu_name LIKE '__';

週二

排序

--排序  降序:DESC  升序:預設不寫 或者ASC
SELECT STU_NAME ,SCOREFROM T_STUDENT ORDER BY SCORE DESC;

-- 2、按院系和成績排序
SELECT stu_name, college,SCORE FROM T_STUDENT ts ORDER BY COLLEGE asc, SCORE DESC ;

聚合函式

/* 聚合函式  去重:distinct*/
-- 1、統計學生個數
SELECT COUNT(1) 問天一部人數 FROM T_STUDENT ts ;
--count(xx) xx是表示我們要統計的欄位名   (一般是* 或者1 也能是具體的欄位名)
SELECT COUNT(STU_NAME) 問天一部人數 FROM T_STUDENT ts ;

--2、統計智慧工程學院有多少學生
SELECT COUNT(STU_ID) 智慧工程學院的人數 FROM t_student WHERE COLLEGE = '智慧工程學院';

--3、統計軟體工程專業有多少學生
SELECT COUNT(1) 軟體工程專業的人數 FROM T_STUDENT ts WHERE MAJOR = '軟體工程';

--4、統計有多少個院系   "去重複"  關鍵字:distinct 
SELECT COUNT(DISTINCT(college)) 院系個數 FROM T_STUDENT ts ;

--5、求平均分
SELECT avg(score) 平均成績 FROM T_STUDENT ts ;

分組查詢

分組關鍵字 :GROUP BY

having是用在group by 函式之後, where是放在group by前面 having是聚合函式,過濾的是我們查詢出來的結果

/*分組查詢  分組關鍵字 :GROUP BY*/
--1、統計每個院系有多少人   
SELECT college ,count(stu_id) FROM T_STUDENT ts GROUP BY COLLEGE ;
--1.1、統計每個院系有多少人並按照人數降序排列   
SELECT college ,count(stu_id) FROM T_STUDENT ts GROUP BY COLL	EGE ORDER BY count(stu_id) DESC ;

--2、統計各院系的平均分數
SELECT college , avg(score) 平均分數 FROM T_STUDENT ts GROUP BY COLLEGE ;

--3、統計各院系的平均分數,並按照平均分排序。
SELECT college ,avg(score) 平均分數 FROM T_STUDENT ts GROUP BY COLLEGE ORDER BY avg(score);

--3.1、統計各院系的平均分數取2位,並按照平均分排序。
SELECT college ,round(avg(score),2) 平均分數 FROM T_STUDENT ts GROUP BY COLLEGE ORDER BY avg(score);

--3.2、統計各專業的平均分數取2位,並按照平均分排序。
SELECT MAJOR ,round(avg(score),2) 平均分 ,COUNT(STU_ID) FROM T_STUDENT ts GROUP BY MAJOR ORDER BY avg(SCORE) desc;

--4、統計各院系的平均分數,只統計人數在2人以上的院系    having是用在group by 函式之後, where是放在group by前面 having是聚合函式,過濾的是我們查詢出來的結果
SELECT college ,COUNT(1) 人數, avg(score) 平均分 
FROM T_STUDENT ts GROUP BY college having count(1)>2 ;

閱讀ppt 303 where 與 having的區別

聯表查詢

週三

插入

insert into 表名 [(列名1,列名2)] values(值1,值2)

/*插入*/
--插入資料,不寫列名,預設為所有列插入資料,Values後面的值與列名一一對應
INSERT INTO T_COLLEGE VALUES ('1','遠景學院');
--插入資料,指定列名
INSERT INTO T_COLLEGE (college_name) VALUES ('大資料');
--把學生表裡的資訊插入college裡面 (院系不重複)
--插入資料,值來源於一個查詢結果集。語法有小差別,沒有values關鍵字
INSERT INTO T_COLLEGE (college_name)
SELECT DISTINCT (college) FROM T_STUDENT ts;

刪除

delete from 表名 [where....]

--刪除資料
DELETE FROM T_COLLEGE tc WHERE COLLEGE_ID = '1';
DELETE FROM T_COLLEGE tc WHERE COLLEGE_NAME = '大資料';

DELETE FROM T_COLLEGE tc ;

更新

--修改
UPDATE T_STUDENT SET COLLEGE_ID ='4' WHERE COLLEGE = '外國語學院';

UPDATE T_STUDENT  st ,T_COLLEGE  col 
SET st.COLLEGE_ID = col.COLLEGE_ID 
WHERE st.COLLEGE  = col.COLLEGE_NAME ;

UPDATE T_STUDENT SET COLLEGE_ID ='1' WHERE COLLEGE = '大資料與軟體學院';
UPDATE T_STUDENT SET COLLEGE_ID ='2' WHERE COLLEGE = '淬鍊商學院';
UPDATE T_STUDENT SET COLLEGE_ID ='3' WHERE COLLEGE = '通訊與物聯網工程學院';
UPDATE T_STUDENT SET COLLEGE_ID ='5' WHERE COLLEGE = '智慧工程學院';
UPDATE T_STUDENT SET COLLEGE_ID ='6' WHERE COLLEGE = '遠景學院';

語法差別:

-- mysql 語法
UPDATE T_STUDENT stu, T_COLLEGE col 
SET stu.COLLEGE_ID = col.COLLEGE_ID 
WHERE stu.COLLEGE = col.COLLEGE_NAME ;

-- oracle 語法一:
UPDATE T_STUDENT stu 
SET stu.COLLEGE_ID = (SELECT col.college_id 
FROM T_COLLEGE col WHERE col.COLLEGE_ID = stu.COLLEGE_ID)
WHERE EXISTS (SELECT 1 FROM T_COLLEGE col WHERE stu.COLLEGE_NAME = col.COLLEGE_NAME);

from多表查詢

注意欄位前加別名,防止多個表中都有該欄位

/* 多表查詢*/
--第一種錯誤,出現笛卡爾積
SELECT stu_name,college_name
FROM T_STUDENT ,T_COLLEGE tc ;

SELECT stu_name,college_name
FROM T_STUDENT stu,T_COLLEGE col 
WHERE stu.college_id = col.college_id;


--查詢每個學生成績 (Java基礎的成績) 三表連線
SELECT stu_name, course_name, ts2.SCORE 
FROM T_STUDENT ts ,T_COURSE tc ,T_SCORE ts2 
WHERE ts.STU_ID  = ts2.STU_ID  AND  tc.COURSE_ID  = ts2.COURSE_ID;	

內連線

注意欄位前加別名,防止多個表中都有該欄位

/*inner join 內連線*/
SELECT stu_name , college_name 
FROM T_STUDENT stu 
INNER JOIN T_COLLEGE col ON stu.COLLEGE_ID  = COL .COLLEGE_ID ;


--三表查詢
SELECT stu.stu_name, course.course_name , sc.score 
FROM T_STUDENT stu INNER JOIN t_score sc 
ON stu.STU_ID =sc.STU_ID 
INNER JOIN T_COURSE course 
ON course.COURSE_ID  = sc.COURSE_ID ;

週四

JDBC(Java Data Base Connectivity)

JDBC是一種規範

使用JDBC連線Oracle資料庫的步驟

0、將驅動jar包加到專案的classpath裡面

1、載入驅動 //在新版本中可省略

Class.forName("oracle.jdbc.driver.OracleDriver");

2、建立連線

DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "LJY", "ljy123456");

3、建立語句物件(與CRUD)

Statement stmt = connection.createStatement();

4、執行SQL語句

5、釋放資源 必須釋放

插入語句練習

public class InsertDemo {
    public static void main(String[] args) throws Exception {
//        1、裝載驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
//        2、建立連線
        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "LJY", "ljy123456");
//        3、建立語句物件
        Statement stmt = connection.createStatement();
//        4、執行SQL語句
        stmt.execute("insert into t_college values ('7','藝術傳媒學院')");
//        5、釋放資源
        stmt.close();
        connection.close();
    }
}

//3   4 有小變化的
    public static void main(String[] args) throws Exception {
//        1、裝載驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
//        2、建立連線
        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","LJY","ljy123456");
//        3、建立語句物件
        PreparedStatement statement = connection.prepareStatement("insert into t_college values ('8','藝術傳媒學院')");
//        4、執行SQL語句
        statement.execute();
//        5、釋放資源
        statement.close();
        connection.close();
    }

查詢語句練習

public class QueryDemo {
    public static void main(String[] args) throws Exception {
        //裝載驅動
        Class.forName("oracle.jdbc.OracleDriver");
        //建立連線
        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "LJY", "ljy123456");
        //建立語句物件
        String sql = "select college_name from t_college";
        PreparedStatement statement = connection.prepareStatement(sql);
        //執行sql
        ResultSet resultSet = statement.executeQuery();
        while (resultSet.next()) {
            System.out.println(resultSet.getString("college_name"));
        }
        resultSet.close();
        statement.close();
        connection.close();
    }
}