zoukankan      html  css  js  c++  java
  • 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'数据
  • 相关阅读:
    Python-PyQt5-图形可视化界面(5)--打开文件或文件夹--QFileDialog
    python opencv图片拼接源码
    python numpy库矩阵运算的功能
    stm32定时器/定时器中断/PWM输出/输入捕获
    STM32 串口/中断
    STM32F4 IO
    STM32F4 时钟树概述
    MDK5新建工程/MDK5 使用技巧/STM32F4 在线调试
    使用 LocalDate 过滤掉工作日
    斐波拉契数列(Lambda表达式)
  • 原文地址:https://www.cnblogs.com/haiyabtx/p/5628232.html
Copyright © 2011-2022 走看看