sqlserver學習_01

啟動資料庫
開始-》cmd-》進入控制檯
   sqlcmd->-S .\sqlexpress
   1>
如果出現表示資料庫“sqlexpress例項”可以使用了
   Exit表示退出
安裝SQL Server資料庫(資料管理軟體)
安裝服務
   -》一個電腦硬體上可以安裝多個例項,一個例項就好比另外一個人
   -》例項 只可以有一個預設例項
1、記錄學生的資訊
姓名 年齡 性別
張三     19        男
李四     20        男
   ...
一張表就好像一個類,姓名、年齡、性別就好像是這個類裡面的欄位,整張表就好像是一個List<Person>物件

Class  Person
{
    string name;
    int age;
    char sex;
}

一、什麼是資料庫? (學習資料庫要有過日子的心理)

資料庫Database:資料的倉庫

資料庫就好像一個大超市,貨物都要歸類區分存放,便於我們管理拿取,我們的資料庫也一樣

資料庫   DBMS(DataBase Management System,資料庫管理系統)

2)資料庫的特點:海量儲存、查詢速度快、安全性、、併發性問題控制、資料完整性

1)主鍵

就是資料行的唯一標識,不會重複的列才能當主鍵,一個表可以沒有主鍵,但是會非常難以處理,因此沒有特殊理由表都要設定主鍵。

3)資料庫裡的資料型別

I)二進位制資料型別

--》Image:   用來儲存非字元和非文字的資料(比如說圖片、音樂、視訊等。。。)

II)文字資料型別

--》Char: 字元資料包括任意字母、符號或數字字元的組合。(以位元組來計算,比如說Char(10) 這個欄位裡面可以儲存10個位元組的資料如果存的是‘abc’那麼系統會自動在前面加上7個空格,如果是‘哈哈哈’漢字,系統就會加四個空格,因為一個漢字兩個位元組漢字,這些空格就是如果給的值不夠10個位元組系統就會自動補夠,超出就不行)

--》Varchar:可變長度非Unicode資料(例如varchar(10) 表明這個欄位裡面可以儲存10個字元,以字元個數來計算就是說不管存的是‘1234567890’還是‘哈哈哈哈哈哈哈哈哈哈’都是可以存10個,就不是以位元組計算了,同樣如果不夠十個在記憶體裡儲存的時候系統就會自動加上空格,補夠10個)

--》nchar:也是以位元組來計算,但是不同的是如果nchar(10)給值的時候不夠10個位元組的話在記憶體裡系統就不會自動加空格補滿。

--》nvarchar:和nchar同理

--》text():儲存文字資訊(指標,可以存2G,就是比較長的文字)推薦使用  varchar(max)

-->Ntext:Nvarchar(max)

III)日期和時間

--》日期和時間在單引號內輸入 :Datetime   日期和時間

IIII)數字資料 (該資料僅包含資料,包括證書、負數以及分數)

--》int      整數

-->smallint      整數

--》float   數字 (小數)

-->real    數字

IIIII)貨幣資料型別

--》money

IIIIII)bit資料型別

--》bit  儲存布林資料型別 (true/false  0/1 一般用來儲存性別)

2)建立資料庫檔案

資料庫檔案mof  master data file     log  data file

3)資料庫的註釋

--》   -- 註釋的內容

--》   \*

註釋內容

      */

4)建立資料庫

  --》邏輯名 --》大小   --》增長 --》路徑

刪除資料庫時可能出現的問題 
語法 如果資料庫正在使用中是刪除不了的,要刪除就

use master;
   go
  drop database 資料庫名
  go

   

4)建立表

create table 表名

   --這裡面的欄位可以想象成C#裡的欄位一樣,補夠這裡的欄位資料型別要寫在前面

欄位名 、資料型別、約束(各個欄位要用逗號分隔)

--》自動增長使用

    identity(1,1)  --以1為起始值,以1為步長自動增長

--》主鍵設定

   primary key

