设为首页 加入收藏

TOP

数据库表修改删除及查询操作(三)
2014-11-24 01:24:22 来源: 作者: 【 】 浏览:21
Tags:数据库 修改 删除 查询 操作
COMPANYID INT,--公司id
TELNO VARCHAR(12)--用户电话。
)
--公司信息表
CREATE TABLE COMPANY
(
COMPANYID INT NOT NULL,--公司id
TELNO VARCHAR(12)—公司电话
)
现在我们要查询公司电话为88888888的用户有哪些。二种方案。
用独立子查询,查询语句如下:
SELECT * FROM USER WHERE COMPANYID IN
(SELECT COMPANYID FROM COMPANY WHERE COMPANYID=”88888888”);
用相关子查询,查询语句如下:
SELECT * FROM USER AS U WHERE EXITES
(SELECT * FROM COMPANY AS C WHERE C.TELNO=”88888888” AND U.COMPANYID=C.COMPANYID);
但是此例,不管是从可读性还是从性能方面,相关子查询都不如独立子查询。那么,相关子查询主要用在哪里呢?有这样一个情景,假如说要把用户的电话全部更新成公司的电话,该怎么办呢?此时相关子查询是显得很重要的,语句如下:
UPDATA USER AS U SET TELNO=
(
SELECT TELNO FROM COMPANY AS C WHERE U.COMPANYID=C.COMPANYID
)
注意事项:
必须起别名
select * from [xx] where sid in
(
select sid from [yy] where sname='一班' or sname = '二班'
)
select * from (select * from [xx]) as T1
九、聚合函数
SQL聚合函数:
MAX(最大值)、MIN(最小值)、AVG (平均值)、SUM (和)、COUNT(数量:记录的条数。)
count()时,最好写count(*),不要写count(name),因为name为空时就不计算这一行了.
聚合函数对null值不计算。 isnull(表达式,0)
如果一行的数据都是null,count(*)包含对空值行、重复行的统计。count(name)不包含name为null的行的统计
--查询出班级中年龄最大的学生的年龄是多少
--说白了就是求fage这一列的最大值
select max(fage) as 最大年龄 from newStudent
--最小
select min(fage) as 最大年龄 from newStudent
--求班级中女生的最大年龄
select max(fage) as 最大年龄 from newStudent
where FGender='男'
最小
select min(fage) as 最大年龄 from newStudent
where FGender='女'
平均
--在聚合函数中,为null的记录不参与计算
--求所有人数据的平均成绩
select SUM(fmath) from newStudent
select avg(fmath) from newStudent
select SUM(fmath)/COUNT(*) from newStudent
(总数)行数
select COUNT(*) from newStudent
--查询表中有几个男生
select COUNT(*) from newStudent where FGender='男'
--查询一下英语成绩在分以上的有多少人
select COUNT(*) from newStudent where FEnglish>=60 and FGender='男'
十、Over()子句
在应用具体的聚合函数、排名函数前对行集的分区和排序。over子句,用于支持窗口的计算,所以一般与排名开窗函数、聚合开窗函数一起使用。
窗口是用户指定的一组行。开窗函数计算从窗口派生的结果集中各行的值。
以前使用聚合函数必须分组,即便没有group by 子句,也是默认将表中所有的数据分成了1组,来聚合。通过使用over子句可以在不分组的情况下实现聚合运算,在查询结果集中既包含基础行的数据也包含聚合函数的值。(可以把over()子句理解成是“后台运行的数据”,只是为了让聚合函数或者是排名函数“用一下”,并不影响实际显示的数据。在后台提供数据。)
over子句的两种使用方式:
1.over子句与排名开窗函数一起用,语法:over([partition by 列1] order by 列2)。必须有order by 子句
2.over子句与聚合开窗函数一起用,语法:over([partition by 列1])不能使用order by子句了。【先演示这个】
注:当over()子句与聚合函数一起使用时,也可以直接写count(*) over()不在over()子句中进行任何分区,表示把整个表分为一个区。
十一、连接查询
一、 概念:
交叉连接(cross join):没有where子句的交叉连接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
内连接(inner join)
外连接:3.1 左连接(left join 或left outer join)3.2右连接(right join 或 right outer join)3.3全连接(full join 或 full outer join)
连接条件可在from或where子句中指定,建议是在from子句中指定连接条件。Where和having子句也可以包含搜索条件。
代码:
Cross join: select * from table1 cross join table2
inner join: select * from table1 inner join table2 on table1.id=table2.id;
1.1 left join: select * from table1 left join table2 on table1.id=table2.id;
1.2 right join: select * from table1 right join table2 on table1.id=table2.id;
1.3 full join: select * from table1 full join table2 on table1.id=table2.i
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇一些比较难的sql问题:6 下一篇一些比较难的sql问题:8

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: