SQL语言概述

SQL是结构化查询语言(Structure Query Language),1974年提出,1979年被IBM实现,SQL语言已经成为关系型数据库的标准语言。

包括:

  1. DDL数据定义语言
    1. 语句有CREATE ,ALTER ,DROP,操作表,视图,触发器,存储过程
  2. DML数据操作语言
    1. 语句有SELECT ,INSERT , UPDATE , DELETE,用于检索和操作数据
  3. DCL数据控制语言
    1. 语句有GRANT , DENY , REVOKE,只有sysadmin,数据库创建者,拥有者,安全管理员有权利执行,用来设置或更改数据库用户或角色权限
  4. 流程控制
    1. 常用语句有BEGIN...END , IF...ELSE , WHILE , BREAK , GOTO , WAITFOR , RETURN等语

逻辑运算符

  • AND
  • OR
  • NOT
  • ALL,所有表达式为true才为true
  • ANY,表达式中一个为true则为true
  • BETWEEN ,在某个范围内则为true
  • EXISTS
  • IN ,操作数为表达式列表中的一个则为true。

语句基本格式

SELECT * FROM 表名

WHERE 条件

GROUP BY 字段 HAVING 表达式

ORDER BY 字段 ASC| DESC

  

说明:GROUP BY子句后可以使用HAVING 短语,用来分组后筛选,HAVING 必须跟随ORDER BY子句使用。

默认情况,查询结构表的标题可以是表的字段名,也可以无标题,还可以使用AS 对字段标题进行修改

USE 销售管理
GO
SELECT 商品名称,型号,销售价-进价 AS 差价,库存 FROM 商品表
GO

使用查询生成新表,或者临时表

USE 销售管理
GO
SELECT 商品名称,型号,销售价-进价 AS 差价,库存 INTO 商品表附表 FROM 商品表
GO

结果

临时表的使用

临时表在本次服务器连接过程中有效,一旦服务器断开连接,临时表失效,并被删除。

USE 销售管理
GO
SELECT 商品名称,型号,销售价-进价 AS 差价,库存 INTO #临时商品表 FROM 商品表
GO

快速生成数据表结构(空白哦)

因为WHERE 1=2不成立,所以就不会检索出符合条件的数据,生成的是一个没有数据的空白表

USE 销售管理
GO
SELECT 商品名称,型号,销售价-进价 AS 差价,库存 INTO #商品表副本 FROM 商品表 WHERE 1=2
GO SELECT * FROM #商品表副本

SQL汇总查询

聚合函数

常用的聚合函数有6个:

  1. COUNT(*),统计所有记录个数
  2. COUNT[ DISTINCT] 字段,统计字段中值的个数
  3. SUM 字段,对指定字段(数值型)求和
  4. AVG 字段,对指定字段(数值型)求平均值
  5. MAX 字段,求一个字段最大值
  6. MIN 字段,求一个字段最小值

分组查询语句

有时候统计每种商品销售总金额,需要对销售表中销售金额进行汇总,然后再进行操作,这就是分组查询。

GROUP BY子句实现,

GROUP BY 字段 HAVING 分组后的筛选条件表达式

注意:BY 字段 按指定字段进行分组,字段值相同的记录放在一组,每一组汇总只有一条数据。

HAVING 的筛选是对经过分组后结果进行筛选,而不是对原始表筛选。

SELECT 子句后的字段列表,必须是聚合函数 ,或者是GROUP BY 子句中的字段。

demo.sql

USE 销售管理
GO
SELECT 品牌,COUNT(品牌) AS 数量 FROM 商品表 GROUP BY 品牌
--HAVING 品牌='A牌'

结果

注意这里的HAVING子句和WHERE的区别:

HAVING可以有聚集函数,而WHERE子句不可以

HAVING作用于分组后的结果集,WHERE 子句作用于基本表

下面来一个小demo,用来查找某个属性的值出现最多的那个记录

原表

现在查找哪个品牌数量最多,并找出这个品牌的记录

demo

USE 销售管理
GO
--申明变量用来存储数量最多的品牌
DECLARE @ELE VARCHAR(20)
SELECT @ELE=A.品牌 FROM (SELECT TOP 1 品牌,COUNT(品牌) AS 数量 FROM 商品表 GROUP BY 品牌
ORDER BY 数量 DESC) A
--print @ele SELECT * FROM 商品表 WHERE 品牌=@ELE

结果集

汇总合计函数ROLLUP(在sqlserver2008叫做COMPUTE)

使用这个函数,需要最分组函数的最后添加with rollup,然后会在最后多一行。

分组

USE 销售管理
GO
SELECT 品牌,COUNT(品牌) AS 数量 FROM 商品表 GROUP BY 品牌

使用ROLLUP汇总

USE 销售管理
GO
SELECT 品牌,COUNT(品牌) AS 数量 FROM 商品表 GROUP BY 品牌 WITH ROLLUP

连接查询

就是多个表单的关联查询

  • INNER JOIN,内连接
  • LEFT JOIN,左连接,结果包含满足条件的行和左侧表的全部行,使用NULL值代替无法匹配的值
  • RIGHT JOIN,右连接
  • FULL JOIN,全连接,结果包含满足条件的行和2侧表的全部行
  • CROSS JOIN,交叉连接,结果包含2个表的所有行的组合,2个表的笛卡尔操作,用的不多

内连接范例

使用sqlserver语法

USE 销售管理
GO
SELECT A.商品名称,A.品牌,A.销售价,B.类型名称 FROM 商品表 A,商品类型表 B
WHERE A.类型=B.类型编号

使用ANSI语法

USE 销售管理
GO
SELECT A.商品名称,A.品牌,A.销售价,B.类型名称 FROM 商品表 A
INNER JOIN 商品类型表 B ON A.类型=B.类型编号

注意:<表名> A的意思是将某个表在这一次查询红命名为A,这样在整个查询中都可以使用A代替该表,简化操作。

子查询

子查询出现的形式:

  • 多数情况出现在WHERE 子语句中
  • 出现在外部查询的SELECT 子语句中
  • 出现在外部查询的FROM 子句中,即把查询结果集看做另外一张表

使用比较运算符的子查询

/*查询一级买家信息*/
SELECT * FROM 买家表
WHERE 级别=
(SELECT 级别编号 FROM 买家级别表 WHERE 级别名称='一级')

使用ALL ANY运算符的子查询

当子查询返回的是单列多值,使用ALL ANY和比较运算符构成特殊查询

  • >ANY,表示大于子查询结果的某个值,就是大于查询结果最小值
  • =ANY,等于查询结果的某个值,相当于IN
  • <ANY,小于查询结果的最大值
  • >ALL,大于查询结果最大值
  • !=ALL,相当于NOT IN

比如查询那些台式电脑比笔记本电脑的进价还要贵

/*查询那些台式电脑比笔记本电脑的进价还要贵*/
SELECT * FROM 商品表
WHERE 商品名称='台式机' AND 进价>ANY
(SELECT 进价 FROM 商品表 WHERE 商品名称='笔记本')

使用IN运算符的子查询

比如查询进价大于5000的商品销售情况

/*查询进价大于5000的商品销售情况*/
SELECT 商品编号,买家编号 FROM 销售表
WHERE 商品编号 IN
(SELECT 商品编号 FROM 商品表 WHERE 进价>5000)

使用EXISTS运算符的子查询

用来判断子查询是否有结果返回,NOT EXISTS的作用刚好相反

比如查询至少有一次实际销售价比进价还低的商品信息

/*查询至少有一次实际销售价比进价还低的商品信息*/
SELECT * FROM 商品表 A
WHERE EXISTS
(SELECT * FROM 销售表 B
WHERE A.商品编号=B.商品编号 AND B.实际销售价格<A.进价)

由于不需要子查询返回具体值,所以这种子查询的通常返回的列为*的格式

有个查询很难理解,记录如下

查询销售表每种商品(由商品编号区分)销售价格最贵的销售情况

分析:首先将商品种类分组

SELECT 商品编号,MAX(实际销售价格) FROM 销售表
GROUP BY 商品编号

这里还不能输出要求的信息,所以还要使用自连接(自己与自己的一个副本连接)

原表

经过筛选