-->非空使用

欄位名 型別  not null  (表示該欄位的值不可以為空)

5)插入

   insert into 表名(欄位列表) values(值)

--》檢視資料

   select * from 表名

--》修改單個值

   update要修改的表名 set 欄位名=值 where 條件

--》修改多個值

    update 要修改的表名 set 欄位1=‘值1’,欄位2=‘值2’ where 條件

--》追加課使用:欄位=欄位+值

6)刪除表中所有資料:delete from 表名

值刪除資料,如果不加where條件表名刪除全部資料

   delete只是刪除資料,表還在,和drop table不同

--》刪除部分資料

  delete from 表名 where 條件

--》刪除表

  drop table 表名 
--建立資料庫

/*

create database  資料庫名

*/

create database MyFirstDataBase

--》預設系統儲存資料檔案與日誌檔案

--》邏輯名:就是資料庫名

--》檔名:資料庫要儲存到的位置,注意資料庫直接生成的拿兩個檔案不可以直接儲存到系統盤的根目錄下,要儲存就建一個子資料夾,不建議儲存在系統盤

--》大小:初始的儲存大小

--》增長:如火儲存的記憶體超過了初始的大小就會以這個值增長,比如說初始大小是10,增長是2,那麼當滿了10 以後就會自動增長2,當12又滿了的時候再增長2,以此類推下去

go

--go不是T-SQL的標準語法

--表示前面的程式碼作為一段邏輯一起執行

use Doolsql

go

                    --=================例項================---

--建立資料庫
/*
create database  資料庫名
*/
create database MyFirstDataBase
go
--go不是T-SQL的標準語法
--表示前面的程式碼作為一段邏輯一起執行
--刪除資料庫
drop database MyFirstDataBase
create database MyDataBase2
on
(
   name='MyDataBase2',
   filename='E:\DB\MyDataBase2.mdf',
   size=,
   filegrowth=
)
log on
(
   name='MyDataBase2_log',
   filename='E:\DB\MyDataBase2_log.mdf',
   size=,
   filegrowth=%
);
--刪除
drop database MyDataBase2
--===============
--建立表
use MyDataBase2
create table MyTable
(
--identity(,)表示以1開始,並且以1作為步長自動增長
--primary key表示該欄位為主鍵
  Fid ,)primary key,
  FName nvarchar() not null,
  --not null表示該欄位部位空
  FAge int,
  FSex bit
)
--========================
drop database MyDataBase
create database MyDataBase
drop database MyDataBase
create database MyDataBase
on
(
  name='MyDataBase',
  filename='E:\DB\MyDataBase.mdf',
  size=,
  filegrowth=
)
log on
(
  name='MyDataBase_log',
  filename='E:\DB\MyDataBase_log.mdf',
  size=,
  filegrowth=%
)
--============================
use MyDataBase
create table MyTable
(
   Fid ,)primary key,
   FName nvarchar(),
   FSex bit,
   FAge int
)
create table TScore
(
   FStudentid ,)primary key,
   FScoreld int,
   FEnglish int,
   FMath int,
)
create table TStudent
(
   FStudentid ,)primary key,
   FName nvarchar(),
   FAge bit,
)
create table Teacher
(
  FTeacherid ,)primary key,
  FName nvarchar(),
  FAge INT,
  FSex bit,
  FSlarary money,
  FBirthday int
)
--============
--插入資料
--查看錶結構
use Doolsql
go
select * from dbo.T_student
  --插入資料(標準)
  --/插入全部資料
  --insert into 表名 values(值)
  insert into T_Student values(,'男','中國')
  --/只插入部分欄位賦值的插入資料
  --insert into 表名(對應欄位列表) value(值列表)
  insert into T_Student
       (Name,Age,Sex,Addriss)
  values
       (,'男','島國')
      go
   --刪除資料
   delete from T_Student where name='李四'
   --把id等於4的張三,的年齡改為26
   --update 要修改的表名 set 欄位名=值 where 條件
   update T_Student
   --修改追加
   update T_Student 

