標籤:最大 同時存在 一對多 長度 有一個 控制 字元 順序 崗位
--max,min,sum,avg,count,nvl(,)
-- 彙總函式
-- max:最大值
-- max既能取數位最大值,也可以取字串的最大值(英文字母排列順序),根據情境實際意義來看,最好一條sql中只出現一次
select max(age) ,max(name) from teacher;
--min:最小值
select min(age) from teacher;
select min(name) from teacher;
--sum:求和:在求和函數中,只能計算數字類型, 並不能計算字串類型
select sum(age) from teacher;
select sum(name) from teacher;
--avg:平均值:也只能用於計算數字類型
select avg(age) from teacher;
select avg(name) from teacher;
--count(*),count(任一數字):擷取某張表的資料總條數
-- 在實際開發崗位中,一定要使用 count(1)不要去使用count(*)
select count(*) counts from teacher;
-- count(*)和select *執行效率很像:首先把所有的資料全部查出來(調用一次select * from xxx),然後進行統計總條數
select count(1) counts from teacher;
-- count(1):首先把表中的所有資料全部換成1,然後在進行統計總條數
-- nvl:如果查詢出的資料有null值,就給一個預設值
select name, age, nvl(description,‘我是預設值‘) from teacher;
-- 多表查詢
-- 首先把資料多的表全部查詢出來---->開始對應資料量少的表,然後把資料量少的表進行分組
select * from classes;
select * from teacher;
select * from teacher, classes;
-- 以classes為基準,查詢遍數:classes有多少條資料,就會查詢多少遍
-- 在實際開發中,from xxx,xxx,xx這種多表查詢決絕使用,因為效率非常低
select c.*, t.* from classes c, teacher t;
select t.id teahcer_id, t.description teacher_description, t.age teacher_age, t.name teahcer_name, t.hire_date teacher_hire_date, c.id classes_id, c.name classes_name, c.description classes_description from classes c, teacher t;
-- 多表查詢中,一旦給表起了一個別名,必須要使用別名來進行點列名(只有兩張表同時存在相同欄位的時候要使用別名點列名)
-- 字典表中 是不存在主鍵的
select c.*, t.* from classes c, teacher t where age = 33;
-- 查詢出兩張表id相同的資料內容
select c.* , t.* from classes c, teacher t where c.id = t.id;
-- 冒泡排序:把小的冒上來,大的壓下去
-- oracle也有自己的定序,類似於冒泡排序
select c.* , t.* from classes c, teacher t where c.id > t.id;
select c.name, t.name from classes c, teacher t group by c.name, t.name;
select * from teacher;
select * from classes;
-- 一對一,一對多,多對多
-- 這兩張表或多張表就必然存在一個聯絡
-- 一對一
--第一步:建立兩張表
--第二步:找這兩張表的關係(一對一,一對多,或者多對多)
-- 發現籍貫和人民存在一對一的關係
--第三步:建立外鍵(就是和另一張進行關聯的列),必須要指向另一張關聯表的主鍵,並且外鍵的列的類型一定要和指向主鍵的那一列的類型保持一致
-- 一對一關聯性的兩張表,外鍵是可以隨意建的,換句話說,外鍵建立在哪一張表都沒有關係
-- person表,id主鍵,native_place_id外鍵(外鍵的列類型一定要和native_place表中的主鍵id類型(長度)相同)
-- native_place表,id主鍵
select p.name, np.area from person p, native_place np where p.native_place_id = np.id;
-- 一對多
-- 第一步:建兩張表
-- employee/staff 員工表
-- department 部門表
-- 第二步:尋找這兩張表的關係(一對多,部門是一的一方,員工就是多的一方)
-- 第三步:建立外鍵
-- 外鍵需要建立在一的一方:以部門和員工表為例:會出現一個bug:一個部門只能擁有一個員工,雖然不違反文法,但是不符合邏輯思維
-- 在一對多的情況下,外鍵要建立在多的一方
-- 如果我需要查詢出所有的員工所屬於哪個部門
-- 有部門的員工:
-- select * from department d, staff s where d.staff_id = s.id;
-- 查詢所有員工:
select * from department d, staff s where d.id = s.department_id;
-- 查詢出各部門的員工人數
-- 第一步:查詢出部門
-- 第二步:查詢出該部門的關聯表
-- 第三步:需要把部門進行分組
select d.name, count(1) from department d, staff s where d.id = s.department_id group by d.name;
-- 多對多
-- 學生和課程
-- 首先建立兩張表
-- 分析這兩張表之間的關係(多對多)
-- 建立外鍵:外鍵建立在哪一張表都不合適
-- 建立外鍵:重新定義一張表來管理裡面的外鍵關係
-- 控制課程選擇的表就在第三張外鍵表
-- 就以學生表和課程表為例:
-- 第一步:把所有的學生存入學生表(並不知道學生會選擇什麼課程)
-- 第二步:把所有的課程存入課程表(並不知道這些課程會被哪些學生選擇)
-- 第三步:多對多的關係表(確定選擇課程的結果):確定哪些學生選擇了什麼課程,這些課程被哪些學生選擇了
-- 多對多關係表(insure):裡面只會放兩個欄位,並且沒有主鍵,這兩個欄位分別代表兩張表的主鍵(student_id--->stu_students表的id,class_id----->stu_class表的主鍵id)
select * from stu_students sst, stu_class sc, insure i where i.student_id = sst.id and i.class_id = sc.id;
java:Oracle()