SQL数据库查询方法

SQL数据库查询方法

简单查询:

一、投影

select * from 表名
select 列1,列2... from 表名
select distinct 列名 from 表名

二、筛选

select top 数字 列|* from 表名
(一)等值与不等值
select * from 表名 where 列名=值
select * from 表名 where 列名!=值
select * from 表名 where 列名>值
select * from 表名 where 列名<值
select * from 表名 where 列名>=值
select * from 表名 where 列名<=值

(二)多条件与范围
select * from 表名 where 条件1 and|or 条件2 ...
select * from 表名 where between ... and ...
select * from 表名 where 列 in (值列表)

(三)模糊查询 like % _
select * from 表名 where 列 like ‘%_....‘

三、排序

select * from 表名 where 条件 order by 列名 ASC|DESC,列名 ASC|DESC

四、分组:

统计函数(聚合函数)
count(), max(), min(), sum(), avg()

count()统计总行数
count(*)得到所有的行数
count(列)得到该列中所有非null个数。
select COUNT(*) from car where Brand=‘b003‘

max(列) 这一列的最大,min(列)这一列的最小
select min(price) from car

sum(列)这一列的和,avg(列)这一列的平均
select AVG(price) from car

group by ...having...

1.group by后面跟的是列名。
2.一旦使用group by分组了,则select和from中间就不能用*,只能包含两类东西一类是:group by 后面的列名,另一类是统计函数
select Oil,avg(price) from Car group by oil
对于统计函数生成的列,默认是无列名,可以通过下面的方法指定列名。
select Oil as 油耗,COUNT(*) as 数量,avg(price) 均价 from Car group by oil

having后面一般跟得是统计函数。它用来对分组后的数据进一步筛选。

复杂查询:

一、连接查询

把多个表的列合在一个界面视图中。
思想:1.生成笛卡尔积。2.对笛卡尔积进行筛选。3.选择列进行显示。
select 表1.列1,表1.列2,表2.列1,表2.列2…… from 表1,表2 where 表1.列=表2.列

select * from 表1
    join 表2 on 表1.列=表2.列
    join 表3 on 表2.列=表3.列

左连(left join),右连(right join),全连(full join)

二、联合查询

把多个表的行合在一个界面视图中。
用union把两个查询组合在一起。要求是这两个查询的列要一一对应。

三、子查询(嵌套查询)

(一)无关子查询:
至少是两层查询,在外层查询的里面再写查询。
里层查询为外层查询提供查询的中间内容。

(二)相关子查询:

 

 

范例:

--1、 查询Student表中的所有记录的Sname、Ssex和Class列。
select sname,ssex,class from student
--2、 查询教师所有的单位即不重复的Depart列。
select distinct depart from teacher
--3、 查询Student表的所有记录。
--4、 查询Score表中成绩在60到80之间的所有记录。
select * from score where degree  between 60 and 80
--5、 查询Score表中成绩为85,86或88的记录。
select * from score where degree in(85,86,88)
--6、 查询Student表中“95031”班或性别为“女”的同学记录。
select * from student where class=‘95031‘ or ssex=‘女‘
--7、 以Class降序查询Student表的所有记录。
select * from student order by class desc
--8、 以Cno升序、Degree降序查询Score表的所有记录。
select * from score order by cno asc,degree desc
--9、 查询“95031”班的学生人数。
select COUNT(*) from student where class=‘95031‘
--10、查询Score表中的最高分的学生学号和课程号。
select * from score
select MAX(degree) from score   --92
select sno,cno from score where degree=(select MAX(degree) from score)
--11、查询‘3-105’号课程的平均分。
select AVG(degree) from score where cno=‘3-105‘
--12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
select cno,AVG(degree) from score where cno like ‘3%‘ group by cno having count(*)>=5

--13、查询最低分大于70,最高分小于90的Sno列。--假定按学生算。
select sno,MAX(degree),MIN(degree) from score group by sno having MAX(degree)<90 and MIN(degree)>70

--14、查询所有学生的Sname、Cno和Degree列。
select * from student
select * from score

select sname,cno,degree from student join score on student.sno = score.sno

--15、查询所有学生的Sno、Cname和Degree列。
select * from course
select * from score

select sno,cname,degree from course join score on course.cno = score.cno
--16、查询所有学生的Sname、Cname和Degree列。
select * from student
select * from course
select * from score

select sname,cname,degree from student
    join score on student.sno = score.sno
    join course on course.cno = score.cno

--17、查询“95033”班所选课程的平均分。
select * from student
select * from score
select sno from student where class=‘95033‘   --101,107,108
select * from score where sno in(101,107,108)
select AVG(degree) from score where sno in(select sno from student where class=‘95033‘ )

select AVG(score.degree) from student join score on student.sno = score.sno where student.class=‘95033‘

--18、假设使用如下命令建立了一个grade表:
create table grade(low  int,upp  int,rank  varchar(1))
insert into grade values(90,100,‘A‘)
insert into grade values(80,89,‘B‘)
insert into grade values(70,79,‘C‘)
insert into grade values(60,69,‘D‘)
insert into grade values(0,59,‘E‘)

