SQL入門經典(二) 之數據庫基本查詢、添加、更新和刪除


使用SQL查詢:

SQL查詢基本語法:

SELECT [ALL|DISTINCT]  [TOP (<expression>) [PERCENT] [WITH TIES] ] <column list> [FROM <source table(s)/view>] [WHERE <restrictive condition>]

[GROUD BY<column name or expression using a column in the SELECT list>]

[HAVING <restrictive condition based  on the GROUP BY results>]

[ORDER BY <column list>]

[[FOR XML {ROW|AUTO|EXPLICIT|PATH[(<element>)]},XMLDATA][,ELEMENTS][,BINARY base 64]]

[OPTION (<query hint>,[,.....n])]

上面sql語句看起來很復雜。現在大家一一講解。

SELECT 告訴sql執行什么操作。FROM 要操作的是那個表(注意事項:查詢中不能使用*作為字段。查詢多少字段,就寫多少字段名稱)

SELECT * FROM Person.Contact --我要在Person.Contact這個表查詢

WHERE 查詢條件過濾

SELECT * FROM Person.Contact WHERE FirstName like 'M%'--我要在Person.Contact這個表下查找是FirstName 開頭為M的聯系人

 WHERE字句中可用的運算符如下:

 

GROUP BY 子句聚合數據函數:

做為BOSS要想知道每件商品的銷售量和總價格。就要使用聚合函數

SELECT   SalesOrderID,sum(UnitPrice) as TotalPrice FROM Sales.SalesOrderDetail Group BY SalesOrderID--聚合函數
SELECT   SalesOrderID,sum(UnitPrice) as TotalPrice FROM Sales.SalesOrderDetail Group BY SalesOrderID having sum(UnitPrice) >10000

注意事項:過濾掉銷售額小於10000的商品。不知道為什么TotalPrice 不能作為聚合函數的過濾。只能用 sum(UnitPrice) 過濾.可以在聚合函數前使用where過濾。where過濾不能使用聚合函數。容易錯誤點:group by 后面使用where過濾。GROUP by 只能用having過濾。having 過濾等聚合函數填充完畢后才能過濾。

聚合函數有:COUNT()求個數 SUM()求和  AVG()求平均數 MIN()最小值 MAX()最大值這些是比較常用的聚合函數,可以單獨使用,也可以和group by使用。

現在介紹COUNT()聚合函數 :先看2條代碼和結果

select count(1) from Person.Contact --結果19972條數據
select count(MiddleName) from  Person.Contact --11473條數據

上面2條數據結果不一樣,這個不用當心。后面博客會說這個問題(建議不要帶列名作為count聚合函數)

ORDER BY 排序查詢:

BOSS要求看那個商品銷售前10名:這里也把TOP這個關鍵詞介紹了。order by 那個字段DESC 按照那個字段降序排,asc升序排。top取前面多少條數據

SELECT TOP 10   SalesOrderID,sum(UnitPrice) as TotalPrice FROM Sales.SalesOrderDetail Group BY SalesOrderID having sum(UnitPrice) >10000 ORDER BY  TotalPrice DESC --按照銷售額從高到底排序前10名數據

DISTINCT 和ALL的謂詞:如果數據庫有100條一樣數據。 ALL是全部加載一樣數據100次。DISTINCT只加載一條數據。其余99條舍棄掉。

FOR XML這里不做介紹了。后面有專門博客介紹這個查詢。

INSERT 添加數據

基本語法:INSERT [TOP (<expression> )[PERCENT] [INTO] <table object>[(<column listt>)][OUTPUT <output clause>] {VALUES(<data value>)[,(datavalues)][,....n]|<table source>|EXEC <procedure>|DEFAULT VALUES}

上面語法是不是看起來很復雜,簡化語法:INSERT INTO<tables object>[(<column list>)] VALUES(<data value>)[,(datavalues)][,....n]

為了下面的學習我們建立數據表:

復制代碼
USE  AdventureWorks  

GO

CREATE TABLE Stores
(
  StoresCode char(4) NOT NULL Primary KEY,
  Name         nvarchar(40) NOT NULL,
  Address      nvarchar(20) NULL,
  City            nvarchar(20) null,
  State          char(2)  DEFAULT('0')  NOT NULL,
  Zip              Char(5) NOT NULL
)
CREATE TABLE Sales
(
   OrderNumber Varchar(20) not null primary key,
   StoresCode     char(4)  FOREIGN KEY REFERENCES   Stores(StoresCode) not null ,
   OrderDate      datetime  default(getdate()) not null,
   Quantity         int          not null,
   Terms             Varchar(12) not  null,
   TitleID            int           not   null
)
復制代碼

試一試:插入一條數據(可以直接后面寫要添加數據要與數據表的列名相對應)

INSERT INTO Stores Values('Test','Test Stores','China','ShenZhen','0','100000')

第一次插入值正確第二次錯誤:違反了 PRIMARY KEY 約束 'PK__Stores__6F4A8121'。不能在對象 'dbo.Stores' 中插入重復鍵。后面博客會專門講鍵和約束。

我在對插入一條數據做下修改:

INSERT INTO Stores(StoresCode,Name,City,Zip)Values('tes2','Test Store', 'Here','10000')

可以注意到插入SQL語句:少了address,state 插入,列設置為NULL值可以忽略提供該列的值。如果列不能設置null。則必須為下面3個條件之一,否則系統會提示錯誤。INSERT 終止命令被拒絕執行。

1.列定義默認值,默認值是未提供插入值會自動插入一個常量值。(后面鍵與默認值會說這個問題)2.列定義為接受某種形式系統生成值,最常用的生成值是為IDENTITY值。3插入數據已經提供該列的值。

批量插入數據:

INSERT INTO Stores(StoresCode,Name,City,Zip)
VALUES('tes5','Test Stores','bj','10000'),
            ('tes4','Test Stores','bj','10000');
--(2 行受影響)這是sql server 2008數據庫添加新功能

INSERT INTO .....SELECT 語句:

語法:INSERT INTO <table_name>[column list] <select statement>

復制代碼
CREATE TABLE #temp
(
  ID char(4) not null,
  name  nvarchar(20) not null
)
INSERT INTO #temp

SELETE StoresCode,Name FROM Stores

SELECT * FROM #temp
--結果
--tesT       Test Store
--tes3    Test Stores
--tes5    Test Stores
--Test    Test Stores
復制代碼

 UPDATE 語句更改獲取得到的數據

 語法:UPDATE <table name> SET <column>=<value>[,column=value] [FROM <source tables>] [WHERE <restrictive condition> ]

UPDATE Stores SET State='1' --4條受影響(成功更新了4條數據)
UPDATE Stores SET State='0' WHERE StoresCOde='tes2' --1條受影響

DELETE 語句

刪除語句非常簡單,語法:DELETE <table name>  [WHERE < condition> ]

DELETE Stores --刪除所有數據
DELETE Stores WHERE StoresCode='test'--刪除StoresCode='test'數據

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM