資料庫虛表
❶ 資料庫視圖運行為什麼是空表
視圖就是一個虛表,本身不存儲數據。根據查詢相關公開信息顯示,所有數據均存在於select操作涉及的每一張基礎表當中。
❷ Django裡面怎麼實現資料庫視圖啊 就是虛擬表
視圖相當於虛擬的表,可以使用正常sql語句進行增刪查改的操作,返回一張表。其實說白了與表的功能基本一樣。
觸發器,是在執行增 刪 改的時候觸發的一些SQL操作。可以在增刪改之後觸發 SQl,也可以在增刪改的時候替代SQL。有兩種不同的觸發模式而已。
一下是來自官方的標准解釋:
什麼是視圖?
在 SQL 中,視圖是基於 SQL 語句的結果集的可視化的表。
視圖包含行和列,就像一個真實的表。視圖中的欄位就是來自一個或多個資料庫中的真實的表中的欄位。我們可以向視圖添加 SQL 函數、WHERE 以及 JOIN 語句,我們也可以提交數據,就像這些來自於某個單一的表。
注釋:資料庫的設計和結構不會受到視圖中的函數、where 或 join 語句的影響。
SQL CREATE VIEW 語法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
注釋:視圖總是顯示最近的數據。每當用戶查詢視圖時,資料庫引擎通過使用 SQL 語句來重建數據。
觸發器是一種特殊類型的存儲過程,它不同於之前的我們介紹的存儲過程。觸發器主要是通過事件進行觸發被自動調用執行的。而存儲過程可以通過存儲過程的名稱被調用。
Ø 什麼是觸發器
觸發器對表進行插入、更新、刪除的時候會自動執行的特殊存儲過程。觸發器一般用在check約束更加復雜的約束上面。觸發器和普通的存儲過程的區別是:觸發器是當對某一個表進行操作。諸如:update、insert、delete這些操作的時候,系統會自動調用執行該表上對應的觸發器。SQL Server 2005中觸發器可以分為兩類:DML觸發器和DDL觸發器,其中DDL觸發器它們會影響多種數據定義語言語句而激發,這些語句有create、alter、drop語句。
DML觸發器分為:
1、 after觸發器(之後觸發)
a、 insert觸發器
b、 update觸發器
c、 delete觸發器
2、 instead of 觸發器 (之前觸發)
其中after觸發器要求只有執行某一操作insert、update、delete之後觸發器才被觸發,且只能定義在表上。而instead of觸發器表示並不執行其定義的操作(insert、update、delete)而僅是執行觸發器本身。既可以在表上定義instead of觸發器,也可以在視圖上定義。
觸發器有兩個特殊的表:插入表(instered表)和刪除表(deleted表)。這兩張是邏輯表也是虛表。有系統在內存中創建者兩張表,不會存儲在資料庫中。而且兩張表的都是只讀的,只能讀取數據而不能修改數據。這兩張表的結果總是與被改觸發器應用的表的結構相同。當觸發器完成工作後,這兩張表就會被刪除。Inserted表的數據是插入或是修改後的數據,而deleted表的數據是更新前的或是刪除的數據。
❸ 資料庫和數據表的聯系和區別是什麼
聯系:視圖(view)是在基本表之上建立的表,它的結構(即所定義的列)和內容(即所有數據行)都來自基本表,它依據基本表存在而存在。一個視圖可以對應一個基本表,也可以對應多個基本表。視圖是基本表的抽象和在邏輯意義上建立的新關系
區別:1、視圖是已經編譯好的sql語句。而表不是
2、視圖沒有實際的物理記錄。而表有。
3、表是內容,視圖是窗口
4、表只用物理空間而視圖不佔用物理空間,視圖只是邏輯概念的存在,表可以及時四對它進行修改,但視圖只能有創建的語句來修改
5、表是內模式,視圖是外模式
6、視圖是查看數據表的一種方法,可以查詢數據表中某些欄位構成的數據,只是一些SQL語句的集合。從安全的角度說,視圖可以不給用戶接觸數據表,從而不知道表結構。
7、表屬於全局模式中的表,是實表;視圖屬於局部模式的表,是虛表。
8、視圖的建立和刪除隻影響視圖本身,不影響對應的基本表。
❹ 資料庫里什麼是虛擬表
select * from a返回該表所有列
select bb from a返回該表bb對應的列
不懂你說的虛擬表什麼意思
❺ 資料庫常用查詢操作
--注釋
--select *|欄位名1,欄位名2... from 表名;
--1)
--查詢|檢索|獲取 所有員工的所有信息
--查詢的數據: 員工的所有信息
--數據的來源:員工表 emp
--條件:
select * from emp;
--2)
--查詢所有的員工名字
select ename from emp;
--3)
--查詢所有的員工編號和員工名稱,員工上級的編號
--查詢的數據: empno,ename,mgr
--數據的來源:員工表 emp
select empno,ename,mgr from emp;
--4)
--查詢所有部門部門編號
select deptno from dept;
--5)
--查詢出所有員工所在的部門的部門編號
select distinct deptno from emp;
--對查詢數據進行去重(非欄位去重) distinct
--6)
--查詢出所有存在員工的部門的部門編號,以及員工名稱
select deptno,ename from emp;
select distinct sal,deptno from emp;
--7)
--查詢表達式,結果是表達式的值,顯示的欄位名就是表達式,計算值
select 1+1 from emp;
select 'a' from emp;
--8)
--給欄位取別名 select 欄位1 (as) 別名1,欄位2 別名2 from 表名 別名; 表的別名不能加as
--查詢所有員工的名稱(別名為:名字),員工編號(編號)
--別名默認變大寫,別名中的內容原封不動出現 ""->中的內容原封不動出現
select 123+456 "get sum" from emp;
select empno as 員工編號,ename "員工 姓名" from emp;
--9)
--字元串 '' 原封不動顯示""
select distinct '哈哈' 笑 from emp e;
--10)
--字元串拼接 java中使用+ 這里使用||
--查詢 ab--cd 表達式
select distinct 'ab-'||'-cd' from emp;
--查詢所有的員工名字,給他們來一個前綴SXT
select 'sxt-'||ename from emp;
--11)
--偽列 : 不存在的列就是偽列 比如:表達式,字元串
--12)
--虛表: 在oracle中不存在的表,也可以說是這個表中沒有任何數據,沒有任何欄位 --oracle中的虛表:al
--虛表的作用:可以不使用distinct就可以去重的效果,因為裡面沒有數據,不會出現多行
select * from al;
select distinct 123*456 from emp;
select 123*456 from al;
select sysdate from al;
--比如查詢當前時間
--13)
--給每一個員工在原來的基礎上+100塊錢獎金
--null 空
--null與數字運算,結果還為null
--null與字元串運算,結果原串
--nvl(參數1,參數2) 處理null使用 如果參數1為null,最終結果參數2,如果參數1不為null,最終的結果就是參數1
select comm 原獎金,comm||'100' 新獎金 from emp;
select comm 原獎金,nvl(comm,0)+100 新獎金 from emp
--一節結尾小練習
--查詢所有員工的名字, 工種, 年薪(不帶獎金)
select ename,job,sal*12 年薪 from emp;
--查詢所有員工的名字,工種,年薪(帶12月獎金的)
select ename,job,(sal+nvl(comm,0))*12 年薪 from emp;
--查詢所有員工的名字, 工種, 年薪(帶一次獎金的)
select ename,job,sal*12+nvl(comm,0) 年薪 from emp;
--select *|表達式|字元串|偽列|欄位1 別名1,欄位2 as 別名2... from 表名 別名|結果集 where 行過濾條件;
--執行流程: from-->where-->select確定結果集
-- 查詢20部門的員工信息
--數據: *
--來源: emp
--條件: deptno=20
select * from emp where deptno=20;
-- > < >= <= = != <>
-- 查詢工資大於1000的員工的姓名 工作崗位 工資 所屬部門編號
--數據: ename,job,sal,deptno
--來源: emp
--條件: sal>1000
select ename,job,sal,deptno from emp where sal=1000;
-- 查詢不在20部門工作的員工信息
select * from emp where deptno != 20;
select * from emp where deptno <> 20;
--where 中不能使用欄位的別名
-- 查詢員工的年薪大於20000的 員工名稱、崗位 年薪
select ename 姓名,job 崗位,(sal+nvl(comm,0))*12 sum from emp where ((sal+nvl(comm,0))*12)>20000;
select ename 姓名,job 崗位,(sal+nvl(comm,0))*12 sum from emp;
select 崗位, sum
from (select ename 姓名, job 崗位, (sal + nvl(comm, 0)) * 12 sum from emp)
where sum > 20000;
-- 查詢 any(任意一個) some(任意一個) all(所有)
select * from emp where deptno = any(10,20);
select * from emp where deptno = some(10,20);
--大於最小的
select * from emp where sal> any(1500,2000); --薪資>1500的就可以
--大於最大的
select * from emp where sal> all(1500,2000); --薪資>2000的就可以
-- 查詢 工種不為』SALESMAN』的員工信息 (注意 內容區分大小寫)
select * from emp where not job ='SALESMAN';
--or或 and並且|都 not取反
-- -檢索 工資 1600, 3000員工名稱 崗位 工資
select ename,job,sal from emp where sal=1600 or sal=3000;
select ename,job,sal from emp where not (sal=1600 or sal=3000);
-- 工資在2000到3000之間的員工信息
select * from emp where sal>2000 and sal<3000;
--between 小范圍值 and 大范圍的值 兩者之間 <= >=
select * from emp where sal between 1600 and 3000;
---查詢 崗位 為 CLERK 且部門編號為 20的員工名稱 部門編號,工資
select ename ,deptno ,sal from emp where job='CLERK' and deptno=20;
-- 查詢 崗位 為 CLERK 或部門編號為 20的員工名稱 部門編號,工資
select ename ,deptno ,sal,job from emp where job='CLERK' or deptno=20;
--查詢 崗位 不是 CLERK 員工名稱 部門編號,工資
select ename ,deptno ,sal,job from emp where job!='CLERK';
select ename ,deptno ,sal,job from emp where not job='CLERK';
select ename ,deptno ,sal,job from emp where job<>'CLERK';
-- 查詢 崗位 不為 CLERK 並且部門編號不為 20的員工名稱 部門編號,工資
select ename ,deptno ,sal,job from emp where job!='CLERK' and deptno!=20;
select ename ,deptno ,sal,job from emp where not (job='CLERK' or deptno=20);
--存在佣獎金的員工名稱
select ename,comm from emp where not comm is null;
select ename,comm from emp where comm is not null;
--不存在獎金的員工名稱
select ename,comm from emp where comm is null;
--集合
--Union,並集(去重) 對兩個結果集進行並集操作,不包括重復行同時進行默認規則的排序;
--Union All,全集(不去重) 對兩個結果集進行並集操作,包括重復行,不進行排序 ;
--Intersect,交集(找出重復) 對兩個結果集進行交集操作,不包括重復行,同時進行默認規則的排序;
--Minus,差集( 減去重復 ) 對兩個結果集進行差操作,不包括重復行,同時進行默認規則的排序
--查詢工資大於1500 或 含有傭金的人員姓名
select ename,sal,comm from emp where sal>1500 or comm is not null;
select ename,sal,comm from emp where sal>1500;
select ename,sal,comm from emp where comm is not null;
--並集
select ename,sal,comm from emp where sal>1500
Union
select ename,sal,comm from emp where comm is not null;
select ename,sal,comm from emp where sal>1500
Union all
select ename,sal,comm from emp where comm is not null;
--查詢顯示不存在雇員的所有部門號。
--求出所有的部門號
select deptno from dept;
--有員工的部門號
select distinct deptno from emp;
select deptno from dept
Minus
select distinct deptno from emp;
-- 查詢顯示存在雇員的所有部門號。
select deptno from dept
Intersect
select distinct deptno from emp;
--模糊匹配 like %任意任意字元 _一個任意字元 一起使用
--查詢員工姓名中包含字元A的員工信息
select * from emp where ename like '%A%';
--完全匹配
select * from emp where ename like 'SMITH';
--查詢員工姓名以'A'結尾的員工信息
select * from emp where ename like 'A%';
--查詢員工姓名中第二個字母為A的員工信息
select * from emp where ename like '_A%';
insert into emp(empno,ename,sal) values(1000,'t_%test',8989);
insert into emp(empno,ename,sal) values(1200,'t_tes%t',8000);
--escape('單個字元')指定轉義符
--查詢員工姓名中包含字元%的員工信息
select * from emp where ename like '%B%%' escape('B');
--當執行插入數據,刪除數據,修改的時候,默認開啟事務
--可提交 commit
--可回滾 rollback
--多個人中任意一個值就可以
select * from emp where sal=1600 or sal=3000 or sal=1500;
select * from emp where sal in(1500,1600,3000);
--select 欄位.. from 結果集 where 行過濾條件 order by 排序欄位 desc降序|asc升序(默認)..;
--執行流程: from--> where-->select-->排序
select empno,ename,sal from emp order by sal desc,empno asc;
--按照獎金升序排序,如果存在null值,所有的獎金null值的數據最先顯示
select empno,ename,sal,comm from emp where deptno in (10,30) order by comm asc nulls first;
❻ 資料庫中的實表、虛表、臨時表的定義
實表是基本關系,又稱基本表或者基表,是實際存儲數據的邏輯表示,臨時表是查詢表,查詢結果對應的結果,視圖表是虛表有基本表或其他的表導出的表,不對應實際存儲的數據。