sqlserver學習_02

一、複習

1) 資料庫就是倉庫

    -》資料庫服務(例項)

    -》資料庫

     -》表<-->類 (有一個對應關係)

2)DDL(定義用)

3)建立資料庫

 

create database 資料庫名
  on
  (
    name='邏輯名',
    filename='檔名',
    size=3mb,
    filegrowth=1mb
    maxsize...
  )
  log on
  (
     name=.....
  )
  use master   --建立資料庫前要先use 到主資料庫區
if db_id('itcast') is null    --然後判斷 如果  ‘itcast’這個資料庫沒有被建立
create database itcast        --就建立一個‘itcast’
on
(
  name='itcast',
  filename='E:\db\itcast.mdf'
)
log on
(
  name='itcast_log',
  filename='E:\db\itcast.ldf'
)

  4)要新建資料庫的時候,當前例項中已經存在了你要新創的資料庫,就看一下資料庫裡有沒有你要建立的

if  db_id('資料庫名') is null
  create database 資料庫名

  5)建表

 

create table Student
  (
    id int
    name nvarchar(),
    age int,
    gender bit
  )

  

  6、建表有可能已經存在

  --建表前也use 一下 寫指令碼要養成一個好習慣,沒寫完一個SQL語句結尾帶 分號(;)和go

 

use itcast
go
  if object_id('表名','U') is not null    --U表示使用者自定義的表 如果這個表不為null(就是存在了)
為程式碼:if(表存在)
(
刪除表
)
  drop table 表名
  )新增資料
   insert into 表名(欄位1,欄位2.....)values(值1,值2.....)
   )刪除
     --》刪除資料庫
         drop database 資料庫名
    --》刪除表
      drop table 表名
   --》刪除表資料
      delete from 表名 where 條件 (如果沒有where判斷會把整張表的資料全部刪除)
    )修改資料
      update 表名 set 列名=值 where 條件
    )(重點)查
     select * from 表名
     )使用資料庫時,記得use
一句程式碼結束後分號結束
一片程式碼結束後用 go結束
)dbo就是當前資料庫表的架構schema(就等價於C#裡的名稱空間)

   
二、約束

--》資料約束是為了保證資料的完整性(正確性)而實現的一套機制

--》非空約束:not null

1)使用程式碼新增約束

--》主鍵約束
alter table 表名 add constraint PK_表名_欄位名 primary key(欄位名)
--》唯一約束
alter table 表名 add constraint UNQ_表名_欄位名 unique(欄位名)
-->檢查約束
alter table 表名 add constraint CK_表名_欄位名 check(表示式)
-->預設約束
alter table 表名 add constraint DF_表名_欄位名 default(預設值)for 欄位
--》一次性批量新增約束
alter table 表名
add
constraint...,
constraint...,
constraint...,
.....
刪除約束
   alter table 表名 drop constraint 約束名

2)建立表的同時就新增約束

use itcast
go
create table MyTable
(
 id identity(,) primary key,
 [unique] int unique,  -- 唯一約束 欄位名與系統關鍵字衝突時加[]  不加[]的時候欄位中間有空格的話系統會認為是兩個欄位
 name nvarchar() not   null,--非空約束
 Gender nvarchar() check(Gender='男' or Gender='女'),  --檢查約束
 isDel bit ) --預設約束
)
--修改表結構
--增加欄位
alter table student add Fid int;
alter table Student add note nvarchar(max)
--修改欄位的資料型別
alter table  student alter column sex nvarchar()
--刪除欄位
alter table student drop column note
--》檢視已有約束等
select * from sys.objects

3)外來鍵表與主鍵表

