<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## Java數據庫基礎--以SQL?Server為例 ### sql?server數據庫基本概念 使用文件保存數據存在幾個缺點: 1、文件的安全性問題; 2、文件不利于查詢和對數據的管理; 3、文件不利于存放海量數據 4、文件在程序中控制不方便。 ? ### 數據庫的定義(1) 嚴格地說,數據庫是“按照數據結構來組織、存儲和管理數據的倉庫”。在經濟管理的日常工作中,常常需要把某些相關的數據放進這樣的“倉庫”,并根據管理的需要進行相應的處理。例如,企業或事業單位的人事部門常常要把單位職工的基本情況(職工號、姓名、年齡、性別、籍貫、工資、簡歷等)存放在表中,這張表就可以看成一個數據庫。有了這個“數據倉庫”我們就可以根據需要隨時查詢某職工的基本情況,也可以查詢工資在某個范圍內的職工人數等等。這些工作如果都能在計算機上自動進行,那我們的人事管理就可以達到極高的水平。此外,在財務管理、倉庫管理、生產管理中也需要建立眾多的這種“數據庫”,使其可以利用計算機實現財務、倉庫、生產的自動化管理。 ? ### 數據庫的定義(2) J.Martin給數據庫下了一個比較完整的定義:數據庫是存儲在一起的相關數據的集合,這些數據是結構化的,無有害的或不必要的冗余,并為多種應用服務;數據的存儲獨立于使用它的程序;對數據庫插入新數據,修改和檢索原有的數據均能按一種公用的和可控制的方式進行。當某個系統中存在結構上完全分開的若干個數據庫時,則該系統包含一個“數據庫集合”。 ? ### 數據庫的基本結構 數據庫的基本結構分三個層次,反映了觀察數據庫的三種不同角度。 1、物理數據層 ????它是數據庫的最內層,是物理存貯設備上實際存儲的數據的集合。這些數據的原始數據,是用戶加工的對象,由內部模式描述的指令操作處理的位串、字符和字組成。 2、概念數據層 ????它是數據庫的中間一層,是數據庫的整體邏輯表示。指出了每個數據的邏輯定義及數據間的邏輯聯系,是存貯記錄的集合。它所涉及的是數據庫所有對象的邏輯關系,而不是它們的物理情況,是數據庫管理員概念下的數據庫。 3、邏輯數據層 ????它是用戶所看到和使用的數據庫,表示了一個或一些特定用戶使用的數據集合,即邏輯記錄的集合。 數據庫不同層次之間的聯系是通過映射進行轉換的。 ? ### 數據庫的基本特點 1、實現數據共享 ????數據共享包含所有用戶可同時存取數據庫中的數據,也包括用戶可以用各種方式通過接口使用數據庫,并提供數據共享。 2、減少數據的冗余度 ????同文件系統比,數據庫實現了數據共享,從而避免了用戶各自建立應用文件。減少了大量重復數據,減少了數據冗余,維護了數據的一致性 3、數據實現集中控制 ????文件管理方式中,數據處于一種分散的狀態,不同的用戶或同一用戶在不同處理中其文件之間毫無關系。利用數據庫可對數據進行集中控制和管理,并通過數據模型表示各種數據的組織以及數據間的聯系。 4、數據一致性和可維護性,以確保數據的安全性和可靠性。 5、故障恢復 ? ### 目前主流數據庫 微軟: Sql?Server和Access 瑞典MySQL: AB公司MySql IBM公司: DB2和Informix 美國Sybase公司: Sybase 美國Oracle公司: Oracle ? 數據庫選擇: 1、成本;2、功能;3、并發性要求;4、安全性; ? ? ### sql?server介紹(1) SQL是英文Structured?Query?Language的縮寫,意思為結構化查詢語言。SQL語言的主要功能就是同各種數據庫建立聯系,進行溝通。按照ANSI(美國國家標準協會)的規定,SQL被作為關系型數據庫管理系統的標準語言。SQL語句可以用來執行各種各樣的操作,例如更新數據庫中的數據,從數據庫中提取數據等。目前,絕大多數流行的關系型數據庫管理系統,如Oracle、Sybase、Microsoft?SQL?Server、Access等都采用了SQL語言標準。 ? ### sql?server介紹(2) SQL?Server是一個關系數據庫管理系統。它最初是由Microsoft?Sybase和Ashton-Tate三家公司共同開發的,于1988年推出了第一個OS/2版本。在Windows?NT推出后,Microsoft與Sybase在SQL?Server的開發上就分道揚鑣了,Microsoft將SQL?Server移植到Windows?NT系統上,專注于開發推廣SQL?Server的Windows?NT版本。Sybase則較專注于SQL?Server在UNIX操作系統上的應用。 ? ? 企業管理器的使用(PS:比較簡單,不再贅述) ? ### 查詢分析器的使用(1) ????企業管理器給用戶提供了一個很方便的圖形界面管理工具,用起來感覺直觀方便,可是它也有缺點,當一個表的記錄非常大的時候,對表的各種操作,都顯得不方便了,比如: 1、要求從1000行記錄中查詢是否存在名為“孫小明”的人 2、要求把1000行記錄中工資低于100的人,工資增加10% 3、要求把年齡大于30的人從數據表中刪除 這時,會發現使用企業管理器是很不方便的 所以微軟為我們提供另外一個操作數據庫的工具,查詢分析器。查詢分析器可以非常方便的完成上述任務。 ? ### 查詢分析器的使用(2)--sql語句 SQL全稱是“結構化查詢語言(Structured?Query?Language)”。 SQL(Structured?Query?Language)是一種數據庫查詢和程序設計語言,用于存取數據以及查詢、更新和管理關系數據庫系統。結構化查詢語言(Structured?Query?Language)最早是IBM的圣約瑟研究實驗室為其關系數據庫管理系統SYSTEM?R開發的一種查詢語言,它的前身是SQUARE語言。SQL語言結構簡潔,功能強大,簡單易學,所以自從IBM公司1981年推出以來,SQL語言得到了廣泛的應用。如今無論是像Oracle、Sybase、Informix、SQL?Server這些大型的數據庫管理系統,還是像Visual?Foxpro、PowerBuilder這些PC上常用的數據庫開發系統,都支持SQL語言作為查詢語言。 ? ? ### 查詢分析器的使用(3)--sql語句 SQL語言包含4個部分: 數據定義語言(DDL),例如:CREATE、DROP、ALTER等語句。 數據操作語言(DML),例如:INSERT、UPDATE、DELETE語句。 數據查詢語言(DQL),例如:SELECT語句。 數據控制語言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等語句。 ? ### 查詢分析器的使用(4)--實例 ? ~~~ --創建數據庫 create database LiangshanHero; --使用數據庫 use LiangShanHero; --創建表 create table hero ( heroId int, --排名 heroName varchar(50), --名字 heroNickName varchar(50), --外號 sex char(2) --性別 ); alter table hero add sal int; --添加薪水屬性 --使用SQL語句來添加數據 insert into hero values(1, '宋江', '及時雨', '男'); insert into hero values(2, '盧俊義', '玉麒麟', '男'); insert into hero values(3, '吳用', '智多星', '男'); insert into hero values(4, '公孫勝', '入云龍', '男'); --使用SQL語句來修改數據 update hero set sal = 20000 where heroid = 1; update hero set sal = 15000 where heroid = 2; update hero set sal = 10000 where heroid = 3; update hero set sal = 13000 where heroid = 4; --使用SQL語句來查詢數據 select * from hero; --查詢工資低于的人 select * from hero where sal < 15000; --把工資低于的人,工資提高% update hero set sal = sal * 1.1 where sal < 15000; --刪除性別為女的人 delete from hero where sex = '女'; ~~~ ### 表的管理--表名和列的命名規則 1、必需以字母,_開頭,例如:ta,_ta 2、長度不能超過128個字符 3、不要使用sql?server的保留字 4、只能使用如下字符A-Z,a-z,0-9,$,#,_等 ? ### 表的管理--支持的數據類型 ### 字符型(非unicode編碼) char?定長?最大8000字符(非unicode編碼) char(10)'Switch'前5個字符放'Switch',后添5個空格補全 varchar?變長?最大8000字符(非unicode編碼) varchar(10)'Switch'sql?server分配5個字符,這樣可以節省空間 ntext可變長度Unicode數據的最大長度為2的30次方-1(1,073,741,823)個字符 text可變長度非Unicode數據的最大長度為2的31次方-1(2,147,483,647)個字符 區別: 1、text是字節格式存儲英文的,也可以存中文但有時候會顯示成亂碼 2、ntext是多字節格式存儲unicode的,也就是存儲各種文字用的。 在什么時候使用char型而不使用varchar,在知道字段定長固定時就使用char ? ### 字符型(unicode編碼) nchar?定長?最大4000字符(unicode編碼) nchar(20)'Switch'前10個字符放'Switch',后添10個空格補全 nvarchar?變長?最大4000字符(unicode編碼) nvarchar(20)'Switch'sql?server分配10個字符,這樣可以節省空間 特別說明: 1、一般帶有漢字的字段用nvarchar,全英文或符號的用varchar,因為nvarchar為unicode字符集,該類型的字段無論是單個字母還是單個漢字都占兩個字節,而varchar,字母占一個字節,漢字占兩個,nvarchar處理漢字或其它unicode字符集的速度要比varchar字段快。 2、如果有一些特殊字符在nvarchar中沒有的,如日文的某些字符,那當然只能選合適的代碼頁用varchar了,而且這些特有語言特有的字符轉換到nvarchar會消失 ? ### 數字型 1、bit?范圍?0到1 2、int?范圍?負的2的31次方到正的?2的31次方-1 3、bigint?范圍?負的2的63次方到正的?2的63次方-1 4、float?存放小數,不推薦使用 5、numeric?小數 強烈建議?如果要去存放小數最好使用numeric ? ### 日期類型 datetime(表示日期) timestamp(時間戳) 一般情況下?用datetime表示日期 --sql?server為我們提供一個專門的時間函數getdate() ~~~ create table ta--建表 (bir datetime)--字段 insert into ta values(getdate())--添加時間 ~~~ ### 圖片 image保存圖片,但是用的很少,一般用路徑保存圖片,在軟件公司往往使用圖片服務器和圖床技術 ? ### 視頻 binary字段可以存放,但是往往將視頻文件保存在文件服務器上,sql?server中只保留文件路徑,這樣存取效率高。 ? ? ### 表的管理--添加數據 插入部分字段(語法) insert?into?表名?(字段名1,字段名2,...)?values?(對應字段數據1,對應字段數據2,...) ? ### 表的管理--修改數據 修改一個字段(語法) update?表名?set?字段名='新值'?where?字段='值' 例: ? ~~~ update student set sex='女' where xh='A001' update clerk set age=38 where cleName='賈政' ~~~ 修改多個字段(語法) update?表名?set?字段名1='新值',字段名2='新值'...?where?字段='值' 例: ? ~~~ update student set sex='男',birthday='1980-04-01' where xh='A001' update clerk set cleName='薛蟠',age=40 where cleId=2 ~~~ 修改含有null值的數據(語法) update?表名?set?字段名='新值'?where?字段?is?null 例: ? ~~~ update clerk set cleName='薛寶釵' where age is null ~~~ ### 表的管理--刪除數據 刪除全部數據 delete?from?表名 ? 刪除指定數據 delete?from?表名?where?字段名='值' ? 刪除多個指定數據 delete?from?表名?where?字段名1='值'?and?字段名2='值'?and或or?... ? ### 表的管理--修改表 添加一個字段 ? ~~~ ALTER TABLE distributors ADD COLUMN address varchar(30); ~~~ 修改字段的類型/或是名字(不能有數據) ~~~ ALTER TABLE distributors ALTER COLUMN address TYPE varchar(80), ALTER COLUMN name TYPE varchar(100); ALTER TABLE distributors RENAME COLUMN address TO city; ~~~ 刪除一個字段 ? ~~~ ALTER TABLE distributors DROP COLUMN address RESTRICT; ~~~ 修改表的名字 ~~~ ALTER TABLE distributors RENAME TO suppliers; ~~~ 刪除表 drop?table?表名; ### 主鍵和外鍵 主鍵,一張表中只能有一個主鍵 1、主鍵(primary?key),不能夠重復出現; 2、主鍵必需給值,換言之主鍵不能為null 3、主鍵可以修改,但不能修改為同名的,同時要明確字段不有重復,否則報錯。 ? 外鍵 1、外鍵只能指向主鍵 2、外鍵和主鍵的數據類型要一致 ? ### 員工管理系統 PS:之后很多例子都是基于下面所建數據庫和表的 ~~~ ---創建dept表 create table dept ( deptno int primary key, --部門編號 dname nvarchar(30), --部門名稱 loc nvarchar(30) --所在地 ); --創建emp表 create table emp ( empno int primary key, --員工編號 ename nvarchar(30), --員工姓名 job nvarchar(30), --員工職位 mgr int, --上級編號 hiredate datetime, --入職日期 sal numeric(8, 2), --薪水 comm numeric(8, 2), --獎金 deptno int foreign key references dept(deptno) --deptno是外鍵 ); --外鍵 --①外鍵引用的鍵必須是主鍵 --②外鍵的數據類型必須和引用的主鍵數據類型一致 --向dept表中添加數據 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'); --向emp表中添加數據 insert into emp (empno,ename,job,mgr,hiredate,sal,deptno) values (7369,'smith','clerk',7902,'1980-12-17',800.00,20); insert into emp values(7499,'allen','salesman',7698,'1981-2-20',1600.00,300.00,30); insert into emp values(7521,'ward','salesman',7698,'1981-2-22',1250.00,500.00,30); insert into emp (empno,ename,job,mgr,hiredate,sal,deptno) values (7566,'jones','manager',7839,'1981-4-2',2975.00,20); insert into emp values(7654,'martin','salesman',7698,'1981-9-28',1250.00,1400.00,30); insert into emp (empno,ename,job,mgr,hiredate,sal,deptno) values (7698,'blake','manager',7839,'1981-5-1',2850.00,30); insert into emp (empno,ename,job,mgr,hiredate,sal,deptno) values (7782,'clark','manager',7839,'1981-6-9',2450.00,10); insert into emp (empno,ename,job,mgr,hiredate,sal,deptno) values (7788,'scott','analyst',7566,'1987-4-19',3000.00,20); insert into emp (empno,ename,job,hiredate,sal,deptno) values (7839,'king','president','1981-11-17',5000.00,10); insert into emp values (7844,'turner','salesman',7698,'1981-9-8',1500.00,0.00,30); insert into emp (empno,ename,job,mgr,hiredate,sal,deptno) values (7876,'adams','clerk',7788,'1987-5-23',1100.00,20); insert into emp (empno,ename,job,mgr,hiredate,sal,deptno) values (7900,'james','clerk',7698,'1981-12-3',950.00,30); insert into emp (empno,ename,job,mgr,hiredate,sal,deptno) values (7902,'ford','analyst',7566,'1981-12-3',3000.00,20); insert into emp (empno,ename,job,mgr,hiredate,sal,deptno) values (7934,'miller','clerk',7782,'1982-1-23',1300.00,10); ~~~ ### 表的簡單查詢 ~~~ --表的簡單查詢 --查詢部門信息 select * from dept; --查詢員工信息 select * from emp; --查詢SMITH的薪水,工作,所在部門 select sal, job, deptno from emp where ename = 'SMITH'; --查詢員工表中有多少個部門 --distinct會消除全部屬性一樣的行,只保留一行 select distinct deptno from emp; select distinct deptno, ename from emp; --顯示每個員工的年工資 --as后面是別名,可以不加as,別名也可以不加引號 --四則運算,空值問題,用isnull()解決 select ename, (sal * 12) + isnull(comm * 12, 0) as '年工資' from emp; --顯示工資高于3000的員工 select * from emp where sal > 3000; --查找.1.1以后入職的員工 select * from emp where hiredate > '1982-1-1'; --顯示工資在到的員工 select * from emp where sal > 2000 and sal < 2500; --between A and B表示A >= X <= B select * from emp where sal between 2001 and 2499; --顯示首字符為S的員工的姓名和工資 select ename, sal from emp where ename like 'S%'; --顯示第三個字符是O的員工姓名和工資 select ename, sal from emp where ename like '__O%'; --顯示empno為123,345,800的員工 select * from emp where empno = 123 or empno = 345 or empno = 800; select * from emp where empno in(123, 345, 800); --查詢沒有上級的員工 select * from emp where mgr is null; --查詢工資高于或者是崗位為MANAGER的員工,并且姓名首字母為J select * from emp where (sal > 500 or job = 'MANAGER') and ename like 'J%'; --按照工資從低到高顯示員工 --order by ASC 默認升序 --order by DESC 降序 select * from emp order by sal ASC; --按照入職先后順序顯示員工 select * from emp order by hiredate ASC; --按照名字升序排列 select * from emp order by ename ASC; --按照部門升序,員工的工資降序顯示 --order by 可以根據不同的字段排序,order by a, b; select * from emp order by deptno ASC, sal DESC; --算出每個人的年薪,并按照升序顯示 select ename, sal * 13 + isnull(comm * 13, 0) as '年薪' from emp order by '年薪' ASC; ~~~ ### 表的復雜查詢 數據分組?-max(最大),min(最小),avg(平均),sum(和),count(統計) group?by和having子句 group?by用于對查詢的結果分組統計 having子句用于限制分組顯示結果 ~~~ --表的復雜查詢 --顯示所有員工中工資最高的員工 select ename, sal from emp where sal = ( select max(sal) as '最高薪水' from emp); --顯示所有員工中工資最低的員工 select ename, sal from emp where sal = ( select min(sal) as '最低薪水' from emp); --顯示所有員工的平均工資和總工資 select avg(sal) as '平均工資', sum(sal) as '總工資' from emp; --把高于平均工資的員工的名字和工資顯示 select ename, sal from emp where sal > (select avg(sal) from emp); --顯示員工名并顯示平均工資 select ename, sal,(select avg(sal) from emp) as '平均工資' from emp where sal > (select avg(sal) from emp ); --計算一共有多少員工 select count(*) as '員工總數' from emp; --顯示每個部門的平均工資和最高工資 select deptno,avg(sal) as '平均工資', max(sal) as '最高工資' from emp group by deptno; --顯示每個部門的每個崗位的平均工資和最低工資 select deptno, job, avg(sal) as '平均工資', min(sal) as '最低工資' from emp group by deptno, job order by deptno ASC, '平均工資' DESC; --顯示平均工資低于2000的部門號和平均工資 --group by ... having ... having是對分組后的數據進行篩選 select deptno, avg(sal) as '平均工資' from emp group by deptno having avg(sal) < 2000; ~~~ 對數據分組的總結 1、分組函數只能出現在選擇列表,having、order?by子句中 2、如果在select語句中同時包含有group?by,having,ovrder?by那么他們的順序是group?by,having,order?by 3、在選擇列中如果有列、表達式、和分組函數,那么這些列和表達式必需有一個出現在group?by子句中,否則就會出錯 4、如果想在分組情況下,選擇列中顯示某列,那么這行必須要在group?by子句中,否則會出錯 如:select?deptno,avg(sal),max(sal)?from?emp?group?by?deptno?having?avg(sal)<2000 這里deptno就一定要出現在group?by中 ### 表的復雜查詢--多表查詢 ????多表查詢是指基于兩個或兩個以上的表或是視圖的查詢,在實際應用中,查詢單個表可能不能滿足需求,(如顯示sales部門位置和其員工的姓名),這種情況下需要使用到(dept表和emp表) ~~~ --多表查詢 --如果多張表都有相同名字的字段,則需要帶表名(別名) --顯示sales部門位置和其員工的姓名 select loc, ename from dept, emp where dname = 'sales' and dept.deptno = emp.deptno; --顯示員工名,部門名和部門編號 --連接的表中有相同的字段,需要帶表名(別名) select dept.deptno, dname, ename from dept, emp where dept.deptno = emp.deptno; --顯示部門號為10的部門名,員工名和工資 select d.deptno, e.ename, e.sal from emp e, dept d where e.deptno = d.deptno and d.deptno = 10; --顯示員工名,員工工資及所在部門的名稱,并按部門排序 select e.ename, e.sal, d.dname from emp e, dept d where e.deptno = d.deptno order by d.deptno; ~~~ ### 表的復雜查詢--自連接查詢 自連接是指在同一張表的連接查詢 ~~~ --自關聯查詢,內連接 --顯示'FORD'的上級領導的姓名 select e2.ename from emp e1, emp e2 where e1.mgr = e2.empno and e1.ename = 'FORD'; --顯示每個員工的名字和他的上級姓名 select e1.ename,e2.ename from emp e1 emp e2 where e1.mgr = e2.empno; ~~~ ### 表的復雜查詢--子查詢 子查詢是批嵌入在其它sql語句中的select語句,也叫嵌套查詢 ? #### 單行子查詢 單行子查詢是指子查詢只返回一行數據的子查詢語句 ~~~ --顯示與SMITH同一部門的所有員工 select * from emp where deptno = (select deptno from emp where ename = 'SMITH'); ~~~ #### 多行子查詢 多行子查詢指子查詢返回多行數據的子查詢 ~~~ --查詢和部門10的工作相同的員工的名字 select ename from emp where job = any(select distinct job from emp where deptno = 10); select ename from emp where job in(select distinct job from emp where deptno = 10); --查詢和部門的工作相同的員工的名字并且不包括號部門的員工 select ename from emp where job in(select distinct job from emp where deptno = 10) and deptno != 10; ~~~ #### 在from子句中使用子查詢 當在from子句中使用子查詢時,該子查詢會被作為一個臨時表來對待,當在from子句中使用子查詢時,必需給子查詢指定別名 ~~~ --顯示高于部門平均工資的員工的信息 select emp.ename, emp.deptno, emp.sal from emp, (select deptno, avg(sal) as '部門平均工資' from emp group by deptno) e2 where emp.deptno = e2.deptno and emp.sal > e2.部門平均工資; ~~~ ### 分頁查詢 ~~~ --顯示第5個到第10個入職的員工(按照時間的先后順序) --top后面的數表示要取出幾條記錄 select top 6 * from emp where empno not in (select top 4 empno from emp order by hiredate) order by hiredate; --顯示第11個到第13個入職的員工(按照時間的先后順序) select top 3 * from emp where empno not in (select top 10 empno from emp order by hiredate) order by hiredate; --顯示第5個到第9個員工(按照薪水的降序) select top 5 * from emp where empno not in (select top 4 empno from emp order by sal DESC) order by sal DESC; --演示分頁性能,PS:可以試試看自己電腦性能怎樣 --第一步:建一個表 --第二步:利用一條語句成指數增長插入數據 --第三步:測試查詢全部的時間 --第四步:測試分頁查詢的時間 --第一步:建表 create table test ( tId int primary key identity(1, 1), --自增主鍵 tName varchar(30), --賬號 tPass varchar(30) --密碼 ); --第二步:插入數據 insert into test values('test','test'); --指數增長復制插入,一共插入w+記錄 insert into test(tName, tPass) select tName,tPass from test; --第三步:查詢全部的時間 --查詢全部信息用時:45s select * from test; --查詢tId 用時:39s select tId from test; --第四步:查詢分頁的時間 --查詢第100-105的數據按照id排序用時:0.1s select top 6 * from test where tId not in (select top 99 tId from test); --查詢第500000-550000的數據按照id排序用時:6s select top 50001 * from test where tId not in (select top 499999 tId from test); --刪除一張表的重復記錄 --把test的記錄distincth后的結果,放入#temp select distinct tName, tPass into #temp from test --清除test中數據表 delete from test --把#temp表的數據(沒有重復記錄),插入到test表中 insert into test(tName, tPass) select tName, tPass from #temp --刪除#temp drop table #temp; ~~~ ### 表的復雜查詢--外連接查詢 ~~~ --顯示每個員工和他上級的名字,沒有上級的人,也要顯示出來 --左外連接:指左邊的表的記錄全部顯示,如果沒有匹配的記錄就用NULL填寫 select e1.ename as '下級', e2.ename as '上級' from emp e1 left join emp e2 on e1.mgr = e2.empno; --右外連接:指右邊的表的記錄全部顯示,如果沒有匹配的記錄就用NULL填寫 select e1.ename as '下級', e2.ename as '上級' from emp e1 right join emp e2 on e1.mgr = e2.empno; ~~~ ### 維護數據的完整性--約束 約束用于確保數據庫數據滿足特定的規則。在sql?server和oracle中,約束包括:not?null、unique,primary?key,foreign?key和check五種 ? ### 維護數據的完整性--使用 ### not?null(非空) 如果在列上定義了not?null,那么當插入數據時,必需為列提供數據。 ~~~ --約束機制--not null(非空) --創建一張表 create table test1 ( test1Id int primary key identity(1,1), testname varchar(30) not null,--not null不能為空 testpass varchar(30) not null, testage int --不寫代表可以為空 ) create table test1 ( test1Id int primary key identity(1,1),--identity(1,1)自增長1條記錄 testname varchar(30), testpass varchar(30), testage int --不寫代表可以為空 ) --刪除表 drop table test1 --向表插入數據 insert into test1 (testage) values (3) insert into test1 (testname,testpass,testage) values ('','',5)--''空與null空是不一樣的 --查詢表內容 select * from test1 ~~~ ### unique(唯一)(一張表中可以有多個) 當定義了唯一約束后,該列值是不能重復的,但是可以為null,并只能有一個空值 ~~~ --約束機制--unique(唯一) --建表 create table test2 ( test2Id int primary key identity(1,1),--identity(1,1)自增長1條記錄 testname varchar(30) unique, --unique唯一的,數據不允許重復,但可以為空 testpass varchar(30), testage int --不寫代表可以為空 ) insert into test2 (testname,testpass,testage) values ('aa','123',45) insert into test2 (testpass,testage) values ('123',45) select * from test2 ~~~ ### primary?key(主鍵)(一張表中只可以有一個主鍵) 用于唯一的標示表行的數據,當定義主鍵約束后,該列不但不能重復而且不能為null 需要說明的是:一張表最多只能有一個主鍵,但是可以有多個unqiue約束。 表可以有復合主鍵,有多個列構成一個主鍵 ~~~ --復合主鍵 create table test3 (testId int, testname varchar(30), testpass varchar(30), testage int, primary key (testId,testname)--復合主鍵,需單獨聲明 ) --行級定義和表級定義 create table test4 (testId int,--在字段中定義主鍵為行級定義.例:testId int primary key testname varchar(30), testpass varchar(30), testage int, primary key (testId,testname)--復合主鍵,需單獨聲明為表級定義 ) ~~~ ### foreign?key(外鍵)(外鍵在從表上,要配合主表,但主表要有主鍵或unique約束) 用于定義主表和從表之間的關系。外鍵約束要定義在從表上,主表則必需具有主鍵約束或是unique約束,當定義外鍵約束后,要求外鍵列數據必需在主表的主鍵列存在或是null ? ### check(強制條件) 用于強制行數據必需滿足的條件,假定在sal列上定義了check約束,并要求sal列值在1000-2000之間如果不再1000-2000之間就會提示出錯。 ~~~ --check(強制條件) create table test5 (testId int, testname varchar(30), testpass varchar(30), sal int check(sal>=1000 and sal<=2000),--規定sal的值在1000-2000之間 ) insert into test5 values (4,'aa','aa',1200)--可以加入sal值在范圍之內 insert into test5 values (5,'bb','bb',2200)--不可加入sal值在范圍之外 select * from test5 ~~~ ### default使用(默認值) ~~~ --default使用 create table mes (mesId int primary key identity(1,1), mesccn varchar(2000) not null, mesDate datetime default getdate()--在不指定值是default可以直接取默認值,也可以由用戶指定值 ) insert into mes(mesccn) values('abc') insert into mes(mesccn,mesDate) values('cba','1976-1-6') select * from mes ~~~ ### 商店售貨系統表設計案例 ????現有一個商店的數據庫,記錄客戶及其購物情況,由下面三個表組成: 商品goods(商品號goodsId,商品名goodsName,單價unitprice,商品類別category,供應商provider); 客戶customer(客戶號customerId,姓名name,住址address,電郵email,性別sex,身份證cardId); 購買purchase(客戶號customerId,商品號goodsId,購買數量nums); 請使用sql語言完成下列功能: 1、建表,在定義中要求聲明: 1、每個表的主外鍵; 2、客戶的姓名不能為空值; 3、單價必需大于0,購買數量大于0; 4、電郵不能夠重復; 5、客戶的性別必需是男或者女,默認為男 6、商品類別是'食物','日用品' ~~~ --商店收貨系統表設計 --goods表 create table goods ( goodsId nvarchar(50) primary key, --商品號 goodsName nvarchar(100) not null, --商品名 unitprice numeric(8, 2) check(unitprice > 0), --單價 category nvarchar(3) check(category in('食物', '日用品')), --商品類別,只能在食物或者日用品中 provider nvarchar(50) --供應商 ); --customer表 create table customer ( customId nvarchar(50) primary key, --客戶號 cusname nvarchar(50) not null, --客戶名 address nvarchar(100), --地址 email nvarchar(100) unique, --電子郵件 sex nchar(1) check(sex in('男','女')) default '男', --性別 cardId nvarchar(18) --身份證號 ); --purchase表 create table purchase ( customId nvarchar(50) foreign key references customer(customId), --客戶號 goodsId nvarchar(50) foreign key references goods(goodsId), --商品號 nums int check(nums >0) --數量 ); ~~~ ### 數據庫的備份和恢復 ### 使用企業管理器完成備份和恢復 使用企業管理器有兩種方式完成備份和恢復 #### 1、分離/附加 ????分離完后,請到sql?server安裝的目錄下去找兩個文件數據庫名.mdf和數據庫名.ldf,這兩個文件就是分離后的文件,數據庫分離后,該數據庫就不能再使用了。 ????附加是指,當用戶需要重新使用某個分離的數據庫時進行的操作,就是讓sql?server數據庫重新關聯該數據庫。 ? #### 2、備份/恢復 ????備份數據庫是指,把某個數據庫文件從sql?server中備份出來,這樣用戶可以根據需要再使用(用于恢復、復用..),備份數據庫不會影響到源數據庫的使用 ????恢復數據庫是指,當源數據庫因為某種原因(比如源數據庫毀壞、數據丟失、系統崩潰)需要恢復時進行的操作 ? ### 使用查詢分析器完成備份和恢復 用企業管理器完成對數據庫的備份和恢復簡單直觀,同樣也可以在查詢分析器中完成類似的任務。而且這樣的好處是在主語言比如JAVA,C++連接好數據庫之后,可以實現對數據庫的定時備份、恢復等。 ~~~ --備份數據庫 --語法:backup database 數據庫名 to disk='存儲路徑' backup database LiangshanHero to disk='C:/LiangshanHero.bak'; --恢復數據庫 --語法:restore database 數據庫名 from disk='讀取路徑' restore database LiangshanHero from disk='C:/LiangshanHero.bak'; --新建數據庫 --語法:create datebase 數據庫名 create database LiangshanHero; --刪除數據庫 --語法:drop database 數據庫名 drop database LiangshanHero; ~~~ ----------參考《韓順平.循序漸進學.java.從入門到精通》 ----------參考《JDK_API_1_6_zh_CN》 Java學習筆記--導航[http://blog.csdn.net/q547550831/article/details/49819641](http://blog.csdn.net/q547550831/article/details/49819641)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看