第六週筆記
第六週
週一
正規化
-
正規化是符合某一種級別的關係模式的集合
-
關係資料庫中的關係必須滿足一定的要求,滿足不同程度的要求的為不同正規化
-
正規化的種類:
- 第一正規化(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();
}
}