SQL语句-各种查询
查询数量
select count(*) from gq_user where account =222 and password =222;
1.基本查询,这里以student表为例
SELECT * FROM student;
解释:
SELECT是关键字,表示将要执行一个查询,*表示“所有列”,FROM表示将要从哪个表查询
注意:查询结果也是一个二维表,它包含列名和每一行的数据
SELECT语句其实并不要求一定要有FROM子句。我们来试试下面的SELECT语句:
SELECT 100+200;
2.条件查询
查询班级号为 20201001 的学生
SELECT * FROM student where class_num = '20201001';
WHERE关键字后面的class_num= '20201001'就是条件。class_num是列名,该列存储了学生的班级,因此,class_num= '20201001'就筛选出了指定条件的记录:
查询班级号为 20201001 的学生姓名
SELECT name FROM student where class_num = '20201001';
查询班级号为 20201001 的学生姓名和性别
SELECT name,sex FROM student where class_num = '20201001';
当我们需要查询多列的时候我们需要使用 ',' 来进行分割
查询班级号为 20201001 或者性别为男的学生姓名
SELECT name FROM student where class_num = '20201001' or sex = '男';
查询班级号为 20201001 并且性别为男的学生姓名
SELECT name,sex FROM student where class_num = '20201001' and sex = '男';
当我们需要以多列作为查询条件的时候我们需要使用 'or' 或者 ‘and’来进行区分
查询班级不在 20201001 班的同学的姓名
SELECT name FROM student where not class_num = '20201001' ;
NOT <条件>,表示“不符合该条件”的记录
查询性别为女的同学姓名并且不在20201001班
SELECT name FROM student where sex ='女' and not class_num = '20201001';
where in的用法
IN 操作符允许我们在 WHERE 子句中规定多个值。
查询出用户id为1和3的用户记录
select * from student where id in (1,3)
<foreach>元素
3去重查询
SELECT DISTINCT sex from student
4.模糊查询
模糊查询 like 通配符(% 任意多个字符 _单个字符)
查询出所有姓王的同学
SELECT * FROM student WHERE name like '王%';
查询姓王且名字只有两个字的学生
SELECT * FROM student WHERE name like '王_';
查询出所有含有花子的同学的名称
SELECT * FROM student WHERE name like '%花%';
5.排序
我们使用SELECT查询时,细心的读者可能注意到,查询结果集通常是按照id排序的,也就是根据主键排序。这也是大部分数据库的做法。如果我们要根据其他条件排序怎么办?可以加上ORDER BY子句。例如按照年龄从低到高进行排序:
SELECT * FROM student ORDER BY age;
如果要反过来,按照年龄从高到底排序,我们可以加上DESC表示“倒序”:
SELECT * FROM student ORDER BY age DESC;
如果想按照年龄降序,并且按照学号升序怎么弄?
SELECT * FROM student ORDER BY age DESC,sno;
默认的排序规则是ASC:“升序”,即从小到大。ASC可以省略,即ORDER BY score ASC和ORDER BY score效果一样。
6.分页查询(限制查询)
使用SELECT查询时,如果结果集数据量很大,比如几万行数据,放在一个页面显示的话数据量太大,不如分页显示,每次显示100条。
要实现分页功能,实际上就是从结果集中显示第1~100条记录作为第1页,显示第101~200条记录作为第2页,以此类推。
因此,分页实际上就是从结果集中“截取”出第M~N条记录。这个查询可以通过LIMIT <M> OFFSET <N>子句实现。我们先把所有学生按照成绩从高到低进行排序:
现在,我们把结果集分页,每页3条记录。要获取第1页的记录,可以使用LIMIT 3 OFFSET 0:
SELECT * FROM student LIMIT 3 OFFSET 0;
上述查询LIMIT 3 OFFSET 0表示,对结果集从0号记录开始,最多取3条。注意SQL记录集的索引从0开始。
如果要查询第2页,那么我们只需要“跳过”头3条记录,也就是对结果集从3号记录开始查询,把OFFSET设定为3:
SELECT * FROM student LIMIT 3 OFFSET 3;
可见,分页查询的关键在于,首先要确定每页需要显示的结果数量pageSize(这里是3),然后根据当前页的索引pageIndex(从1开始),确定LIMIT和OFFSET应该设定的值:
- LIMIT总是设定为pageSize;
- OFFSET计算公式为pageSize * (pageIndex - 1)。
小结
使用LIMIT <M> OFFSET <N>可以对结果集进行分页,每次查询返回结果集的一部分;
分页查询需要先确定每页的数量和当前页数,然后确定LIMIT和OFFSET的值。
7.聚合查询
如果我们要统计一张表的数据量,例如,想查询students表一共有多少条记录,难道必须用SELECT * FROM students查出来然后再数一数有多少行吗?
这个方法当然可以,但是比较弱智。对于统计总数、平均数这类计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果。
仍然以查询students表一共有多少条记录为例,我们可以使用SQL内置的COUNT()函数查询:
SELECT COUNT(*) FROM student;
COUNT(*)表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT(*)。
通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果:
SELECT COUNT(*) num FROM student;
例如查询男生的平均年龄
SELECT avg(age) num FROM student;
分组
分组查询的原理:先对数据进行分组,在对分组后的数据进行汇总,分组查询通常用于配合聚合函数,达到分类汇总统计信息的目的。而分类汇总的本质实际上就是先将数组进行分组,分组后相同类别的信息会聚在一起,然后通过需求进行计算。
比如我们要查询 各个班的男生的平均身高
SELECT avg(age) num FROM student GROUP BY class_num;
查询出各个班的人数
SELECT count(*) FROM student GROUP BY class_num;
8.多表查询
SELECT查询不但可以从一张表查询数据,还可以从多张表同时查询数据。查询多张表的语法是:SELECT * FROM <表1> <表2>。
例如我们可以同时查询student,和sc两张表
SELECT * FROM student,scoure;
那如果我们想要某一个表当中的特定的列呢?比如student表当中的name和age,以及source表当中的cno列
SELECT s.NAME, s.age, c.cno FROM student s, scoure c;
9.连接查询
连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。
假如我们想要查询出每一和学生所在的班级名称,该如何去写呢?
这时,连接查询就派上了用场。我们先使用最常用的一种内连接——INNER JOIN来实现:
SELECT student.name,class.class_name from student INNER JOIN class on student.class_num = class.class_num;
注意INNER JOIN查询的写法是:
- 先确定主表,仍然使用FROM <表1>的语法;
- 再确定需要连接的表,使用INNER JOIN <表2>的语法;
- 然后确定连接条件,使用ON <条件...>,这里的条件是student.class_num = class.class_num,表示student表的class_num 列与class表的class_num列相同的行需要连接;
- 可选:加上WHERE子句、ORDER BY等子句。
使用别名不是必须的,但可以更好地简化查询语句。
除了内连接以外还有外连接,那么内连接和外连接有什么区别呢?
左连接
SELECT student.name,class.class_name from student LEFT JOIN class on student.class_num = class.class_num;
右连接
SELECT student.name,class.class_name from student RIGHT JOIN class on student.class_num = class.class_num;
10.嵌套查询
一般在子查询中,程序先运行在嵌套在最内层的语句,再运行外层。因此在写子查询语句时,可以先测试下内层的子查询语句是否输出了想要的内容,再一层层往外测试,增加子查询正确率。否则多层的嵌套使语句可读性很低。
找到所有选选择课程号为1001的同学的名称
select t1.name FROM (SELECT student.name,relationship.cno FROM student INNER JOIN relationship on student.sno = relationship.sno) t1 WHERE t1.cno = '1001';
在这里我们一定要理解,我们嵌套查询最侧产生的是一个新的表
找到所有选选择课程号为 数学 的同学的名称
SELECT t2.name FROM (select t1.name,scoure.gradeName from (SELECT student.name,relationship.cno FROM student INNER JOIN relationship on student.sno = relationship.sno) t1 INNER JOIN scoure on t1.cno = scoure.cno) t2 where gradeName = '数学';
作业
1. 查询出所有班级的同学的名字
提示,不是所有的同学都有班级
SELECT student.name,class.class_name from student INNER JOIN class on student.class_num = class.class_num;
2.查询出年龄最高的同学的信息
提示:可以使用limit
select * FROM student ORDER BY age DESC LIMIT 1 OFFSET 0;
3.查询出在学生当中那个年龄段的学生最多,并统计其出现的次数
select age,count(age) num FROM student GROUP BY age LIMIT 1 OFFSET 0;
4.查询出年龄超过21岁,并且选择 语文 的同学名字
SELECT t3.name FROM (select t2.sno,student.name,student.age FROM student right JOIN (select t1.sno FROM (select relationship.sno,relationship.cno,scoure.gradeName FROM relationship INNER JOIN scoure on relationship.cno = scoure.cno) t1 WHERE t1.gradeName = '语文') t2 on student.sno = t2.sno) t3 where age > 21;
5.查询出软件工程班年龄最大,所选择的课程名称及该同学的姓名。
SELECT t3.NAME, scoure.gradeName FROM ( SELECT t2.NAME, relationship.cno FROM ( SELECT t1.sno, t1.NAME, t1.age FROM ( SELECT student.sno, student.NAME, student.age, class.class_name FROM student INNER JOIN class ON student.class_num = class.class_num ) t1 WHERE t1.class_name = '软件工程' ORDER BY age DESC LIMIT 1 OFFSET 0 ) t2 INNER JOIN relationship ON t2.sno = relationship.sno ) t3 INNER JOIN scoure ON t3.cno = scoure.cno;
SQL语句-各种查询相关推荐
- 如何在 Linux 上用 SQL 语句来查询 Apache 日志
Linux 有一个显著的特点,在正常情况下,你可以通过日志分析系统日志来了解你的系统中发生了什么,或正在发生什么.的确,系统日志是系统管理员在解决系统和应用问题时最需要的第一手资源.我们将在这篇文章中 ...
- PHP获取MySQL执行sql语句的查询时间
PHP获取MySQL执行sql语句的查询时间 1. $t1=microtime(true); mysql_query($sql); echo microtime(true)-$t1; 2. //计时开 ...
- Mybatis映射文件SQL语句模糊查询,#和$的区别和注意事项
Mybatis映射文件SQL语句模糊查询 1. "%"#{value}"%" 在参数中不需要添加 %_ 推荐使用 2. '%${value}%' 在参数中不需要 ...
- java sql范围查询语句,java类中写sql语句,查询条件包含换行
java类中写sql语句,查询条件包含换行 detachedCriteria.add(Restrictions.or( Restrictions.like("chengBanDanWeiId ...
- Python与开源GIS:在OGR中使用SQL语句进行查询
属性选择与空间选择都可以看作是OGR内置的选择功能,这两种功能可以解决大部分实际中的问题.但是也有这种时候,就是进行查询时的条件比较复杂.针对这种情况,OGR也提供了更加灵活的解决方案:支持使用SQL ...
- sql语句连接查询.
sql语句连接查询. 接触sql语句这么长时间了,牵涉到连接的时候,总是google别人的. 今天好好学学sql 的连接查询 准备工作 : mysql5.6 建表语句 查询语句 select p.id ...
- sql 语句 将查询结果中数字等标示转成汉字
sql 语句 将查询结果中数字等标示转成汉字 --使用case 语句 将state字段进行转换 0 1 2 正常.删除.禁用 SqlServer: select name,age,sex,sta ...
- 二见钟情之SQL语句嵌套查询
这次机房收费系统折腾了七八次,刚开始的时候是因为不会,现在再改是因为自己不够满意,总觉得还能做得更好一点,所以就推倒重来:然后又推倒,又重来,貌似有瘾一样,不过确实该快点了,不然等自己满意了就该过年了 ...
- sql语句分组查询最新的一次记录
目录 1 需求 2 xml里面的代码 1 需求 A为任务表,B为日志表.一个任务可能有多个日志,一次任务调度就是一个日志: 现在想要拿到最新一次的调度:也就是单个任务的最新一次调度的信息: 2 xml ...
- SQL语句来查询今天、昨天、7天内、30天的数据
SQL语句来查询今天.昨天.7天内.30天的数据,经典! -恢复内容开始- 今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdat ...
最新文章
- pyqt5中信号与槽的认识
- 详解英伟达三大专业视觉解决方案,覆盖数据中心和边缘计算
- Android中代码运行指定的Apk
- C语言18个经典问题答录
- 通过sql-labs进行sql注入学习(11-22)
- Struts2的配置文件——web.xml
- Java进阶学习路线
- spring boot实现WebMvcConfigurer接口定制SpringMvc配置
- Android开发之onCreate
- 移动技术发展有点跑偏
- jq过滤替换敏感词_如何用python简单过滤敏感信息
- Windows Workflow HOL学习笔记(七):添加一个验证来检查Email参数
- WIFI和蓝牙无线模块的应用小结
- Win10保护眼睛豆沙绿背景
- 高斯克吕格投影与墨卡托投影(通用横轴墨卡托、web墨卡托等)
- 在 Word 中插入 Latex 公式
- 3dmax导出fbx模型到unity
- 前端背景图放置_css如何设置背景图片?background属性添加背景图片
- html页面跳转传值原生,html页面跳转传递参数问题
- 测试用例-微信发红包
热门文章
- c语言 long与integer,VB中Integer(整型)和Long(长整型)有什么区别?
- 怎样裁剪GIF动态图片?教你一键在线完成GIF裁剪
- html table拓宽,excel拉长单元格_excel调整单元格大小的方法步骤详解
- Storm部分:Storm Grouping -- 数据流分组(各种数据分发策略的练习)【Java版纯代码】
- 微信小程序web-view使用audio标签播放音频文件时无法自动播放的问题
- 如何快速地向服务器传大文件,大文件如何快速传输
- 和利时PLC主从站通讯
- Python 串级PID代码
- 使用Lambda(拉姆达)对集合进行排序,一行代码即可解决
- ps入门第11天_ps渐变映射 案例:战争之殇