MySQL查询

一、查询语句关键字

distinct:去重,去掉表中重复的字段                                                                                                   例:select distinct name from student;

order by … asc:按从小到大排序分组
order by … desc:按从大到小分组
order by:分组排序,默认按照升序对记录进行排序
asc,desc:排序

group by:用于结合合计函数,根据一个或多个列对结果集进行分组
Having:where关键字无法与合计函数一起使用,所以having常常合group by一起使用

union操作符用于合并两个或多个select语句的结果集

count():返回数值匹配指定条件的函数
min():返回一列中最小的值,null值不包含在计算中
max():返回一列中最大的值,null值不包含在计算中
avg():avg函数返回数值列的平均值。Null值不包含在计算中
sum():返回数值列的总数

between and :寻找在…之间的值
not between and:寻找不在…之间的值

(not) Like   模糊查询,                                                                                                            like’%11’:查询含有11的值
not like’%11’:查询不含11的值

in(val1,val2):在where语句中查询列中包含的值
not in(val1,val2):在where语句中查询列中不包含的值

is null:查询列值为空的行
is(not) null:查询某列值不为空的行

all():满足子查询中所有值的记录
any()/some():满足集合中任意一值
in():字段内容是否是结果集合或者子查询中的内容
exists():当子查询结果不为空集(存在)时,返回逻辑真,否则返回逻辑假

=、<、>、<=、>=、

查询当前的年月日:select year(curdate()),month(curdate()),day(curdate())

1.join...on...实现连接查询
     select s.sno,sname,cname,grade from s join sc on sc.sno=s.sno join c on sc.cno=c.cno;
2.嵌套查询 in/not in
    select sno,cno,grade from sc where cno in(select cno from c where cname='数据库' or cname='电子技术');
3.嵌套查询all
   select sno,grade from sc where cno='D001' and grade>all(select grade from sc where cno='D002');
4.嵌套查询 any/some
   select sno,grade from sc where cno='D001' and grade>any(select grade from sc where cno='D002');
5.嵌套查询 exists
  select sno,sname from s where exists(select * from sc where sc.sno=s,sno);
6.between...and...
   select sno,degree from sc where degree between 60 and 70;
7.查询前10条记录
   select * from student limit 10;
8.查询11条后的5条记录
   select * from student limit 10,5;
9.模糊查询 %
   select * from student where saddree not like '%山东省%';
10.模糊查询 _
   select sname,sno, from student where sname like '_阳%';(查询第二个字为阳的学生)
11.去重
   select distinct departmentID from employee;
 

二、简单的查询

1、查询每个学生的学号、姓名、出生日期信息

        select Sno,Sname,Sbirth from s;

2、根据学号查询你的姓名和出生日期

        select Sname,Sbirth from s where Sno='22207';

3、将学生按出生日期由大到小排序

        select Sno,Sname from s order by Sbirth desc;

4、查询所有姓’的学生的学号和姓名

        select Sno,Sname from s where Sname like '张%';

5、查找分数在‘85~96’范围内的学生的学号和分数

        select Sno,Grade from sc where Grade between 65 and 96;

6、查询课程号为’002’的学生的平均分和总成绩

        select avg(Grade),sum(Grade) from sc where Cno='002';

7、查询学习各门课程的人数

        select Cno,count(*) from sc group by Cno;

8、查询课程号为’002’的成绩排前3的学生的学号和成绩。(先排序,再limit实现)

        select Sno,Grade from sc group by Cno having  Cno='002' limit 0,3;

9、使用GROUP BY查询子句,列出平均分大于等于90的学生的学号

        select Sno from sc group by Sno having avg(Grade)>=90;

二、连接、嵌套查询

1、连接查询

(1)查询分数在80~90范围内的学生的学号、姓名、课程号和分数。[WHERE连接查询]

        select s.Sno,Sname,Cno,Grade from s,sc where s.Sno = sc.Sno;

(2)查询学习数据库系统课程的学生的学号、姓名、分数。 [ JOIN  ON连接查询]

        select s.Sno,Sname,Grade,Cname from s join sc on s.Sno=sc.Sno join c on c.Cno=sc.Cno where Cname='数据库系统';

(3)查询所有计算机系学生的选课情况,要求列出学号、姓名、课程名称、分数

        select s.Sno,Sname,Cname,Grade from sc join s on sc.Sno=s.Sno join c on sc.Cno=c.Cno where Sdept='计算机';

(4)查询所有学生的总成绩,要求列出学号、总成绩,没有选修课程的学生的总成绩为空。[使用左外连接]

        select s.Sno,sum(Grade) as 总成绩 from s left join sc on sc.Sno=s.Sno group by s.Sno;

(5)查询所有课程的选修情况,要求列出课程编号、选修人数,课程表中没有的课程列值为空。[使用右外连接。]

        select c.Cno,count(sc.cno) as 选修人数 from c right join sc on c.Cno=sc.Cno group by c.Cno;

2、嵌套查询

(1)使用IN子查询,查询选修 001 课程的学生的姓名和所在系

        select Sname,Sdept from s,sc where s.Sno=sc.Sno and Cno in ('001');

(2)查询软件工程系成绩75分以上的学生的学号和姓名

        select s.Sno,Sname from s,sc where s.Sno=sc.Sno and Sdept='软件系' and Grade>75;

(3)查询001 课程的考试成绩高于该课程平均成绩的学生的学号和成绩

        select Sno,Grade from sc where Grade>(select avg(Grade) from sc) and Cno='001';

(4)找出学号为202201的学生的分数比学号为202203的学生的最高成绩还要高的课程编号和分数

        select Cno,Grade from sc where Sno='202201' and Grade>all(select Grade from sc where Sno='202203');

(5)在学生表中查找与王毅同一系的所有学生的学号、姓名、出生日期、系别

        select Sno,Sname from s where Sdept = (select Sdept from s where Sname='王毅');

(6)使用SQL语句嵌套查询方式查询“21Web应用软件开发3班”和“21Web应用软件开发4班”的学生信息(用IN子句)

        select * from student where class_no in (select class_no from classes where class_name='21Web应用软件开发3班' and class_name='21Web应用软件开发4班')

问题:在连接查询中,述说内连接,外连接,交叉连接特点。

1、内连接:只有两个元素表相进行匹配的才能在结果集中显示。使用INNER JOIN关键词进行连接。

语法:SELECT  * FROM  type type  INNER JOIN brand brand ON type.id = brand.id

2、 左外连接: 左边为主表,主表的数据全部显示,匹配表的不匹配的不会显示。使用LEFT JOIN关键词进行连接

语法:SELECT *  FROM  type type LEFT JOIN brand brand ON type.id = brand.id

3、右外连接:右边为主表,主表的数据全部显示,匹配表的不匹配的不会显示。 使用 RIGHT JOIN关键词进行连接

语法:SELECT  *  FROM brand brand   RIGHT JOIN type type ON type.id = brand.id

4、全外连接:连接的表中不匹配的数据全部会显示出来。 mysql中似乎不支持FULL JOIN,故mysql使用UNION关键词进行连接

语法:SELECT  *  FROM  type type  FULL JOIN brand brand ON type.id = brand.id

语法:SELECT  *  FROM type type  LEFT JOIN brand brand ON type.id = brand.id

          UNION

          SELECT  *  FROM type type  RIGHT JOIN brand brand ON type.id = brand.id 

5、交叉连接: 显示的结果是链接表数的乘积数。使用CROSS JOIN关键词进行连接

语法:SELECT * FROM type CROSS JOIN brand
 

你可能感兴趣的:(mysql,mysql,数据库,sql)