计算机教程

当前位置:3522.com > 计算机教程 > sql语句进阶教程

sql语句进阶教程

来源:http://www.4sports-uk.com 作者:3522.com 时间:2019-05-11 03:52

转载自:http://blog.csdn.net/u011001084/article/details/51318434

最近从图书馆借了本介绍SQL的书,打算复习一下基本语法,记录一下笔记,整理一下思路,以备日后复习之用。

最近从图书馆借了本介绍SQL的书,打算复习一下基本语法,记录一下笔记,整理一下思路,以备日后复习之用。

PS:本文适用SQL Server2008语法。

PS:本文适用SQL Server2008语法。

一、关系型数据库和SQL

实际上准确的讲,SQL是一门语言,而不是一个数据库。

什么是SQL呢?简而言之,SQL就是维护和使用关系型数据库中的的数据的一种标准的计算机语言。

一、关系型数据库和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)和字段(field)实际上就称为行(row)和列(column)。

1.1 SQL语言主要有3个主要的组成部分。

  1. DML(Data Manipulation Language)数据操纵语言。这个模块可以让我们检索、修改、增加、删除数据库中的数据。
  2. DDL(Data Definition Language)数据定义语言。是的我们能够创建和修改数据库本身。如:DDL提供ALTER语句,他让我们可以修改数据库中表的设计。
  3. DCL(Data Control Language)数据控制语言,用于维护数据库的安全。

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

1.2 主键和外键

主键之所以有必要:

  • 首先使你唯一标识表中单独的一行。主键确保了唯一性。
  • 可以很容易的将一个表和另一个表关联。
  • 主键一般就会自动默认创建索引,提高了查询速度。

外键就是说A表中的某个字段,同时是B中的主键,那么这个字段就是A表中的外键。希望A表中的这个外键的值必须是B中已经存在的值。

1.2 主键和外键

主键之所以有必要:

  • 首先使你唯一标识表中单独的一行。主键确保了唯一性。
  • 可以很容易的将一个表和另一个表关联。
  • 主键一般就会自动默认创建索引,提高了查询速度。

外键就是说A表中的某个字段,同时是B中的主键,那么这个字段就是A表中的外键。希望A表中的这个外键的值必须是B中已经存在的值。

1.3 数据类型

一般来讲,有3中重要的数据类型:

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

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

字符类型区别[[1]](https://www.jianshu.com/p/0949203c63b8#fn1)

类型 长度
char 固定长度
nchar 固定长度
varchar 可变长度
nvarchar 可变长度
  • 1字节=8位
  • bit就是位,也叫比特位,是计算机表示数据最小的单位。
  • byte就是字节,1byte=8bit,1byte就是1B;
  • 一个字符=2字节;

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表示空值。

1.3 空值

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

二、简单增删改查

二、简单增删改查

2.1 查(列名有空格的情况)

SELECT [ last name]
FROM Customers

用方括号将有空格的列名括起来。
PS: MySql中用重音符`3522.com,(~)按键。Oracle用双引号。

2.1 查(列名有空格的情况)

1
2
SELECT [ last name]
FROM Customers

用方括号将有空格的列名括起来。
PS: MySQL中用重音符`(~)按键。Oracle用双引号。

查询顺序,SQL执行顺序[[2]](https://www.jianshu.com/p/0949203c63b8#fn2)

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

查询顺序,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 增

INSERT INTO tablename
(columnlist)
VALUES
(RowValues1)
(RowValues2)
(repeat any number of times)

2.2 增

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

2.3 改

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

2.3 改

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

2.4 删

DELETE
FROM table
WHERE condition

删除前可以验证一下:

SELECT 
COUNT(*)
FROM table
WHERE condition

如果想要删除所有的行,可以:

DELETE FROM table

或者

TRUNCATE TABLE table

TRUNCATE TABLE优势在于速度更快,但是不提供记录事务的结果。
另外一个不同点是,TRUNCATE TABLE重新设置了用于自增型的列的当前值,DELETE不会。

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

三、别名

关键字:AS

3.1 计算字段

使用计算字段可以做如下的事情:

  • 选择特定的单词或者数值
  • 对单个或者多个列进行计算
  • 把列和直接量组合在一起。

3.1 计算字段

使用计算字段可以做如下的事情:

  • 选择特定的单词或者数值
  • 对单个或者多个列进行计算
  • 把列和直接量组合在一起。

3.2 直接量

这个直接量和表中的数据没有任何关系,就是为了说明所用,下面这种类型的表达式就叫做直接量(literal value)。

3522.com 1

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

3522.com 2

如图,结果中直接量就在一列中了。

3.2 直接量

这个直接量和表中的数据没有任何关系,就是为了说明所用,下面这种类型的表达式就叫做直接量(literal value)。
3522.com 3

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

3522.com 4
如图,结果中直接量就在一列中了。

3.3 算数运算

例子1:

SELECT  num*price AS total
FROM orders

例子2:

SELECT  firstname ' ' lastname AS 'fullname'
FROM users

在MySql中连接要是用CONCAT函数:

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

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)列的别名

SELECT firstname AS fn
FROM customers

2) 表的别名