/*查询销售表每种商品(由商品编号区分)销售价格最贵的销售情况*/
SELECT * FROM 商品表 A
WHERE 销售价=
(SELECT MAX(销售价) FROM 商品表 B WHERE A.品牌=B.品牌)
ORDER BY 商品编号

数据库中数据的管理

插入数据INSERT

使用INSERT语句插入数据进数据表,有2种方式:插入单行数据(使用VALUES),插入多行数据(使用SELECT)

插入单行数据

/*插入单行数据*/
INSERT INTO 买家表(买家编号,买家名称,买家电话,级别)
VALUES('M05','薛松','5362313','J02');

当插入数据的数量和顺序和表中字段一一对应,可以省略字段名列表

/*插入单行数据*/
INSERT INTO 买家表
VALUES('M06','宋松','5362220','J02');

插入多行数据

新建一张表,名为“高价销售表类”,结构与销售表相同,将销售表的实际销售价格>3000的记录插入该表。

/*插入多行数据*/

--建立一张空表
SELECT * INTO 高价销售表 FROM 销售表 WHERE 1=2
GO --插入多行数据
INSERT INTO 高价销售表(商品编号,买家编号,实际销售价格,销售日期,销售数量)
SELECT 商品编号,买家编号,实际销售价格,销售日期,销售数量
FROM 销售表 WHERE 实际销售价格>3000
GO

为了建立一张空白表,查询条件WHERE 1=2永远不成立,这个是一个常用的方法。

将所有一级买家的信息存入新表“高级买家”

/*插入多行数据*/

--创建新表
SELECT * INTO 高级买家 FROM 买家表 WHERE 1=2
GO --添加数据
INSERT INTO 高级买家
SELECT 买家表.*
FROM 买家表,买家级别表
WHERE 买家表.级别=买家级别表.级别编号 AND 级别名称='一级'
GO

由于查询过程使用了2个表了,所以SELECT 语句要声明,只要买家表的列

修改数据UPDATE

普通修改

因为与A品牌的合作有了新政策,所有A品牌商品进货价下调5%

/*普通修改数据*/
UPDATE 商品表 SET 销售价=销售价*0.95 WHERE 品牌='A牌'

带子查询的修改

为了增加耗材商品的销售份额,公司决定将所有耗材商品销售价格下调5%

/*子查询修改数据*/
UPDATE 商品表 SET 销售价=销售价*0.95
WHERE 商品表.类型=
(SELECT 类型编号 FROM 商品类型表 WHERE 类型名称='耗材')

删除数据DELETE

删除普通数据

删除销售表4所有B牌的商品购买信息

/*删除数据*/
SELECT * INTO 销售表4 FROM 销售表
GO
DELETE FROM 销售表4
WHERE 品牌='B牌'

删除子查询

删除销售表4中所有买家名称为“个人”的买家购买信息

/*删除数据*/
SELECT * INTO 销售表4 FROM 销售表
GO
DELETE FROM 销售表4
WHERE 买家编号=
(SELECT 买家编号 FROM 买家表 WHERE 买家名称='个人')

清空数据表

/*删除数据*/
SELECT * INTO 销售表4 FROM 销售表
GO
TRUNCATE TABLE 销售表4

注意:TRUNCATE TABLE 和不带条件的DELETE最终效果都是清空表中所有数据,但是在执行上TRUNCATE TABLE 更高,速度更快,因为他不记录事务日志,会释放数据,索引占据的空间,删除的数据不可恢复。

SQL Serever学习9——基础查询语句的更多相关文章

  1. PL/SQL第三章 基础查询语句

    --查询所有列 select * from tab_name|view_name; SELECT * FROM emp; SELECT * FROM (SELECT * FROM emp); --查询 ...

  2. (数据科学学习手册28)SQL server 2012中的查询语句汇总

    一.简介 数据库管理系统(DBMS)最重要的功能就是提供数据查询,即用户根据实际需求对数据进行筛选,并以特定形式进行显示.在Microsoft SQL Serve 2012 中,可以使用通用的SELE ...

  3. HQL基础查询语句

    HQL基础查询语句 1.使用hql语句检索出Student表中的所有列 //核心代码 @Test public void oneTest() { Query query=session.createQ ...

  4. 【SQL Server学习笔记】Delete 语句、Output 子句、Merge语句

    原文:[SQL Server学习笔记]Delete 语句.Output 子句.Merge语句 DELETE语句 --建表 select * into distribution from sys.obj ...

  5. 浅谈sql 、linq、lambda 查询语句的区别

    浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...

  6. Hibernate学习之hql查询语句

    *  页面上数据的字段和数据库中字段差不多,这个时候,采用迫切连接  结构比较好,如果页面上的字段很少,要按照需求加载数据,采用带构造函数的select查询 实例讲解:转自:http://www.cn ...

  7. SQL Serever学习12——数据库的备份和还原

    公司的服务器奔溃了,事先没相应的保护措施,使得公司遭到了较大损失,为了以后不再出现类似事件,在系统中引入备份机制,使得数据库被破坏后损失降到最低. 数据的导出和导入 数据转换服务 数据转换服务DTS( ...

  8. sql基础查询语句

    数据库文件百度云地址:www.pan.baidu.com 脚步:下载博客园文件:select_learn.rar 1.TOP限制返回行数[percent] * from book_info --显示前 ...

  9. SQL Serever学习10——T-SQL语句

    在sqlserver2018中使用的是Transact-SQL语言,简称T-SQL. 数据库的创建和管理 数据定义语言DDL DDL功能包括数据库,表,索引,视图,存储过程 数据库:CREATE DA ...

随机推荐

  1. 【题解】 BZOJ4548 小奇的糖果

    本文同步在学弟ZCDHJ的个人博客发布,审核需要一段时间. 传送门 考虑题目中获得的糖果并不包含所有的颜色这句话,发现相当于我们可以直接选取某一个颜色强制不能选(这样子一定最优). 然后就可以考虑分开 ...

  2. Ceph 的基础数据结构 [Pool, Image, Snapshot, Clone]

    原文链接:http://www.cnblogs.com/sammyliu/p/4843812.html?utm_source=tuicool&utm_medium=referral 1 Poo ...

  3. python单引号和双引号的区别

    今天在网上爬虫的时候,很奇怪的发现python的字符串既可以用双引号又可以用单引号,于是就上网百度了一下原因. 原来由于字符串中有可能既有双引号又有单引号,例如: 字符串:demo'1'. 这时候就可 ...

  4. 关于gcd和exgcd的一点心得,保证看不懂(滑稽)

    网上看了半天……还是没把欧几里得算法和扩展欧几里得算法给弄明白…… 然后想了想自己写一篇文章好了…… 参考文献:https://www.cnblogs.com/hadilo/p/5914302.htm ...

  5. jmeter进行https协议的测试

    一.HTTPS和HTTP的区别     超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息.HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和 ...

  6. 把redhat源换成centos的,解决redhat未注册不能下载相关软件的问题

      修改 vim /etc/yum.repos.d/centos-base.repo如下,清华源地址为  https://mirrors.tuna.tsinghua.edu.cn/help/cento ...

  7. Java 读写锁的实现

    一.    synchronized和ReentrantLock的对比 到现在,看到多线程中,锁定的方式有2种:synchronized和ReentrantLock.两种锁定方式各有优劣,下面简单对比 ...

  8. 不信任的 .exe 怎么办,用 Windows 沙盒啊!

    简评:维基百科,在计算机安全领域,沙盒(sandbox)是种安全机制,为执行中的程式提供的隔离环境.通常是作为一些来源不可信.具破坏力或无法判定程序意图的程序提供实验之用. 微软正在尝试解决人们对运行 ...

  9. day01 --class --home

    # 1.简述变量命名规范# 2.name = input(“>>>”) name变量是什么数据类型?# 3.if条件语句的基本结构? # 4.用print打印出下面内容:# ⽂能提笔 ...

  10. 资产管理 cmdb之ansible 获取服务器硬件、软件等信息

    cmdb抓取服务信息的方式有很多种,可以使用自动化工具saltstack.ansible.puppet,或者使用其它模块直接ssh远程连接抓取服务器信息.这里记录一下用ansible的API接口调用s ...