SQL基本查询
SQL是一种结构化查询语言。用于用于存取数据以及查询、更新和管理关系数据库系统。
一、SQL简单的查询语句
1.查看表结构
SQL>desc stu;
2.查询所有列
SQL>select * from stu;
3.查询指定列:
SQL>select stuno,stuname,job from stu;
SQL>select distinc stuname from stu; // 只显示结果不同的项
4.查询指定行
SQL>select * from stu where job=“clerk”
5.使用算术表达式
SQL>select stuname,sal*13+nvl(comm,0) from stu;
其中,6.nvl(comm,1)的意思是,如果comm中有值,则nvl(comm,1)=comm; comm中无值,则nvl(comm,1)=0。
SQL>select * from stu where hiredate>'01-1月-82';
6.使用like操作符(%,_)
%表示一个或多个字符,_表示一个字符,[charlist]表示字符列中任何单一字符的,[^charlist]或者[!charlist]不在字符列中的任何单一字符。
7.在where条件使用IN
SQL>select * from stu where job in ('CLERK','ANALYST');
8.查询字段内容为空/非空的语句。
SQL>select * from stu where job is/is not null;
9.使用逻辑操作符号
SQL>select * from stu where (sal>500 or job=”manage”) and stuname like ‘J%’
10.order by:将查询结果按字段的值进行排序
SQL>select * from stu order by stuno,sal desc;(按部门升序,并按薪资降序)
11.Between:在两个值之间,比如我从学生中查询年龄在18-20之间的学生信息
select stuno,stuname,age from stu where age between 18 and 20;
12.LIKE:作用是模糊查询,LIKE关键字与通配符一起使用
主要的通配符有:
13. 查询姓氏为张、李的学生信息。这个可以使用or关键字,但是使用通配符更简单高效
SQL>select stuno,stuname from stu where name like ‘[张李]%’
14.查询姓氏非张、李的学生信息。这个也可以用not like 来实现
SQL>select stuno,stuname from stu where name like ‘[^张李]%’
15.AND :AND在where句子中把两个或多个条件结合起来。表示和的意思,多个条件都成立。
Eg:查询年龄大于18且姓张的学生信息
SQL>select select stuno ,stuname from stu where age>18 And name like '张%'
16.OR:可在WHERE 子语句中把两个或多个条件结合起来。或关系,表示多个条件,只有一个符合即可。
Eg:查询年龄是18,19,20的学生信息
SQL>select stuno ,stuname from stu where age in (18,19,20);
17.as(Alias):可以为列名称和表名称指定别名
作用:我们可以查询的列,或者表指定需要的名字,如表名太长,用其简称,在连表查询中经常用到。
(1).将结果列改为需要的名称。
Select id as stuno ,stuname as name from stu;
(2).用表的别名,标识列的来源:
select s.stuno s.stuname as magorName from stu as s left join majors as m on s.majorId = m.id;
(3).在合计函数中,给合计结果命名:
select count(stuno)as stuCount from stu;
18.distinct:不同的 作用:查询时忽略重复值
select distinct city from stu;
19.max/min
(1).查询学生中最高的分数
select max(score) from stu;
(2).查询学生中最小年龄
select min(age) from stu;
20.sum:
(1).查询stuno为1001的学生的各科总成绩
SC即为学生的成绩表,字段:StudentID,CourseID,Score
select sum(score) as totalScore from sc where stuno = ‘1001’
21.AVG:AVG函数返回数值列的平均值:
(1).查询学生的平均年龄:
select avg(age) as ageAverage from stu;
(2).求课程ID为C001的平均成绩
select avg(sciore) from sc where CourseID =’C001’;
22.Count() 函数返回匹配指定条件的行数
(1).查询学生总数
select count(no) from stu;
(2).查询学生年龄分布的总数:
select count(distinct age) from stu;
(3).查询男女生分布各有多少人
select sex,count(stuno) from stu group by sex;
23.group by:语句用于结合合计函数,根据一个或多个列对结果集进行分组
(1).查询学生的城市分布情况
select city count(stuno) from stu group by city;
(2).删除学习信息中重复记录:
根据列进行分组,如果全部列相同才定义为重复,则就需要group by所有字段。否则可按指定字段进行处理。
Delete from stu where stuno not in(select max(stuno) from stu group by stuno,stuname,age ,sex ,majorID)
24.having:在SQL语句中增加having 子句的原因是:where 关键字无法与合计函数一起使用。
(1).查询平均成绩大于等于60的学生stuno及平均成绩
select stuno avg(score) from sc group by stuno having avg(score)>=60;
(2).还是用HAVING的SQL语句中,可以有普通的WHERE条件:
查询平均成绩大于等于60,且学生ID等于1的学生的ID及平均成绩。
SELECT StudentID,AVG(Score) FROM SC
WHERE StudentID='1'
GROUP BY StudentID
HAVING AVG(Score)>=60
(3).查询总成绩在600分以上(包括600)的学生ID
select stuno from sc group by stuno having sum(score)>=600;
25.TOP:TOP 子句用于规定要返回的记录的数目。对于大数据很有用的,在分页时也会常常用到。
(1).查询年龄最大的三名学生信息
select top 3 stuno ,stuname from stu order by age desc;
(2).还是上一道题,如果有相同年龄的如何处理呢?
select stuno ,stuname ,age from stu where age in(select top 3 age from stu );
26.Case语句:
计算条件列表,并返回多个可能的结果表达式之一。
CASE 表达式有两种格式:
*CASE 简单表达式,它通过将表达式与一组简单的表达式进行比较来确定结果。
*CASE 搜索表达式,它通过计算一组布尔表达式来确定结果。
1)查询学习信息,如果Sex为0则显示为男,如果为1显示为女,其他显示为其他。
select stuno,stuname,CASE sex when ‘0’ THEN ‘男’ WHEN ‘1’ THEN ‘女’ ELSE ‘其他’END AS Sex from stu;
2)查询学生信息,根据年龄统计是否成年,大于等于18为成年,小于18为未成年
select stuno,stuname,CASE WHEN Age>=18 THEN ‘成年’ ELSE ‘未成年’ END AS ‘是否成年’from stu;
3)统计成年未成年学生的个数
select sum(CASE WHEN Age >=18 THEN 1 ELSE 0 END) ANS ‘成年’,SUM(CASE WHEN Age <18 THEN 1 ELSE AS ‘未成年’ from stu);