--现查询所有同学的Sno、Cno和rank列。
select * from grade
select * from score
select sno,cno,rank from grade join score on score.degree>=grade.low and score.degree<=grade.upp
--19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
select * from score
select * from score where cno=‘3-105‘  and degree>(select degree from score where cno=‘3-105‘ and sno=‘109‘)

select degree from score where cno=‘3-105‘ and sno=‘109‘   --76

--21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
select *from score where degree >(select degree from score  where sno=‘109‘and cno=‘3-105‘)
--22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
select sno,sname,sbirthday from student where year (sbirthday)=(select year(sbirthday) from student where sno=‘108‘)
--23、查询“张旭“教师任课的学生成绩。
select *from score where cno=(select cno from course where tno=( select tno from teacher where tname=‘张旭‘))
--24、查询选修某课程的同学人数多于5人的教师姓名。
select tname from teacher where tno=( select tno from course where cno in( select cno from score  group by cno having count(*)>5))
--25、查询95033班和95031班全体学生的记录。
select * from score where sno in( select sno from student where class in(‘95033‘,‘95031‘))
--26、查询存在有85分以上成绩的课程Cno.
select distinct cno from score where degree >85
--27、查询出“计算机系“教师所教课程的成绩表。
select *from score where cno in( select cno from course where tno in(select tno from teacher where depart =‘计算机系‘)
--28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。
select tname,prof  from teacher
--29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
select cno from score group by cno having select degree from   where cno =‘3-105‘and degree >(select degree from score where cno=‘3-105‘ and sno=‘3-245‘)
时间: 2024-12-21 12:57:59

SQL数据库查询方法的相关文章

封装数据库查询方法

---恢复内容开始--- 对于数据繁琐的各式各样的查询语句,每次都要写上一大段查询代码,不仅造成代码冗余,而且还浪费时间.下面给出自己写的一个数据库查询方法封装: 1 public class AllSelect { 2 public static List<Object> Select(String sql,String className) throws Exception{ 3 //连接数据库 4 Connection conn = new MyConnection().getConne

调用DISCUZ 数据库查询方法进行数据库查询

<?php define('APPTYPEID', 5);//必须的,你懂的 define('CURSCRIPT', 'userapp');//必须的,你懂的 require_once './source/class/class_core.php';//必须的,你懂的 $discuz = & discuz_core::instance();//必须的,你懂的 $discuz->cachelist = $cachelist;//必须的,你懂的 $discuz->init();//必

C#窗体读取EXCEL并存入SQL数据库的方法

本文实例讲述了C#窗体读取EXCEL并存入SQL数据库的方法.分享给大家供大家参考.具体实现方法如下: windows窗体上放了一个Textbox1,2个按钮button1和button2~按button1选择excel文件~按button2进行相关处理 代码如下: private  void button1_click(object sendeer,EventArgs e) { OpenFileDialog  openFiledialog1=new OpenFileDialog(); open

优化SQL Server数据库查询方法

SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没有优

sql Server 查询方法的优化

在使用SQL语句查询数据库记录时,如果要查询相同的内容,有着不同的多种方法. 仍然,尽管使用多种方法可以得到相同的结果,但是,如果您使用不同的方法,在执行效益上是截然不同的.因此,我们得仔细考虑,如果要查询相同结果,该使用哪种语句,执行效益比较好. 这就是SQL语句的优化. 以下优化语句,针对My Sql数据库. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导

SQL数据库查询一列数据返回一行

SQL:数据库合并列数据:遇到一个更新的问题 想要把查询到的数据某一列拼接成字符串形式返回用的是SQL数据库中的STUFF函数比如 查询到的表(u_College)如下Id Name Age Classify1 张一 18 一班2 张二 17 二班3 张三 19 三班->SQL语句SELECT distinct Classify=STUFF((SELECT distinct ','+ Classify FROM u_College FOR XML PATH('')),1,1,'') FROM u

sql数据库查询结果字段包含换行符导致复制到Excel发生错位问题的解决

问题描述:在工作过程中,有时会遇到这样的问题,写好sql查询语句在数据库中查询数据,看到行数(比如说是1000行),但是把查询结果复制到Excel里面,却发生了行列错位问题,而导致Excel里面的行数是超过1000行的,造成数据行数的不一致. 问题重现:字段值包含char(10)换行符,复制字段值到Excel. 根源:某些行列对应单元格包含了换行符,导致复制到Excel里面发生错位. 解决方案:方案1(推荐):把有问题的字段值,用英文双引号括起来,这样就能把字段值里面的换行符限制在正确的Exce

sql跨数据库查询方法

http://www.cnblogs.com/xingluzhe/archive/2012/02/01/2334311.html SELECT u_name     FROM OPENROWSET('sqloledb','DRIVER={SQL Server};SERVER=119.48.48.152;UID=y_ydgl;PWD=55555////\',DB.dbo.y_users)  where u_name='1'   UNION   allSELECT u_name     FROM O

NumberFormatException: Invalid int类型不匹配异常——使用SQL数据库查询语句select * from blacknumber order by _id desc limit ?,20;出现

异常:类型不匹配 05-06 08:12:38.151: E/AndroidRuntime(14904): java.lang.NumberFormatException: Invalid int: "18600000099" 05-06 08:12:38.151: E/AndroidRuntime(14904): at com.itheima.mobilesafe74.activity.BlackNumberActivity$Myadapter.getView(BlackNumber