您的位置:首页 - 教程 - SQL - 正文
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'数据

评论: