SQL基础知识(一)

纯属笔记记录------大部分内容来自公众号SQL数据库开发

数据库:SQL Servers

本博客主要介绍的还是SQL Servers背景下关于sql的一些基本用法。笔者自身学习的是MySQL,若有疑问,欢迎留言。

目录

SQL执行顺序

1、SELECT 的用法

2、DISTINCT 语句

3、TOP语句

4、WHERE子句

5、AND & OR

6、ORDER BY

7、GOURP BY

8、HAVING 子句

9、INSERT INTO子句

10、UPDATE

11、DELECT

12、LIKE运算

13、IN

14、BETWEEN

15、JOIN连接

16、UNION

17、SELECT INTO和INSERT INTO SELECT


SQL执行顺序

小括号表示执行查询语句时的顺序。

(8) SELECT (9) DISTINCT (11) <Top Num> <select list>
(1) FROM [left_table] 
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH <CUBE | RollUP>
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>

1、SELECT 的用法

SELECT 语句定义:SELECT语句用于从表中选取数据。结果被存储在一个结果表中(称为结果集)。

SELECT语法:

SELECT 列名称 FROM 表名称
SELECT * FROM 表名称

注释:SQL语句对大小写不敏感。SELECT等效于select

2、DISTINCT 语句

DISTINCT:用于返回唯一的、不同的值。

DISTINCT语法:

SELECT DISTINCT 列名称 FROM 表名称

3、TOP语句

TOP子句的定义:TOP子句用于要返回的记录数目。对于拥有数千条记录的大型表来说,TOP子句时非常有用的。

注意:并非所有的数据库系统都支持TOP子句。

SQL Server TOP的语法

SELECT TOP number|percent columns FROM table_name

MySQL 和Oracle中的SQL SELECT TOP是等价的

MySQL语法:

SELECT columns FROM table_name LIMIT number

Oracle语法

SELECT columns FROM table_name WHERE ROWNUM <=number

实例:

SELECT TOP 2 * FROM Customers
# 从Customers中查询出前2行数据
SELECT TOP 50 PERCENT * FROM Customers
# 从Customers中查询出前50%的数据

注意:1)当50%为小数时,所取结果会向上取整。

           2)TOP主要用在对查询结果进行分页,这样可以减少显示的数据量,提高查询效率。一般与ORDER BY结合使用。

 

4、WHERE子句

如需有条件地从表中选取数据,可将WHERE子句添加到SELECT语句。

WHERE语法

SELECT 列名称 FROM 表名称 WHERE 列运算符 值

如下运算符在WHERE子句中使用:

=、<>、>、<、>=、<=、BETWEEN(在某个范围内)、LIKE(搜索某种模式)、IN(制定针对某个列的多个可能值)、EXISTS(在子查询中匹配到符合条件的数据行)

注意:WHERE的作用其实就是过滤数据的作用,根据WHERE后面的条件,将需要的数据列出来,已排除那些不需要的数据。

5、AND & OR

AND和OR运算符用于基于一个以上的条件记录进行过滤。

AND和OR使用:在WHERE子语句中把两个或多个条件结合起来。

语法:

SELECT * FROM Customers WHERE 姓名='张三' OR 城市='北京'
SELECT * FROM Orders WHERE (客户ID=3 OR 客户ID=1) AND 发货ID=4

6、ORDER BY

ORDER BY关键字对结果集进行排序。按升序(ASC)或降序(DESC)对接国际进行排序。

语法:

SELECT column1,column2,..., FROM table_name ORDER BY column1,column2,...,ASC|DESC

实例:

SELECT * FROM Customers ORDER BY 省份,姓名
# 对结果集按多列排序时,以顺序进行排序,即先按照省份排序,在同一省份内,按照姓名排序
SELECT * FROM Customers ORDER BY 省份 ASC,姓名 DESC
# 对结果集按省份升序排序,姓名降序排序

7、GOURP BY

GROUP BY用于结合聚合函数,根据一个或多个列对结果集进行分组。

语法:

SELECT column_name 
aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name

实例

SELECT 城市,COUNT(*) AS 客户数量 
FROM Customers
GROUP BY 城市
# 从表Customers中以城市进行分组,并将分组的情况统计为“客户数量”,得到一个结果集,再从中选择“城市”和“客户数量”输出

GROUP BY多表链接

SELECT c.城市,COUNT(o.订单ID) AS 订单数量 FROM Customers c
LEFT JOIN Orders o ON c.客户ID=o.客户ID GROUP BY c.城市
# 根据客户ID将Customers和Orders拼接得到一个结果集,对此结果集按照城市进行分组,然后进行COUNT操作,之后SELECT选出显示的结果表

8、HAVING 子句

HAVING使你能够指定过滤条件,从而控制查询结果中哪些可以出现在最终结果里面。

WHERE子句是对被选择的列施加条件,而HAVING子句则对GROUP BY子句所产生的组施加条件。

HAVING语法:

SELECT col1,col2,.., 
FROM table1,table2 
WHERE [condition]
GROUP BY col1,col2
HAVING [condition]
ORDER BY col1,col2

在SELECT查询中,HAVING必须紧跟GROUP BY子句,并出现在ORDER BY子句之前

实例:

SELECT * FROM Customers
WHERE 城市 IN (
SELECT 城市 FROM Customers
GROUP BY 城市
HAVING COUNT(1)>1
)
# 先对小括号内进行处理:对Customers的列“城市”进行分组,并筛选出城市至少出现1次的所有城市作为结果集。然后,查询所有在小括号内的城市,并显示出来

注意:上述代码使用了一个子查询,主要是因为在SQL Server中GROUP BY分组后,在SELECT后面显示的列里面只能显示分组的列。因此,如果我们需要显示更多的列,需要通过子查询在传递给外面的主查询。并且先子查询,后进行主查询的方式,可以提高查询效率。

9、INSERT INTO子句

INSERT INTO语句用于向表中插入新记录。

语法:1)第一个表单没有指定要插入数据的列名称,只提供要插入的值。

INSERT INTO table_name (column1,column2,...) VALUES (value1,value2,....)

2)如果要为表中的所有列添加值,则不需要在SQL查询中指定列名称。但是,请确保值得顺序与表中的列顺序相同。INSERT INTO语法如下:

INSERT INTO table_name VALUES (values1,values2,...)

10、UPDATE

UPDATE语句作用于更新表中的现有记录。

语法:

UPDATE table_name
SET column1=value1,column2=value2,...
WHERE condition

11、DELECT

DELECT语句用于删除表中现有记录。

语法:

DELETE FROM table_name WHERE condition

注意:UPDATE,DELECT操作时,需要在满足条件下进行操作,否则会对所有数据进行操作。

12、LIKE运算

LIKE作用:在WHERE子句中使用LIKE运算符搜索列中的指定模式。

有两个通配符与LIKE运算符一起使用:

%  百分号表示零个,一个,多个字符。

_ 下划线表示单个字符

语法:

SELECT col1,col2,..., FROM table_name WHERE colN LIKE pattern

LIKE运算符的例子:

WHERE 地址LIKE ‘a%’   : 查找以'a'开头的任何值

WHERE 地址 LIKE‘%a’  : 查找以'a'结尾的任何值

WHERE 地址 LIKE '%or%'  : 在任何位置查找有'or'的值

WHERE 地址 LIKE ‘_r%’  : 在第二个位置查找任何具有'r'的值

WHERE 地址LIKE‘a_%_%’ : 查找以'a'开头,且字符至少为3个字符的值

WHERE 地址LIKE'a%o'  : 找到以'a'开头,以'o'结尾的值

13、IN

IN运算符允许在 WHERE子句中指定多个值。IN运算符是多个OR条件的简写。

语法:

SELECT col_name FROM table_name WHERE col_name IN (val1,val2,...)
or
SELECT col_name FROM table_name WHERE col_name IN (SELECT STATEENT)

实例:

SELECT * FROM Customers WHERE 省份 NOT IN ('浙江省','上海市','北京市');

注意:IN是将需要查找的内容列出来放在后面的括号中,如此IN只查找括号里的内容,从而起到筛选的作用。另外,IN里面可以放多种数据类型,常见的包括日期,字符,数值等类型。

14、BETWEEN

BETWEEN操作符用于介于两个值之间的数据范围之内。值可以是数字,文本或者日期。

语法:

SELECT col_name FROM table_name WHERE col_name BETWEEN value1 AND value2

实例:

SELECT * FROM Products WHERE 价格 BETWEEN 30 AND 60;
# 筛选出价格在20~60之间的所有列

SELECT * FROM Products WHERE 价格 NOT BETWEEN 30 AND 60;
or
SELECT * FROM Products WHERE NOT 价格 BETWEEN 30 AND 60;
# 均表示产品价格不在30~60范围内

SELECT * FROM Products WHERE (价格 BETWEEN 10 AND 60) AND 名称 NOT IN ('大米','香蕉');
# 筛选出产品价格在10~60之间,同粮食不在('大米','香蕉')之内

SELECT * FROM Products WHERE 名称 BETWEEN '面包' AND '香蕉'
# 筛选出产品名称在‘面包’和‘香蕉’之间的所有物品。这里,按照‘面包’和‘香蕉’的拼音进行选择,
将会选择出拼音在‘面包’和‘香蕉’之间的所有名称

SELECT * FROM Orders WHERE 订单日期 BETWEEN '2018-06-28' AND '2018-06-29';
# 筛选出定期日期在2018-6-28到2018-6-29内所有时间段的订单数据

15、JOIN连接

JOIN连接用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。最常见的JOIN类型:INNER JOIN(最简单的JOIN)。INNER JOIN从多个表中返回满足JOIN条件的所有行。

实例:

SELECT o.订单ID,c.姓名,o.订单日期 FROM Orders o INNER JOIN Customers c ON o.客户ID=c.客户ID;
# 根据Orders和Customers的客户ID将两个表连接,返回满足条件的所有选中列

不同的JOIN类型:

1)INNER JOIN :如果表中至少一个匹配,则返回行。

2)LEFT JOIN : 即使右表中没有匹配,也从左表返回所有的行。

3)RIGHT JOIN :即使左表没有,也从右表返回所有行。

4)FULL JOIN :只要其中一个表种存在匹配,则返回行。

 

1)INNER JOIN:内部链接INNER JOIN关键字选择两个表中具有匹配值的记录。

语法:

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name=table2.column_name;
# 根据表1和表2的列名称匹配时将表链接,并返回所有列

2)LEFT JOIN :SQL左链接LEFT JOIN关键字返回左表(表1)中的所有行,即使右表(表2)中没有匹配。如果在正确的表中没有匹配,结果是NULL。

语法:

SELECT column_name FROM table1 LEFT JOIN table2 ON table1.column_name=table2.column_name;
# 根据表1的列名称与表2进行匹配,若表2无法与其匹配,则返回NULL

3)RIGHT JOIN:SQL右链接RIGHT JOIN关键字返回右表(table2)的所有行,即使在左表(table1)上没有匹配。如果左表没有匹配,则结果为NULL。

语法:

SELECT column_name FROM table1 RIGHT JOIN table2 ON table1.column_name=table2.column_name;
# 根据表2的列名称与表1进行匹配,若表1无法与其匹配,则返回NULL

4)FULL OUTER JOIN:当左(表1)或右(表2)表记录匹配时,FULL OUTER JOIN关键字将返回所有记录。

注意:FULL OUTER JOIN可能会返回非常大的结果集。其返回的是表格多有的情况,不匹配时返回均为NULL

语法:

SELECT column_name FROM table1 FULL OUTER JOIN table2 ON table1.column_name=table2.column_name;

16、UNION

UNION的作用:UNION运算符用于组合两个或更多SELECT语句的结果集。

