您的位置:威尼斯官方网站 > 威尼斯官方网站登录 > 正文适用SQL Server二零一零语法

正文适用SQL Server二零一零语法

发布时间:2019-11-20 13:33编辑:威尼斯官方网站登录浏览(88)

    转载自:

    多年来从体育场面借了本介绍SQL的书,计划复习一下主干语法,记录一下笔记,打理一下思路,以备日后复习之用。

    PS:本文适用SQL Server2010语法。

    一、关系型数据库和SQL

    其实正确的讲,SQL是一门语言,并不是一个数据库。

    怎样是SQL呢?简单的讲,SQL正是保卫安全定和煦动用关系型数据库中的的多寡的后生可畏种规范的计算机语言。

    1.1 SQL语言首要有3个珍视的组成都部队分。

    1. DML(Data Manipulation Language)数据垄断语言。这么些模块能够让大家探寻、改善、扩大、删除数据库中的数据。
    2. DDL(Data Definition Language)数据定义语言。是的大家能够成立和改换数据库自个儿。如:DDL提供ALTER言辞,他让我们得以改正数据库中表的思考。
    3. DCL(Data Control Language)数据调控语言,用于维护数据库的来宾。

    在SQL术语中,记录(record)和字段(田野)实际上就称为行(row)和列(column)。

    1.2 主键和外键

    主键之所以有供给:

    • 第生机勃勃让你唯意气风发标志表中独立的一站式。主键确定保证了唯生机勃勃性。
    • 能够超轻便的将二个表和另二个表关联。
    • 主键日常就能够自动暗中同意创建索引,进步了询问速度。

    外键就是说A表中的某些字段,同期是B中的主键,那么这几个字段正是A表中的外键。希望A表中的那么些外键的值必需是B中早就存在的值。

    1.3 数据类型

    通常来说,有3中最首要的数据类型:

    1. 数字(Numeric)
    2. 字符(Character)
    3. 以致日期/时间(Date/Time)

    bit是数字型,它只允许五个值,0和1。

    字符类型分化^1):

    类型 长度 说明
    char 固定长度
    nchar 固定长度 处理unicode数据类型(所有的字符使用两个字节表示)
    varchar 可变长度 效率没char高 灵活
    nvarchar 可变长度 处理unicode数据类型(所有的字符使用两个字节表示)
    • 1字节=8位
    • bit正是位,也叫比特位,是计算机表示数据最小的单位。
    • byte就是字节,1byte=8bit,1byte正是1B;
    • 八个字符=2字节;

    1.3 空值

    空值不对等空格或空白。使用NULL表示空值。

    二、轻便增加和删除改查

    2.1 查(列名有空格的事态卡塔尔国

    1
    2
    SELECT [ last name]
    FROM Customers

    用方括号将有空格的列名括起来。
    PS: MySQL使得重音符`(~卡塔 尔(阿拉伯语:قطر‎开关。Oracle用双引号。

    查询顺序,SQL施行各种^2):

    1
    2
    3
    4
    5
    6
    Select -1>选择列,-2>distinct,-3>top
      1>…From 表
      2>…Where 条件
      3>…Group by 列
      4>…Having 筛选条件
      6>…Order by 列

    2.2 增

    1
    2
    3
    4
    5
    6
    INSERT INTO tablename
    (columnlist)
    VALUES
    (RowValues1)
    (RowValues2)
    (repeat any number of times)

    2.3 改

    1
    2
    3
    UPDATE  table
    SET column1=expression1,column2=expression2(repeat any number of times)
    WHERE condition

    2.4 删

    1
    2
    3
    DELETE
    FROM table
    WHERE condition

    去除前能够印证一下:

    1
    2
    3
    4
    SELECT 
    COUNT(*)
    FROM table
    WHERE condition

     

    风流浪漫旦想要删除全部的行,能够:

    1
    DELETE FROM table

     

    或者

    1
    TRUNCATE TABLE table

     

    TRUNCATE TABLE优势在于速度更加快,可是不提供记录事务的结果。
    除此以外二个不一样点是,TRUNCATE TABLE双重安装了用来自增型的列的一时一刻值,DELETE不会。

    三、别名

    关键字:AS

    3.1 计算字段

    行使计算字段能够做如下的事情:

    • 筛选特定的单词或然数值
    • 对单个或然三个列举行测算
    • 把列和直接量组合在协同。

    3.2 直接量

    这些直接量和表中的数目尚未其余涉及,就是为了表明所用,下边那类别型的表明式就称为直接量(literal value)。
    图片 1

    1
    2
    SELECT '直接量' AS `类型`,firstname,lastname 
    FROM `customers` ;

    图片 2
    如图,结果中央政府机构接量就在一列中了。

    3.3 算数运算

    例子1:

    1
    2
    SELECT  num*price AS total
    FROM orders

     

    例子2:

    1
    2
    SELECT  firstname+' '+lastname AS 'fullname'
    FROM users

     

    在MySql中年晚年是假若用CONCAT函数:

    1
    2
    3
    SELECT OrderID,FirstName,LastName,
    CONCAT(FirstName,' ',LastName) AS 'fullname'
    FROM orders

     

    3.4 别名

    1卡塔 尔(阿拉伯语:قطر‎列的小名

    1
    2
    SELECT firstname AS fn
    FROM customers

     

    2卡塔尔 表的小名

    1
    2
    SELECT firstname 
    FROM customers AS cu

     

    说明:

    1. 列的外号是为了展现用的,小名会作为查询结果的表头,无法在WHERE中央银行使列的外号,会出错!!!
    2. 表的外号确实是为着便于操功用的,能够在WHERE中选拔列的小名实行!

    四、使用函数

    函数要有大器晚成组圆括号跟在首要字背后,圆括号告知大家,那是多少个函数!

    4.1 字符函数

    LEFT&RIGHT

    LEFT(CharacterValue,NumberOfCharacters)
    含义:选择CharacterValue字段的左边手NumberOfCharacters多少个字符。
    ps:EnclaveIGHT是左臂几个字符。

    LTRIM&RTRIM

    LTRIM(CharacterValue)
    能够去除左边在这里以前的空格。RT昂CoraIM功效相似。

    SUBSTRING

    SUBSTRING(CharacterValue,StartPositon,NumberOfCharacters)
    意思:选用从早先地方(包涵卡塔尔,N个长度的字符。

    1
    2
    SELECT 
    SUBSTRING('thewhitegoat',4,5) AS 'The Answer'

     

    返回:white

    4.2 日期/时间函数

    GETDATE

    1
    SELECT GETDATE()

    回来超越天子和岁月。
    PS:在MySql中,等价函数是NOW,在Oracle中是CURRENT_DATE

    DATEPART

    能够深入分析现实的日子,并且再次回到诸如该日期是前段时间首的第几天,可能该年度中的第几周等音信。

    1
    DATEPART(datepart,DateValue)

     

    datepart能够是贪无边无际区别的值,如下都以有效值:

    • year
    • quarter
    • month
    • dayofyear
    • day
    • week
    • weekday
    • hour
    • minute
    • second

    DATEDIFF

    能够让大家赢得任性多少个日子之间相距的造化(或周数、月数等卡塔 尔(英语:State of Qatar)。

    1
    DATEDIFF(datepart1,startdate1,startdate2)

     

    DATEDIFF Function Expression Resulting Value
    DATEDIFF(day,’7/8/2009’,’8/14/2009’) 37
    DATEDIFF(week,’7/8/2009’,’8/14/2009’) 5
    DATEDIFF(month,’7/8/2009’,’8/14/2009’) 1
    DATEDIFF(year,’7/8/2009’,’8/14/2009’) 0

    PS:MySql中,DATEDIFF函数只允许大家总括四个日子之间的天意,假设想要得到三个正数,甘休的日期平日要作为第二个参数:

    1
    DATEDIFF(enddate,startdate)

     

    Oracle中从不等价函数

    4.3 数值函数

    ROUND

    同意大家四舍五入。

    1
    ROUND(numericvalue,decimalpalaces)

     

    RAND

    用来发出随机数

    1
    RAND([seed])

     

    未曾子舆数时,它会重返0-1之内的四个随机数。

    1
    SELECT RAND() AS 'Random Value'

     

    可选参数seed有的状态下,每回将赶回相通的值。那让笔者想起了Python中的Random包。看来众多时候,一些事物是共通的哎。

    PI

    PI()函数
    只要想要对它保留两位小数,可以透过复合函数进行:

    1
    SELECT ROUND(PI(),2)

     

    将会重回:3.14

    4.4 转变函数

    CAST函数

    允许大家把数据从风流洒脱种类型调换成另生机勃勃种等级次序。

    1
    CAST(expression AS DateType)

     

    例子:

    1
    2
    3
    SELECT 
    '2009-04-11' AS 'Original Date',
    CAST('2009--04-11' AS DATETIME) AS 'Converted Date'

     

    ISNULL函数,很有用

    能够把NULL值转变到一个有意义的值。

    1
    2
    3
    SELECT Description,
    ISNULL(Color,'Unknown') AS 'Color'
    FROM Products

     

    五、排序函数

    5.1 增加排序

    1
    2
    3
    SELECT columnlist
    FROM tablelist
    ORDER BY columnlist

    暗中认可是升序,ASC,由此,上面等价于:

    1
    2
    3
    SELECT columnlist
    FROM tablelist
    ORDER BY columnlist ASC

     

    5.2 降序

    使用DESC关键字:

    1
    2
    3
    SELECT columnlist
    FROM tablelist
    ORDER BY columnlist DESC

     

    5.3 依照多列

    1
    2
    3
    4
    5
    SELECT 
    FirstName,
    LastName
    FROM Customers
    ORDER BY LastName, FirstName

    注意:列的次第很主要,首先依照LastName排序,然后依据FirstName排序。

    5.4 遵照总结字段

    1
    2
    3
    SELECT LastName+','+FirstName AS 'Name'
    FROM Customers
    ORDER BY Name

    为此,从那儿可见,列别称不能够用在WHERE中,但足以用在O奥迪Q5DECRUISER BY中。
    例子

    1
    2
    3
    SELECT FirstName,LastName
    FROM Customers
    ORDER BY LastName+FirstName AS 'Name'

     

    5.5 排序补充内容

    当数码升序时,出现顺序是之类:

    NULL->数字->字符
    在乎:那时候,该列中的数字其实是比照字符来算的,由此,升序时,23也是排在5事先的。

    六、基于列的逻辑-CASE

    6.1 IF-THEN-ELSE逻辑

    包罗列和CASE表明式的SELECT语句,差不离如下:

    1
    2
    3
    4
    5
    SELECT 
    column1,
    column2,
    CaseExpression
    FROM table

     

    6.2 CASE-轻易格式

    1
    2
    3
    4
    5
    6
    7
    SELECT 
    CASE ColumnOrExpression
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    (repeat WHEN-THEN any number of times)
    [ELSE  DefaultResult]
    END

    CASE表明式对于把倒霉领会的值转变到有含义的描述是很有用的。

    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    CASE CategoryCode
    WHEN 'F' THEN 'Fruit'
    WHEN 'V' THEN 'Vegetable'
    ELSE 'other'
    END AS 'Category',
    ProductDescription As 'Description'
    FROM Products

     

    6.3 CASE-查询格式

    1
    2
    3
    4
    5
    6
    7
    SELECT 
    CASE 
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    (repeat WHEN-THEN any number of times)
    [ELSE  DefaultResult]
    END

    这种格式允许在重大字WHEN后面放置较为复杂的法则表明式。

    连锁难题:

    • StackOverFlow-SQL Server: CASE WHEN OR THEN ELSE END => the OR is not supported

    七、基于行的逻辑

    7.1 应用查询条件

    到头来派到WHERE出场了,注意写法顺序,再写叁回:

    1
    2
    3
    4
    5
    6
    Select -1>选择列,-2>distinct,-3>top
      1>…From 表
      2>…Where 条件
      3>…Group by 列
      4>…Having 筛选条件
      6>…Order by 列

     

    7.2 限制行-TOP

    1
    2
    3
    4
    SELECT 
    TOP Number 
    Columnlist
    FROM table

    7.3 TOP和ORDER BY结合

    重要字TOP的另三个用场是,把它和OCRUISERDER BY子句结合起来,基于特定分类,得到带有最大值的一定数额的行。

    倘诺你想见到Shakespeare所著的销量最多的书。

    1
    2
    3
    4
    5
    6
    7
    SELECT 
    TOP1
    Title AS 'Book Title',
    CurrentMonthSales AS 'Quantuty Sold'
    FROM Books
    WHERE Author='Shakespeare'
    ORDER BY CurrentMonthSales DESC

     

    ps: 学会利用google寻觅,比如,小编想要知道oracle中好像top成效的非常重要字是如何,能够:
    图片 3

    八、布尔逻辑

    关键字:AND/OR/NOT/BETWEEN/IN/IS/NULL

    8.1 OR

    OSportage子句意味着,固然鲜明自由条件为真,那么就该选中该行。

    1
    2
    3
    4
    SELECT userid,name,phone
    FROM users
    WHERE age<18
    OR age>60

     

    8.2 使用圆括号

    1
    2
    3
    4
    5
    6
    7
    SELECT CustomerName,
    Sate,
    QuantityPurchased
    FROM Orders
    WHERE State ='IL'
    OR State='CA'
    AND QuantityPurchased>8

    本来想要的结果是对来自IL大概CA的顾客,同一时候,只看数量超过8的订单。可是下边试行的结果不是这么的,因为,SQL总是会先拍卖AND操作符!!!然后才会处理O奥迪Q3操作符。所以,上述语句中,先见到AND并施行如下的尺度

    1
    2
    State= 'CA'
    AND QuantityPurchased>8

     

    为此,要用括号来分明相继:

    1
    2
    3
    4
    5
    6
    7
    SELECT CustomerName,
    Sate,
    QuantityPurchased
    FROM Orders
    WHERE (State ='IL'
    OR State='CA')
    AND QuantityPurchased>8

     

    8.3 NOT操作符

    NOT操作符表示对后边的内容否定只怕取反。

    1
    2
    3
    SELECT CustomerName,State
    FROM Orders
    WHERE NOT (State='IL' OR Sate='NY')

     

    以此实际能够用AND改写的!!!
    NOT操作符在逻辑上不是必得的。

    8.4 BETWEEN操作符

    1
    2
    3
    4
    5
    SELECT CustomerName,
    Sate,
    QuantityPurchased
    FROM Orders
    WHERE QuantityPurchased BETWEEN 8 AND 10

    8.5 IN操作符

    只要你想见到IL可能NY的行:

    1
    2
    3
    4
    SELECT *
    FROM Orders
    WHERE State='IL'
    OR State='CA'

     

    能够改写成:

    1
    2
    3
    SELECT *
    FROM Orders
    WHERE State IN ('IL','CA')

     

    8.9 布尔逻辑-IS NULL

    为了将某字段NULL值的行或0的行包含进来:

    1
    2
    3
    4
    SELECT *
    FROM Products
    WHERE weight=0
    OR weight IS NULL

     

    或者

    1
    2
    3
    SELECT *
    FROM Products
    WHERE ISNULL(weight,0)=0

     

    九、模糊相配

    9.1 LIKE和%搭配

    %通配符能够代表恣意的字符,它能够表示0个,1个,率性多少个字符。

    9.2 通配符

    除了%以外,还恐怕有下划线(_卡塔 尔(阿拉伯语:قطر‎、方括号起来的characterlist,以致用方括号括起来的脱字符号(^卡塔 尔(英语:State of Qatar)加上characterlist。

    • 下划线表示叁个字符
    • [characterlist]意味着括号中字符的随便三个
    • [^characterlist]意味着没办法是括号中字符的轻便贰个
      例子:
      1
      2
      3
      4
      5
      SELECT 
      FirstName,
      LastName
      FROM Actors
      WHERE FirstName LIKE '[CM]ARY'

    找出以C只怕M起首并以AENVISIONY结尾的具备行。

    9.3 根据读音相称

    SOUNDEX和DIFFERENCE

    十、汇总量据

    10.1消释重复

    使用DISTINCT

    1
    2
    SELECT DISTINCE name,age
    FROM users

     

    即使age分歧,纵然name相符,那么那后生可畏行就不会被删除重复。

    10.2 聚合函数

    COUNTSUMAVGMINMAX,他们提供了对分组数据实行计数、求和、取平均值、取最小值和最大值等措施。

    1
    2
    3
    4
    5
    SELECT 
    AVG(Grade) AS 'Average Quiz Score'
    MIN(Grade) AS 'Minimum Quiz Score'
    FROM Grades
    WHERE GradeType='Quiz'

     

    COUNT函数能够有3中分化情势接受它。

    1.COUNT函数足以用来回到全数选中央银行的多少,而不管任何特定列的值。
    譬如:下边语句重临GradeType为’HomeWork’的全数行的数码:

    1
    2
    3
    4
    SELECT 
    COUNT(*) AS 'Count of Homework Rows'
    FROM Grades
    WHERE GradeType='HomeWork'

     

    这种艺术,会计数全体行的个数,固然当中有*NULL**。

    2.次之种办法钦点具体的列

    1
    2
    3
    4
    SELECT 
    COUNT(Grades) AS 'Count of Homework Rows'
    FROM Grades
    WHERE GradeType='HomeWork'

     

    首先种方法赶回3,那大器晚成种办法赶回2,为啥???因为,这种方法要满意Grades这一列有值,NULL值的行不会计数。

    3.选取首要字DISTINCT。

    1
    2
    3
    SELECT 
    COUNT(DISTINCT FeeType) AS 'Number of Fee Types'
    FROM Fees

     

    那条语句计数了FeeType列唯风流罗曼蒂克值的个数。

    10.3 分组数据-GROUP BY

    1
    2
    3
    4
    5
    6
    SELECT
    GradeType AS 'Grade Type',
    AVG(Grade)AS 'Average Grade'
    FROM Grades
    GROUP BY GradeType
    ORDER BY GradeType

    深感像EXCEL中的分类聚集作用。
    若果想把Grade为NULL值的充任0,那么能够用:

    1
    2
    3
    4
    5
    6
    SELECT
    GradeType AS 'Grade Type',
    AVG(ISNULL(Grade,0))AS 'Average Grade'
    FROM Grades
    GROUP BY GradeType
    ORDER BY GradeType

     

    • GROUP BY子句中的列的逐个是绝非意思的;
    • O福特ExplorerDEQashqai BY子句中的列的顺序是有意义的。

    10.4 基于聚焦查询条件-HAVING

    当针对带GROUP BY的一条SELECT语句应用任何查询条件时,大家应当要问查询条件是选取于独立的行依旧整个组。

    实则,WHERE子句是单独的实行查询条件。SQL提供了二个名叫HAVING的显要字,它同意对组等第使用查询条件。
    例子:
    翻看选修了档案的次序为选修“A”,平均战表在70分以上的学员姓名,平均成绩。

    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    Name,
    AVG(ISNULL(Grades,0)) AS 'Average Grades'
    FROM Grades
    WHERE GradeType='A'
    GROUP BY Name
    HAVING AVG(ISNULL(Grades,0))>70
    ORDER BY Name

     

    修要修类型为A,那么,那是那对行的查询,因而这里要用WHERE。
    不过,还要筛选平均战表,那么,那是贰个平均值,营造在聚合函数上的,并非单独的行,那就要求用到重大字HAVING。需求先将Student分组,然后把询问结果运用到基于全组的贰个集合总计上。

    WHERE只保障我们筛选了GradeType是A的行,HAVING保障平均成绩起码70分以上。

    小心:假设想要在结果中增添GradeType的值,倘若一直在SELECT前边加多那些列,将会出错。那是因为,全体列都应当要么出今后GROUP BY中,要么包罗在四个聚合函数中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
    Name,
    GradeType,
    AVG(ISNULL(Grades,0)) AS 'Average Grades'
    FROM Grades
    WHERE GradeType='A'
    GROUP BY Name,GradeType
    HAVING AVG(ISNULL(Grades,0))>70
    ORDER BY Name

     

    十一、组合表

    11.1 内接二连三来整合表-Inner Join

    透过书中的描述,笔者以为内接连更疑似用来将主键表、外键表连接起来的工具。
    例如:
    A表:

    userid name age
    1 michael 26
    2 hhh 25
    3 xiang 20

    B表:

    orderid userid num price
    1 1 2 3
    2 2 6 6
    3 1 5 5

    如上表格,那么要延续那八个表格,查询订单1的客商姓名,年龄,订单号:
    方式一:

    1
    2
    3
    4
    SELECT name,age,orderid
    FROM A,B
    WHERE A.userid=B.userid
    AND orderid=1

     

    方法二,使用以后的内接连完毕:

    1
    2
    3
    4
    5
    SELECT name,age,orderid
    FROM A
    INNER JOIN B
    ON A.userid=B.userid
    AND orderid=1

     

    ON关键字钦定四个表怎样标准的一而再。

    内连接中表的逐一:FROM 子句钦赐了A表,INNEMurano JOIN 子句钦定B表,大家调换A,B顺序,所收获的结果相似的!只是显示列的生机勃勃豆蔻梢头大概会分裂而已。

    不提议采纳方法豆蔻梢头的格式。关键字INNE库罗德 JOIN ON的帮助和益处在于突显地代表了三回九转的逻辑,那是它们唯风华正茂的用项。WEHERE的意义远远不够鲜明。因为它是原则的意味啊,不是连连的!

    11.2 外连接

    外连接分为左连接(LEFT OUTE奥迪TT RS JOIN)、右连接(EnclaveIGHT OUTE奥迪Q7JOIN)、全连接(FULL OUTE奥迪Q5 JOIN)。

    OUTEENVISION是可以省略的。

    左连接(LEFT JOIN)

    1
    2
    3
    4
    5
    SELECT name,age,orderid
    FROM A
    LEFT JOIN B
    ON A.userid=B.userid
    AND orderid=1

    外接连的强硬之处在于,主表中的数据一定都会保留,从表中列未有值的状态,用NULL补充。

    LEFT JOIN 左边包车型客车表为主表,侧边的表为从表。

    11.3 自连接

    自连接一定用到表的外号。

    1
    2
    3
    4
    SELECT A.name,B.name as ManagerName
    FROM worker as A
    LEFT JOIN worker as B
    ON A.managerid=B.id

     

    11.4 创制视图

    1
    2
    3
    CREATE VIEW ViewName AS
    SelectStatement
    [WITH CHECK OPTION]

    视图中不能够包括OQX56DE揽胜极光 BY子句。

    [WITH CHECK OPTION]代表对视图举办UPDATE,INSERT,DELETE操作时任然保障了视图定义时的尺度表明式。

    除去视图:

    1
    DROP VIEW ViewName

     

    更正视图:

    1
    2
    ALTER VIEW ViewName AS
    SelectStatement

     

    视图的长处

    1. 简化客商的操作
    2. 使客商以严密看待同生龙活虎数据
    3. 对重构数据库提供了一定水平的逻辑独立性
    4. 对地下数据提供安全保险

    十二、补充

    12.1 子查询

    能够用3种关键的艺术来钦点子查询,总计如下:

    • 当子查询是tablelist的意气风发局地时,它钦命了二个数据源。
    • 当子查询是condition的后生可畏有的时,它产生查询条件的后生可畏局地。
    • 当子查询是columnlist的意气风发有个别时,它成立了一个单个的计量的列。

    12.2 索引

    目录是大器晚成种物理结构,可感觉数据库表中大肆的列增加索引。

    目录的目标是,当SQL语句中含有该列的是偶,能够加快数据的追寻。

    目录的宿疾是,在数据库中,索引供给越来越多的仓储硬盘。另贰个消极面因素是,索引平常会回降相关的列数据更新速度。那是因为,任曾几何时候插入只怕改正后生可畏行记录时,索引都必须要另行计算该列中的值的科学的排列顺序。

    能够对随便的列实行索引,不过只好钦赐七个列作为主键。钦定一个列作为主键意味着两件事情:首先那些列成为了索引,其次有限扶植那列饱含唯生机勃勃的值。

    1
    2
    CREATE INDEX Index2
    ON MyTable (ColumnFour)

     

    删除二个目录:

    1
    2
    DROP INDX Index2
    ON MyTable

     

     

    本文由威尼斯官方网站发布于威尼斯官方网站登录,转载请注明出处:正文适用SQL Server二零一零语法

    关键词:

上一篇:没有了

下一篇:没有了