--關於外來鍵(為了節省空間)
--首先建一個外來鍵表
create table WaiJian
(
  id ,) primary key,
  Fid int,
  name nvarchar()
)
go
create table ZhuJian
(
  Fid ,)primary key,
  name nvarchar()
)
go
--關聯外來鍵表(這兩個鍵必須要是兩個表的主鍵)
alter table WaiJian add constraint FK_WaiJian_ZhuJian_Fid
--設定主鍵
foreign key(Fid) references ZhuJian(Fid)

三、檢索資料(查詢) 

use master
go
select * from Person
--找一招年齡在20歲以下的人

--找一找20歲以下的女孩
 and FSex='女'
--找一下18到20歲之間的女孩
 and FAge<= and FSex='女'
--加上找20歲以上的男孩  (一般寫的語法)
select
  FName  姓名,Fsex  性別,FAge as 年齡
from Person
where
    FAge>= and FAge<= and FSex='女'
or
    FAge>= and FSex='男' ;
go
--==================
--帶條件查詢
--=========================
select
print
--這兩個都可以用來顯示,只是select會以表的形式輸出,而print的結果會顯示在訊息中
--=========
--以年齡進行排序
select * from Person order by FAge   --不屑asc或desc就是預設的升序排序
--Top 數字 ;表示在查詢出來的結果進行篩選,將淺“數字”個記錄顯示出來
select * from Person order by FAge desc
--再找前15個
 * from Person order by FAge desc
--再加個條件:性別為女的
 * from Person where FSex='女' order by FAge desc
--top後還可以跟一個百分比,表示查詢百分之幾的資料
 percent * from Person where FSex='女' order by FAge

--=========================

--去除重複(只是顯示的時候去除了,並沒有真的刪除了)

select distinct * from Persom  --如果有*號有ID號了系統就認為結果不是相同的
select distinct FName,FAge,FSex from Person  --沒有

--======================

--聚合函式

--最大值max

--最小值min

--平均值avg

--總和sum

--總數count

--求年齡最大的人

select max(FAge) from Person

--最小的

select min(FAge) from Person

--平均

select avg(FAge) from Person

--總數

select count(FName) from Person

--求女的總數

select count(FName) from person where FSex='女'

select * from Person where FSex='女'

--聚合函式使用的幾個問題

--avg

--使用avg的時候,如果有一條記錄(資料)為null,將不作為計算的資料來源

--count的問題

--使用count(欄位)的時候,如果針對某個欄位,若該欄位為null,不計入總數,

--若使用count(*)則忽略該現象,會得到總的資料條數

--求兩個欄位的平均

select (Fid+FAge)/2 from Person

--條件查詢

use MyDataBase15_31
go
 and age> --條件:gender= 並且 age>
--範圍
 and   --條件:gender=到之間,包含18 和
--指定 年齡等於18
,,)   --條件:gender=

SQL server學習_函式、型別轉換

一、複習

1、建庫建表

use master
  go
  if db_id('Mydatabase') is null
  create databese Mydatabase
  go
  use Mydatabase
  go
  if object_id('MyTable','U') is not null
  drop table MyTable
  (
    id ,)primary key,
 tName nvarchar() not null,
 tAge int,
 tGender bit
  )
  go

  

2、增

   insert into 表名(欄位1,欄位2,....)values(值1,值2...)

注:--》在C#中,SQL語句是一個字串

   --》SQL中的數字在C#中就是個字串

   --》SQL中的字串在C#中是帶單引號的字串

      --》刪除資料

          delete from 表名 where 條件

   --》刪除表

           drop table 表名

   --》刪除資料庫

                use master

                go

                 drop database 資料庫名

   --》截斷表(歸零)

         truncate table 表名

            -》將資料全部清空、歸零,不記入日記檔案中

修改資料

         update 表名 set 欄位=值

修改表結構

          alter table 表名 add 
   alter table 表名 drop

   alter table 表名 alter

2、簡單查詢

  select * from 表名 where 條件

關於條件的範圍

    between and(兩邊都取的到)

in(。。。)

3、模糊查詢

模糊查詢就是給定一些不完整的條件要查出資料庫中的資料的查詢