UNION的使用前提UNION中的每个SELECT语句必须具有相同的列数:

           1)这些列必须具有相似的数据类型;

           2)每个SELECT语句中的列也必须以相同的顺序排列。

语法:

SELECT column_name FROM table1 UNION SELECT column_name FROM table2

注意:默认情况下,UNION运算符选择一个不同的值。如果允许重复值,请使用UNION ALL.

UNION ALL语法:

SELECT column_name FROM table1 
UNION ALL 
SELECT column_name FROM table2

注释:UNION结果集中的列名总是等于UNION中第一个SELECT语句中列名。

带有WHERE的UNION ALL,包含重复值

SELECT 城市,省份 FROM Customers WHERE 省份='上海市' 
UNION ALL 
SELECT 城市,省份 FROM Suppliers WHERE 省份='上海市'

带有WHERE的UNION,不包含重复值

SELECT 城市,省份 FROM Customers WHERE 省份='上海市' 
UNION 
SELECT 城市,省份 FROM Suppliers WHERE 省份='上海市'

实例:以下SQL列下所有客户和供应商所在城市和省份:

SELECT '客户姓名' As Type,城市,省份
FROM Customers
UNION
SELECT '供应商名称',城市,省份
FROM Suppliers

结果:

注意:UNION就是将多段功能类似的SQL连接起来,并且可以去掉重复的行,有DISTINCT的功能。UNION ALL则只是单纯的将多段类似SQL按不同功能或作用拆分成一小段SQL进行拼接,可以有效提高查询效率。

17、SELECT INTO和INSERT INTO SELECT

(1)SELECT INTO作用:SELECT INTO语句从一个表中复制数据,然后将数据插入到另一个新表中。

SELECT INTO 语法:

#将所有的列都复制到新表中
SELECT * INTO newtable [IN extrernaldb]
FROM table1
#只复制希望的列插入到新表中
SELECT column_name INTO newtable [IN extrernaldb]
FROM table1

注意:将使用SELECT语句中定义的列名和类型创建新表。可以使用AS子句来应用一个新名称

实例:

SELECT * INTO CustomersBackup2018 FROM Customers;
# 将Customers中所有列全部插入新的表CustomersBackup2018,相当于复制

SELECT * INTO AdventureWorks.dbo.CustomersBackup2018
FROM Customers
# 将Customers表赋值到数据库AdventureWorks的CustomersBackup2018表中

SELECT * INTO CustomersBackup2018_2
FROM Customers
WHERE 省份='广东省';
# 从表Customers中选出广东省的所有行数据插入到CustomersBackup2018_2

注意:SELECT INTO语句可以用于在另一种模式下创建一个新的空表,即只有表结构,没有数据。只需添加WHERE子句,使查询返回时没有数据:

SELECT *
INTO newtable
FROM table1
WHERE 1=0

(2)INSERT INTO SELECT作用

INSERT INTO SELECT语句从表中复制数据,并将数据插入现有的表中。目标表中的任何现有行都不会受影响。

语法:

# 将所有列从一个表中复制到另一个已经存在的表中
INSERT INTO table2 
SELECT * FROM table1

# 将想要的列复制到另一个现有的表中
INSERT INTO table2
(column_name)
SELECT column_name
FROM table1

实例:

INSERT INTO Custormers (姓名,省份) 
SELECT 供应商名称,省份 FROM Suppliers;
# 从Suppliers选出'供应商名称','省份'插入Custormers

INSERT INTO Customers (姓名,省份)
SELECT 供应商名称,省份 FROM Suppliers
WHERE 省份='上海市';
# 从Suppliers满足省份='上海市'的'供应商名称','省份' 插入Customers

注意:SELECT INTO用来复制表和表结构是非常方便的,特别是在进行表之间计算时,可以将部分数据先插入到一个临时表中,计算完成再删除临时表。INSERT INTO SELECT则是插入语句的另一种写法,可以直接将查询的结果插入到需要的表中,从而省去逐条手工插入数据的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值