天涯明月刀ol|天涯明月刀迅雷下载
  1. 當前所在位置:
  2. 首頁
  3. 打魚捕魚

數據庫基礎知識 數據庫學習入門

2018-12-26 admin
數據庫基礎知識 數據庫學習入門 數據庫和數據結構的區別?
     數據庫是對硬盤數據進行操作  
     數據結構是對內存數據進行操作
 
 
     數據庫的安裝是比較麻煩的,一不小心就系統報錯導致數據庫無法運行,這時候重裝系統就比較麻煩了,所以重要的事說三遍,數據庫安裝要慎重,慎重,慎重。網上有具體的sqlsever2008安裝教程
 
 
數據庫基礎知識 數據庫學習入門
     接下來就是對數據庫的一些操作介紹了。
     1.數據庫用戶名的添加和修改,可以通過數據庫的安全性來添加。
     2.數據庫的創建直接右擊數據庫(新建數據庫即可)創建數據庫會保存在兩個文件里,一個是...mdf 是用來存儲數據的,另一個是...ldf是存儲操作的,比如誰誰誰在什么時候對該數據庫進行了什么操作,比如增刪查改。
     3.數據庫的添加可以右擊數據庫然后附加mdf文件即可。
     4.數據庫的刪除。如果在sqlsever對數據庫進行刪除的話,實際的數據庫也會消失。
     5.數據庫的備份。
     a.分離法有兩個方法一個是右擊要備份的那個數據庫然后右擊任務點擊分離即可,直接點分離然后框框都打勾就行。會生成mdf和ldf文件,默認保存在c盤的位置。如果不修改的話,創建數據庫分離數據庫得到的文件都會存放在那里。
     b.生成腳本 在需要修改的數據的框框打勾然后一直點下一步最后完成即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
一個表中主鍵扮演著很重要的角色,是用來唯一標識數據項的。 
主鍵一般都是和數據無關額外的創建一個列 無意義的編號int identity代表自增。 
有人會問為什么要用int型的無意義的數字來標識一個數據呢 難道其他數據項不可以嗎?那我只能問你,你說 用一個數字來標識一條數據方便還是一條字符串方便。而且一般我們都會設置主鍵是identity代表自增的主鍵,因為毫無規律的數字是很難記憶的,也不直觀。
 
   create table student
         (
             student_id int primary key identity(100,5),
             student_name nvarchar(20) not null
)
1
2
3
4
5
student_id是自動增長的主鍵 從100開始 每次增長5 
insert into student values(’ 李四’) 
可以直接這樣插入 因為student_id是主鍵可以直接忽略 
表中刪除數據又插入數據會導致主鍵不連續遞增 這種情況是不重要的,即使主鍵不連續遞增,也是可以的
 
也有人問 主鍵和唯一鍵有什么區別呢?
     主鍵定義:
     能夠唯一標識一個事物的一個或者多個字段的組合被稱為主鍵
     1主鍵是不可以賦null空值的,而唯一鍵可以。
     2主鍵是無意義的數據外的數據,是用來標識數據的,而唯一鍵是數據,而且是用來防止數據重復項的。
 
     主鍵的注意 :
     主鍵通常是整數,不建議使用字符串
     主鍵的值通常不允許修改,除非本記錄被刪除
     主鍵不要定義成id 而要定義表名id或者表名_id
     要用代理主鍵,不要用業務主鍵意思就是:
     任何一張表,強烈建議不要使用有業務含義的字段充當主鍵 我們通常都是再表中單獨           添加一個整型的編號充當主鍵字段
1
2
3
4
5
6
7
8
9
10
11
還有外鍵也是很重要的,外鍵是表與表之間連接的樞紐,如果a表有數據來自b表,那a表稱為外鍵表,外鍵在a表里,b表為主鍵表。 外鍵表的值來自于b表的主鍵 
一對多的關系就是a的主鍵作為b的外鍵,b的外鍵可以重復 
外鍵的定義:
 
 如果一個表中的若干字段是來自于另外若干個表的主鍵或唯一鍵  
 則這若干字段就是外鍵
1
2
注意:
數據庫基礎知識 數據庫學習入門
外鍵通常是來自于另外表的主鍵而不是唯一鍵,因為唯一鍵可能是null
外鍵不一定是來自另外的表,也可能是來自于本表的主鍵  
比如一張表中的員工是主鍵 對應的上司字段是外鍵來自于本身的主鍵 
1
2
3
建表
1、菜單
2、建表語句
    create table 表名(
        字段 類型 [not null,primary key, auto_increment]
        ... ...
    ) 
    eg:
    create table test(
        id int primary key auto_increment,
        name varchar(50) not null,
        sex varchar(2),
        tel varchar(50),
        remark text
    )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
刪除表
drop table 表名;
1
插入語句
1、菜單
2、插入語句
    insert into 表名(列名1,列名2...) values(值1,值2,....)
    eg:
     insert into test(name,sex,tel,remark) values('張六忌','女','251314','這是備注')
     3、插入語句注意事項:
    a、values和列名一一對象
    b、value值和字段類型匹配
    c、主鍵不能插入值
