SQL是结构化查询语言(StructureQueryLanguage),1974年提出,1979年被IBM实现,SQL语言已经成为关系型数据库的标准语言。
包括:
SELECT*FROM表名WHERE条件GROUPBY字段HAVING表达式ORDERBY字段ASC|DESC
说明:GROUPBY子句后可以使用HAVING短语,用来分组后筛选,HAVING必须跟随ORDERBY子句使用。
默认情况,查询结构表的标题可以是表的字段名,也可以无标题,还可以使用AS对字段标题进行修改
使用查询生成新表,或者临时表
USE销售管理GOSELECT商品名称,型号,销售价-进价AS差价,库存INTO商品表附表FROM商品表GO结果
临时表在本次服务器连接过程中有效,一旦服务器断开连接,临时表失效,并被删除。
快速生成数据表结构(空白哦)
因为WHERE1=2不成立,所以就不会检索出符合条件的数据,生成的是一个没有数据的空白表
常用的聚合函数有6个:
有时候统计每种商品销售总金额,需要对销售表中销售金额进行汇总,然后再进行操作,这就是分组查询。
GROUPBY子句实现,
GROUPBY字段HAVING分组后的筛选条件表达式
注意:BY字段按指定字段进行分组,字段值相同的记录放在一组,每一组汇总只有一条数据。
HAVING的筛选是对经过分组后结果进行筛选,而不是对原始表筛选。
SELECT子句后的字段列表,必须是聚合函数,或者是GROUPBY子句中的字段。
demo.sql
USE销售管理GOSELECT品牌,COUNT(品牌)AS数量FROM商品表GROUPBY品牌--HAVING品牌='A牌'结果
注意这里的HAVING子句和WHERE的区别:
HAVING可以有聚集函数,而WHERE子句不可以
HAVING作用于分组后的结果集,WHERE子句作用于基本表
下面来一个小demo,用来查找某个属性的值出现最多的那个记录
原表
现在查找哪个品牌数量最多,并找出这个品牌的记录
demo
USE销售管理GO--申明变量用来存储数量最多的品牌DECLARE@ELEVARCHAR(20)SELECT@ELE=A.品牌FROM(SELECTTOP1品牌,COUNT(品牌)AS数量FROM商品表GROUPBY品牌ORDERBY数量DESC)A--print@eleSELECT*FROM商品表WHERE品牌=@ELE结果集
汇总合计函数ROLLUP(在sqlserver2008叫做COMPUTE)
使用这个函数,需要最分组函数的最后添加withrollup,然后会在最后多一行。
分组
使用ROLLUP汇总
就是多个表单的关联查询
内连接范例
使用sqlserver语法
使用ANSI语法
注意:<表名>A的意思是将某个表在这一次查询红命名为A,这样在整个查询中都可以使用A代替该表,简化操作。
/*查询一级买家信息*/SELECT*FROM买家表WHERE级别=(SELECT级别编号FROM买家级别表WHERE级别名称='一级')使用ALLANY运算符的子查询当子查询返回的是单列多值,使用ALLANY和比较运算符构成特殊查询
比如查询那些台式电脑比笔记本电脑的进价还要贵
/*查询那些台式电脑比笔记本电脑的进价还要贵*/SELECT*FROM商品表WHERE商品名称='台式机'AND进价>ANY(SELECT进价FROM商品表WHERE商品名称='笔记本')使用IN运算符的子查询比如查询进价大于5000的商品销售情况
/*查询进价大于5000的商品销售情况*/SELECT商品编号,买家编号FROM销售表WHERE商品编号IN(SELECT商品编号FROM商品表WHERE进价>5000)使用EXISTS运算符的子查询用来判断子查询是否有结果返回,NOTEXISTS的作用刚好相反
比如查询至少有一次实际销售价比进价还低的商品信息
/*查询至少有一次实际销售价比进价还低的商品信息*/SELECT*FROM商品表AWHEREEXISTS(SELECT*FROM销售表BWHEREA.商品编号=B.商品编号ANDB.实际销售价格 有个查询很难理解,记录如下 查询销售表每种商品(由商品编号区分)销售价格最贵的销售情况 分析:首先将商品种类分组 SELECT商品编号,MAX(实际销售价格)FROM销售表GROUPBY商品编号这里还不能输出要求的信息,所以还要使用自连接(自己与自己的一个副本连接) 经过筛选 使用INSERT语句插入数据进数据表,有2种方式:插入单行数据(使用VALUES),插入多行数据(使用SELECT) /*插入单行数据*/INSERTINTO买家表VALUES('M06','宋松','5362220','J02');插入多行数据新建一张表,名为“高价销售表类”,结构与销售表相同,将销售表的实际销售价格>3000的记录插入该表。 /*插入多行数据*/--建立一张空表SELECT*INTO高价销售表FROM销售表WHERE1=2GO--插入多行数据INSERTINTO高价销售表(商品编号,买家编号,实际销售价格,销售日期,销售数量)SELECT商品编号,买家编号,实际销售价格,销售日期,销售数量FROM销售表WHERE实际销售价格>3000GO为了建立一张空白表,查询条件WHERE1=2永远不成立,这个是一个常用的方法。 将所有一级买家的信息存入新表“高级买家” 因为与A品牌的合作有了新政策,所有A品牌商品进货价下调5% /*普通修改数据*/UPDATE商品表SET销售价=销售价*0.95WHERE品牌='A牌'带子查询的修改为了增加耗材商品的销售份额,公司决定将所有耗材商品销售价格下调5% /*子查询修改数据*/UPDATE商品表SET销售价=销售价*0.95WHERE商品表.类型=(SELECT类型编号FROM商品类型表WHERE类型名称='耗材')删除数据DELETE删除普通数据删除销售表4所有B牌的商品购买信息 /*删除数据*/SELECT*INTO销售表4FROM销售表GODELETEFROM销售表4WHERE品牌='B牌'删除子查询删除销售表4中所有买家名称为“个人”的买家购买信息 /*删除数据*/SELECT*INTO销售表4FROM销售表GODELETEFROM销售表4WHERE买家编号=(SELECT买家编号FROM买家表WHERE买家名称='个人')清空数据表/*删除数据*/SELECT*INTO销售表4FROM销售表GOTRUNCATETABLE销售表4注意:TRUNCATETABLE和不带条件的DELETE最终效果都是清空表中所有数据,但是在执行上TRUNCATETABLE更高,速度更快,因为他不记录事务日志,会释放数据,索引占据的空间,删除的数据不可恢复。