发布网友 发布时间:2022-04-10 08:12
共2个回答
懂视网 时间:2022-04-10 12:34
2017/11.10
SQL的主要功能:
1.数据定义
2.数据查询
3.数据操作
4.数据控制功能(了解)
SQL语言的动词:
数据定义:create,drop, alter
数据查询:select
数据操作:insert,update,deledte
数据控制:crant,revoke
数据查询语句的基本格式:
select[distinct] 目标列 //distinct去掉记录中的重复值
from 基本表(或视图)
[where 条件表达式]
[group by 列名1 [having内部函数表达式] ]
[order by 列名2 [asc(升序)/desc(降序)] ]
中括号中的表示可选项,可有可无
select语句的含义是,根据where子句条件表达式,从from子句中的基本表达式或视图中检索出满足条件的元祖,
按select子句的目标列,选出元组中的相应列形成新的表.新表记录中可以按order by 子句中指定的列名2进行
升序或降序排序,还可以按group不用子句指定的列名1的值对元组进行分组
1.select语句:
ues 数据库名
go
select * from 表名 --查询所有内容
select sno,sname from 表名 --查询指定内容
select sno,sname,2007-sage as出生年月 from student --as出生年月,表示重命名新列名
--不写as也行,用空格表示
select top 3 * from student --查询前3条语句
select top 6 name from student --查询前6条的单个信息(姓名等)
查询结果放入新表中:
select sname,ssex into newstudent from student --newtable会自动创建
where子句:
1.查询所有性别为男生的学生:
select * from student where ssex=‘男‘
2.检索年龄在19岁以上的学号,姓名和性别:
select sno,sname,ssex from student where ssage>19
3.查询年龄在18-20岁之间的学号和姓名:
select sno,sname from student where age not between 18 and 20
select sno,sanem from student where age<18 or age>20
in查询:
查询专业为计算机,通信的所有学生的学生:
select * from student where sdept in (‘计算‘,‘通信‘)
or查询:
and查询:
select * from student where sdept=‘计算机‘ and ssex=‘男‘
字符匹配查询:
通配符:
_ (下划线)表示任何一个字符
% 表示任何多个字符(包括0个)
查询课程名第二个字符为据的课程:
select * from course where cname like ‘_据%‘
access的通配符为:
?代表单一字符 相当于 _
*代表0或多个字符 相当于%
#代表单一数字(0-9)
select * from course where cname like ‘?据*‘
空值查询:
查询没有填写年龄的学生姓名
select sname from student where sage is null
SQL课堂笔记--查询表1
标签:数据 dep alter drop 空格 重命名 表示 括号 记录
热心网友 时间:2022-04-10 09:42
Select id,Count(0) as结果 From table1 Group By id只是个简单的Group By语句而已
关于Group By
1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)
注意:select 后的字段,必须要么包含在group by中,要么包含在having 后的聚合函数里。
例如,有如下数据库表:
A B
1 abc
1 bcd
1 asdfg
如果有如下查询语句(该语句是错误的,原因见前面的原则)
select A,B from table group by A
该查询语句的意图是想得到如下结果(当然只是一相情愿)
A B
abc
1 bcd
asdfg
右边3条如何变成一条,所以需要用到聚合函数,如下(下面是正确的写法):
select A,count(B) as 数量 from table group by A
这样的结果就是
A 数量
1 3
2. Having
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
having 子句被*子已经在SELECT语句中定义的列和聚合表达式上。通常,你需要通过在HAVING子句中重复聚合函数表达式来引用聚合值,就如你在SELECT语句中做的那样。例如:
SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2
3.使用compute和compute by
使用compute子句允许同时观察查询所得到各列的数据的细节以及统计各列数据所产生的汇总列
select * from work [查询所得到的各列的数据的细节]
compute max(基本工资),min(基本工资) [统计之后的结果]
这个例子中没有使用by关键字,返回的结果是最后添加了一行基本工资的最大值和最小值,也可增加by关键字.
例:select * from work order by 学历
compute max(基本工资),min(基本工资) by 学历
比较:select 学历,max(基本工资),min(基本工资) from work group by 学历
说明:1:compute子句必须与order by子句用在一起
2:compute子句可以返回多种结果集.一种是体现数据细节的数据集,可以按分类要求进行正确的分类;另一种在分类的基础上进行汇总产生结果.
3:而group by子句对每一类数据分类之后只能产生一个结果,不能知道细节
示例学习Northwind数据库:
非相关查询:
1:返回每个美国员工都为其处理过订单的所有客户
--思路:1:Employees表中获取美国员工总数2:Orders表中查询美国员工处理的Order,对CustomerID分组后,统计其不同的EmployeeID正好等于美国员工总数
Select CustomerID From Orders Where EmployeeID In --得到美国员工服务 的客户
(Select EmployeeID From Employees Where Country=N'USA') -- 得到全部美国员工id
group by CustomerID --按客户分组
Having Count(Distinct EmployeeID)= --为其处理订单的distinct 员工数等于美国总员工数
(Select Count(*) From Employees Where Country=N'USA')--美国员工总数
2:
返回在每月最后实际订单日期发生的订单(每月最后订单日期可能不是每月最后一天)
--思路:子查询按月分组得到每月最近订单日期
Select OrderID,CustomerID,EmployeeID,OrderDate
From Orders
Where OrderDate In
(Select Max(OrderDate) From Orders Group by Convert(char(6),OrderDate,112))--112表示YYYYMMDD char(6)提取YYYYMM
3.
Select字句在逻辑上是SQL语句最后进行处理的最后一步,所以,以下查询会发生错误:
SELECT OrderYear, COUNT(DISTINCT CustomerID) AS NumCusts
FROM (SELECT YEAR(OrderDate) AS OrderYear, CustomerID
FROM dbo.Orders) AS D
GROUP BY OrderYear
;因为group by是在Select之前进行的,那个时候orderYear这个列并没有形成。
如果要查询成功,可以像下面进行修改:
SELECT OrderYear, COUNT(DISTINCT CustomerID) AS NumCusts
FROM (SELECT YEAR(OrderDate) AS OrderYear, CustomerID
FROM dbo.Orders) AS D
GROUP BY OrderYear;还有一种很特殊的写法:
SELECT OrderYear, COUNT(DISTINCT CustomerID) AS NumCusts
FROM (SELECT YEAR(OrderDate), CustomerID
FROM dbo.Orders) AS D(OrderYear, CustomerID)
GROUP BY OrderYear;在作者眼里,他是非常喜欢这种写法的,因为更清晰,更明确,更便于维护。
在查询中使用参数定向产生一批结果,这个技巧没有什么好说的。
嵌套查询,在处理逻辑上是从里向外进行执行的。