1
2
3
4
5
6
7
8
9
查詢語句
select 列名1,列名2 from 表名 where 條件
1、關系運算符
    >  <  =  >=  <=  <>  !
    2、邏輯運算符
    and  or   not
3、模糊查詢
    like:約等于
    _:一個字符
    %:任意個字符
1
2
3
4
5
6
7
8
9
刪除語句
 
    delete from 表名 where 條件
1
修改語句
 
    update 表名 set 列名=值 where 條件
1
去除重復(distinct)
 
select distinct ress from hist
1
between…and…(包含)
查詢工資在8500到9000之間的員工信息(兩種)
 
select * from emp where sar between 8500 and 9000
select * from emp where sar>=8500 and sar<=9000
1
2
in(匹配內容列表)
查詢部門號是1,2,3這三個部門的所有員工
 
select * from emp where  did in(1,2,3) 
select * from emp where did=1 or did=2 or did=3
1
2
查詢主鍵是1,4,7的員工信息
 
select * from emp where eid in(1,4,7)
select * from emp where eid=1 or eid=4 or eid=7 
1
2
聚合函數(count,sum,max,min,avg)
查詢總共有多少個員工
 
#select count(*) from emp
select count(eid) from emp
#select count(ename) from emp
select count(1) from emp
#select count(900) from emp
1
2
3
4
5
查詢所有員工的工資總和 
select sum(sar) 工資總和 from emp 
查詢最高的工資 
select max(sar) from emp 
查詢最低的工資 
select min(sar) from emp 
查詢平均工資 
select sum(sar)/count(eid) from emp 
select avg(sar) from emp
 
查詢所有員工的最高、最低、平均工資,工資的總和
select max(sar) max_sar,min(sar) min_sar,avg(sar)   
avg_sar,sum(sar) sum_sar from emp
1
2
分組統計
查詢每個部門的平均工資 
select did,avg(sar) from emp group by did 
查詢每個部門的平均工資,只顯示大于7000的數據 
select did,avg(sar) avg_sar from emp group by did having avg_sar>7000 
查詢每個部門的女性員工的平均工資 
select did,avg(sar) from emp where sex=’m’ group by did 
查詢每個部門的平均工資,只顯示大于5000的數據,并且按平均工資排序 
select did,avg(sar) avg_sar from emp group by did having avg_sar>5000 order by avg_sar
 