SELECT firstname 
FROM customers AS cu

说明:

  1. 列的别名是为了显示用的,别名会作为查询结果的表头,不能在WHERE中使用列的别名,会出错!!!
  2. 表的别名确实是为了方便操作用的,可以在WHERE中使用列的别名进行!

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 字符函数

4.1 字符函数

LEFT&RIGHT

LEFT(CharacterValue,NumberOfCharacters)
含义:选择CharacterValue字段的左边NumberOfCharacters几个字符。
ps:RIGHT是右边几个字符。

LEFT&RIGHT

LEFT(CharacterValue,NumberOfCharacters)
含义:选择CharacterValue字段的左边NumberOfCharacters几个字符。
ps:RIGHT是右边几个字符。

LTRIM&RTRIM

LTRIM(CharacterValue)
可以删除左边开始的空格。RTRIM作用类似。

LTRIM&RTRIM

LTRIM(CharacterValue)
可以删除左边开始的空格。RTRIM作用类似。

SUBSTRING

SUBSTRING(CharacterValue,StartPositon,NumberOfCharacters)
含义:选择从开始位置(包括),N个长度的字符。

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

返回:white

SUBSTRING

SUBSTRING(CharacterValue,StartPositon,NumberOfCharacters)
含义:选择从开始位置(包括),N个长度的字符。

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

 

返回:white

4.2 日期/时间函数

4.2 日期/时间函数

GETDATE

SELECT GETDATE()

返回当前日期和时间。
PS:在MySql中,等价函数是NOW,在Oracle中是CURRENT_DATE

GETDATE

1
SELECT GETDATE()

返回当前日期和时间。
PS:在MySql中,等价函数是NOW,在Oracle中是CURRENT_DATE

DATEPART

能够分析具体的日期,并且返回诸如该日期是该月中的第几天,或者该年份中的第几周等信息。

DATEPART(datepart,DateValue)

datepart可以是许多不同的值,如下都是有效值:

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

DATEPART

能够分析具体的日期,并且返回诸如该日期是该月中的第几天,或者该年份中的第几周等信息。

1
DATEPART(datepart,DateValue)

 

datepart可以是许多不同的值,如下都是有效值:

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

DATEDIFF

可以让我们得到任意两个日期之间相差的天数(或周数、月数等)。

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函数只允许我们计算两个日期之间的天数,如果想要得到一个正数,结束的日期通常要作为第一个参数:

DATEDIFF(enddate,startdate)

Oracle中没有等价函数

DATEDIFF

可以让我们得到任意两个日期之间相差的天数(或周数、月数等)。

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 数值函数

4.3 数值函数

ROUND

允许我们四舍五入。

ROUND(numericvalue,decimalpalaces)

ROUND

允许我们四舍五入。

1
ROUND(numericvalue,decimalpalaces)

 

RAND

用来产生随机数

RAND([seed])

没有参数时,它会返回0-1之间的一个随机数。

SELECT RAND() AS 'Random Value'

可选参数seed有的情况下,每次将返回相同的值。这让我想起了Python中的Random包。看来很多时候,一些东西是共通的啊。

RAND

用来产生随机数

1
RAND([seed])

 

没有参数时,它会返回0-1之间的一个随机数。

1
SELECT RAND() AS 'Random Value'

 

可选参数seed有的情况下,每次将返回相同的值。这让我想起了Python中的Random包。看来很多时候,一些东西是共通的啊。

PI

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

SELECT ROUND(PI(),2)

将会返回:3.14

PI

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

1
SELECT ROUND(PI(),2)

 

将会返回:3.14

4.4 转换函数

4.4 转换函数

CAST函数

允许我们把数据从一种类型转换成另一种类型。

CAST(expression AS DateType)

例子:

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

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值转换成一个有意义的值。

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

ISNULL函数,很有用

可以把NULL值转换成一个有意义的值。

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

 

五、排序函数

五、排序函数

5.1 添加排序

SELECT columnlist
FROM tablelist
ORDER BY columnlist

默认是升序,ASC,因此,上面等价于:

SELECT columnlist
FROM tablelist
ORDER BY columnlist ASC

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关键字:

SELECT columnlist
FROM tablelist
ORDER BY columnlist DESC

5.2 降序

使用DESC关键字:

1
2
3
SELECT columnlist
FROM tablelist
ORDER BY columnlist DESC

 

5.3 根据多列

SELECT 
FirstName,
LastName
FROM Customers
ORDER BY LastName, FirstName

注意:列的顺序很重要,首先按照LastName排序,然后按照FirstName排序。

5.3 根据多列

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

注意:列的顺序很重要,首先按照LastName排序,然后按照FirstName排序。

5.4 根据计算字段

SELECT LastName ',' FirstName AS 'Name'
FROM Customers
ORDER BY Name

因此,从这儿可以知道,列别名不可以用在WHERE中,但可以用在ORDER BY中。
例子

SELECT FirstName,LastName
FROM Customers
ORDER BY LastName FirstName AS 'Name'

本文由3522.com发布于计算机教程,转载请注明出处:sql语句进阶教程

关键词: 3522.com

上一篇:Weblogic部署项目三种方式

下一篇:没有了