比如說--  要查出謀張表的所有姓張的人、要查出名字以張開頭並且名字是兩個字的

這時候就可以用到模糊查詢了,

模糊查詢有常用的幾個個統配符 (這些萬用字元加個[]中括號括起來就表示普通符號)

     --》% 百分號

  % 表示任意個任意字元,可以沒有也可以有一個

  --》_ 下劃線

  _ 表示一個任意字元

  --》^  非

  ^  和正則表示式的 ‘非’ 很相似,在資料庫裡這個‘非’要與[^]連起來用,如果沒有中括號就是普通字元

  --》[]  中括號

  [] 的第一個功能就是前面說到的當欄位、表名等的命名與系統的關鍵字衝突的時候可以把其用[]括起來

第二個就是匹配字元,注意:[]只匹配裡面的第一個字元

4、空值處理

空值就是 null,在SQL server裡null表示空,其值是不知道的意思,null和空字元(‘ ’)有區別,空字元(‘ ’)是有值的是有內容的,而Null則是不知道,兩者不相同

判斷null只能用 is null 和 is null

  --》空值替換   isnull(欄位,要替換的值)

比如說要把一張表的空值替換成123

select isnull(檢查的欄位,要替換的值) from 表名

5、排序   order by

  --》asc 升序排序,不寫預設就是升序排序

  --》desc 降序排序

order by 排序的執行順序永遠是在最後執行的,如果有where篩選,order by總是放在後面,這樣會提高效率

多列排序(從左到右)

select * from 表名 order by

欄位1 [desc],欄位2[desc],。。。。

6、資料分組

select語句中可以使用group by 子句將行劃分成較小的組,然後使用聚合函式返回每一個組的彙總資訊

group by 只返回一個值,一旦使用了group by分組後,前面select列表就不可以寫顯示多個值的欄位,除非是函式列表或者是分組列表成員

比如說要顯示所有班級的總人數,同時還要把每個班的所有人的名字一起顯示出來,那是不可能的,group by值返回一個值

7、having語句

having語句和where一樣都是篩選,但是having和where的執行順序不同,having是group by的條件對分組後的資料進行篩選,having是對分組後的資料進行篩選的

having要位於group by之後,注意having中(就是其後的判斷條件)不能使用未參與分組的列,

8、聯合結果集

--》單值結果集

--》行結果集

--》表值結果集

結果集就是select查詢出來後的結果

union可以把多個結果集合併成一個結果集

語法:

查詢語句1

union

查詢語句2

  --》union會自動把財富的資料合併

  --》union all會保留重複資料

一般都是使用union all效率會高點,因為union合併之後會再檢索一邊裡面有沒有重複的資料

--》聯合要注意一點:多個查詢語句之間對應的資料型別要一致

9、字串函式

--》len():計算字串的長度(就是字元的個數)

--》datalength():計算字串位元組數,不屬於字串函式,是個系統函式

--》lower()、upper():轉小寫,大寫

--》ltrim():去除字串左側的空格

--》rtrim():  去除字串右側的空格

--》ltrim(rtrim('   ab     ')):去除字串左右兩側的空格

--》left()、right():擷取字串,

   select left('abcdefghijk',2);第一個引數是要擷取的字串,第二個引數是擷取幾個

--》substring(要擷取的字串,開始擷取的位置,擷取的長度)

這裡的字串的位置是從1開始的沒有0

10、日期函式

-->getdate()   獲得當前系統時間,年-月-日 時:分:秒:毫秒

--》select day(getdate())   或得當前天數

--》select month(getdate())  獲得當前月數

--》select year(getdate())   獲得當前年份

--》dateadd(在那個部分增加,增加多少,日期)

--》datediff(單位,開始的時間,結束的時間)     

-->datepart(要返回日期的那一部分,日期時間)

11、型別轉換

--》cast(要轉換的欄位 as 要轉換的資料型別)

--》convert(要轉換的欄位,要轉換的資料型別)