注意:分組查詢是,select后的字段必須包含在聚合函數或 GROUP BY 子句中
分組---->過濾----->排序
group by--->having--->order by
1
2
3
9、多表查詢
子查詢(一個select中嵌套了另一個select) 
查詢研發部的所有員工 
#select did from dept where dname=’研發部’ 
#select * from emp where did=4 
select * from emp where did=( 
select did from dept where dname=’研發部’ 
查詢研發部和市場部的所有員工 
select * from emp where did in( 
select did from dept where dname in(‘研發部’,’市場部’) 
select * from emp where did in( 
select did from dept where dname=’研發部’ or dname=’市場部’ 
nvarchar() 類型支持國際化長度可變的字符
 
主鍵命名
主鍵是針對一個表的, 而不是針對一個字段,因為主鍵是唯一的,一個表只能有一個主鍵。
 
a. 一般主鍵命名: 主鍵的命名為 pk_TableName。
 
b. 復合主鍵: ” pk_ ” + “ 字段名 ”
 
e.g.: Constraint pk_StudentCourse Primary key(Stud_Id, Cour_Id)
 
主鍵pk_StudentCourse,包含了兩個字段 Stud_Id 和 Cour_Id
 
外鍵命名
外鍵的命名為 fk_外鍵所在的表名外鍵引用的表名 。因為外鍵所在的表為從表,所以上式可以寫為 fk 從表名_主表名 。
 
check約束 check是對數據項限定范圍的約束
 
Create table ss3    check約束
(
    name3 nvarchar(20) not null constraint pk_ss3 primary key,
    cc int check(cc>=10 and cc<=20)
)
insert into ss3 values('saz',22)
1
2
3
4
5
6
default是添加默認值的約束
 
create table ss4
(
    name nvarchar(20) not null constraint pk_ss4 primary key,
    sex nchar(1) default('男')
)
1
2
3
4
5
添加唯一鍵 可以為null值但只是其中一列為null 因為null也算一個值 在sqlsever 在oracle則可以多個null 
unique可以和not null一起使用 這樣子 就是不為空的唯一鍵
 
create table ss5
(   //給主鍵命名
    name nvarchar(20)  constraint pk_ss5 primary key, 、
    //設置默認值 
    sex nchar(1) default 's',    
    //age數據設定范圍                      
    age int check(age>20), 
    //不為空的唯一值                          
    address nvarchar(20) unique not null  
    //設置的外鍵             
    xx nvarchar(20) constraint fk_ss2_ss1 foreign key references ss1(name)                                              
)
insert into ss5(name,address) values('sd',null)
1
2
3
4
5
6
7
8
9
10
11
12
13
如果insert into ss5(不填) values(全部數據項都要填,即使它被設定是默認值) 
如果insert into ss5(哪幾項)values(對應填哪幾項,省略的都是以null形式填入,如果unique not null 或者是主鍵被忽略了 那么就會報錯,因為這兩項都不允許填入控制)
 
exists返回真或者假 
查詢沒有工作經歷的員工信息,要求用not exists
 
select e.* from emp e where not exists(
   select 1 from hist h where h.eid=e.eid
)
1
2
3
 exists用于數據量大的  in用于數據量小的
1
Union和union all的區別?
 
  前者去重,后者不去重
1
數據庫包涵三種關系:
 
1.一對一  
2.一對多
3.多對多
1
2
3
先看2 一對多關系 這就是一個外鍵表就可以表達了 外鍵表的外鍵表示多 而對應的主鍵表的主鍵是一 
再看3 是這三種關系中最復雜的。 
很多人想不到該怎么解釋這種關系 
所以需要再額外新建一個表來表示他們的關系 ,看一下代碼一目了然:
 
create table banji
(
    banji_id int primary key,
    banji_num int not null,
    banji_name nvarchar(20)
)
create table jiaoshi
(
    jiaoshi_id int primary key,
    jiaoshi_name nvarchar(20)
)
create table banji_jiaoshi_mapping
(
    banji_id int constraint fk_banji_id foreign key references banji(banji_id),
    jiaoshi_id int foreign key references jiaoshi(jiaoshi_id),
    kecheng nvarchar(20)
    constraint pk_banji_id_jiaoshi_id primary key (banji_id,jiaoshi_id,kecheng)
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
這是班級和老師的數據表 第三張是這兩者之間的關系表也是那兩張表的外鍵表。 
班級id和老師id是外鍵 班級id和老師id和課程組成了該表的主鍵 這點注意:寫法和其他主鍵的寫法不同constraint pk_banji_id_jiaoshi_id primary key (banji_id,jiaoshi_id,kecheng)
 
數據庫關系圖也是很重要的一個東西 可以很直觀的看到各個表之間的關系 當你接觸一個新的數據庫的時候 可以選擇這個方法來了解這些數據的關系 如圖所示:
 
 
 
表中鑰匙的標志表示該字段是主鍵 有人會問 一個表中不是只有一個主鍵嗎那為什么banji__laoshi__mapping 中有三個主鍵。 原因是因為這三個字段組合起來才是主鍵,所以他們都是主鍵的一部分。如果把表與表之間的外鍵關系刪掉會導致外鍵表的數據丟失嗎 答案是 不會的。 還有圖中的 表和表之間是用兩個圈加鑰匙組成的 那哪個是主鍵哪個是外鍵呢 ? 我是這么理解的 banji_laoshi_mapping 的鑰匙指向banji 意思就是它中的某些數據是取自banji 那么它就是外鍵表,banji就是主鍵表 這么理解記憶比較好
 
問題: 
先刪主鍵表還是外鍵表? 
答案是:先刪外鍵表 
如果先刪除主鍵表,會報錯,因為這會導致外鍵表的數據引用失敗
 
查詢要掌握的:
 
 - 1.計算列
 - 2.distinct
 - 3.between
 - 4.in
 - 5.top
 - 6.null
 - 7.order by
 - 8.模糊查詢
 - 9.聚合函數
 - 10.group by
 - 11.having
 - 12.連接查詢
     - 定義
         -分類
             內連接  (最重要)
             外連接
             完全連接
             交叉連接
             自連接
             聯合
    13.嵌套查詢
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
注意: 
在寫SQL語句時,經常需要查詢不在某個表、不等于某些值的記錄,SQL Server中提供了not in來實現這個功能,但是,如果not in 后面的值有NULL值時,就會返回錯誤的結果,即沒有任何結果返回,所以SQL中在使用not in時需要特別留意。
 
當數據庫已經創建好后 
添加約束要用
 
ALTER TABLE Persons    //ALTER和ADD是重點
ADD UNIQUE (Id_P)
1
2
還有 新建查詢里面 go是分隔作用 意思就是執行完上一步才能執行下一步 有先后順序
 
還有一些知識沒怎么學習:
 
1.事務
2.索引
3.存儲過程
4.游標
5.TL_SQL
6.觸發器
1
2
3
4
5
6
數據庫是如何存儲數據的 
字段 記錄 表 約束(主鍵 外鍵 唯一鍵 非空 check default 觸發器) 
數據庫是如何操作數據的 
insert update delete T-SQL 存儲過程 函數 觸發器 
查詢 : 
內連接 (核心) 
左右連接 
視圖 
事務
數據庫基礎知識 數據庫學習入門
 
捕魚駕到 天涯明月刀ol