SQL语言-select的使用方法

select语法的使用(SQLyog)

设定查询结果返回的行数

sql 复制代码
#设定查询结果返回的行数,需要使用limit,指定返回的行数
#格式:select 列名 from 表名 limit n;
#n代表限定的行数
SELECT stu_name FROM student LIMIT 3;

#格式:select 列名 from 表名 limit n,m;
#从n行开始的后面的m行。mysql中的行数下标是从0开始的,
#3,4代表从第四行开始返回4行数据
SELECT stu_name FROM student LIMIT 3,4;

对查询结果进行排序

sql 复制代码
#对查询结果进行排序
#格式:select 列名 from 表名 order by 列名;
#指定排序方向
#order by的默认排序规则是升序排列(a~z),关键字是ASC
#如果要进行降序排列,那么就要使用desc来实现
SELECT * FROM student ORDER BY age ASC;
SELECT * FROM student ORDER BY age DESC;

#查询学生表中年龄最大的学生的姓名
SELECT stu_name FROM student ORDER BY age DESC LIMIT 1;

#使用where对查询的结果进行过滤
#格式:select 列名 from 表名 where 列满足的条件

SELECT * FROM student WHERE age=22;

#查询一班年龄最大的学生信息
SELECT * FROM student WHERE class_id=1 ORDER BY age DESC LIMIT 1;

where子句中的操作符

sql 复制代码
#where子句中的操作符
#=等于、>=、<=、!=、<、<=、<>不等于
#between...and... 指定在两个值之间,包括两个边界值

SELECT * FROM student WHERE age >= 22;
SELECT * FROM student WHERE age != 22;
SELECT * FROM student WHERE age >= 20 AND age <= 22;
SELECT * FROM student WHERE age BETWEEN 20 AND 22;

and 和 or

sql 复制代码
#&& || and or 都是支持的
#and操作符代表多条件要同时满足
#or操作符代表用or连接的所有的条件有一个满足就可以
SELECT * FROM student WHERE age = 20 OR age = 19;

#查询2班和4班中年龄在18岁以下的学生信息
#注意在mysql中and的优先级比or的优先级高,
#所以如果需要先处理or的条件就要加括号来提升or的优先级
SELECT * FROM student WHERE (class_id=2 OR class_id=4) AND age<18;

IN操作符的使用

sql 复制代码
#IN操作符的使用
#IN操作符是来指定在一个条件范围里进行匹配,IN取值包含在圆括号中
#IN操作符的特点:
#计算次序比较直观
#IN操作符比or操作符的执行效率更快
#IN可以包含其他的select语句,可以动态建立多级查询
SELECT * FROM student WHERE age IN (14,19,40);

NOT操作符

sql 复制代码
#NOT操作符
#它的功能是否定它之后所有跟的任何条件
SELECT * FROM student WHERE NOT age = 22;

#查询年龄不是14、19、40的学生信息。
SELECT * FROM student WHERE NOT age IN (14,19,40);

#NOT的优先级比or高,下面的语句无法过滤掉年龄是40岁的信息
SELECT * FROM student WHERE NOT age=22 OR age = 40;

LIKE操作

sql 复制代码
#LIKE操作
#通配符是用来匹配值的一部分的操作符
#为了在查找的时候使用like操作符跟上通配符来达到模糊查询的目的,不进行精确匹配。

#%百分号
#%表示任何字符出现的任意次数(包括0次),但是不能匹配NULL;
SELECT * FROM student WHERE stu_name LIKE '武%';

#下划线 _
#下划线的用途和%类似,但是下划线只能匹配单个字符而不是多个
SELECT * FROM student WHERE stu_name LIKE '武__';

#%和_的区别
#_代表只能匹配一个字符,不能多也不能少
#通配符会更加消耗查询的时间,所以只在必要的时候才使用通配符

别名操作

sql 复制代码
#别名操作
#使用as关键字可以做别名操作
SELECT stu_name AS `name`, sex AS stu_sex FROM student;
#AS可以省略,如果省略中间需要用空格隔开
SELECT stu_name `name`, sex stu_sex FROM student;

算术运算

sql 复制代码
#算术运算 + - * /
#对单个字段进行算术运算
SELECT age+10 FROM student;
SELECT age-10 FROM student;
#对多个字段进行算术运算
SELECT age+class_id FROM student;

日期和时间的处理函数

sql 复制代码
#日期和时间的处理函数
#获取当前的日期时间函数
#curdate() 返回当前的日期
#curtime() 返回当前的时间
#now()     返回当前的日期时间

SELECT CURDATE();
SELECT CURTIME();
SELECT NOW();

#获取日期时间的一部分
#date() 返回日期时间的日期部分
#year() 返回日期时间的年的部分
#month() 返回日期时间的月的部分
#day()	 返回日期时间的日的部分

SELECT DATE(date_time), YEAR(date_time), MONTH(date_time), DAY(date_time) FROM student;


#时间日期计算函数
#AddDate() 增加一个日期
#给 date_time 日期加30天,查看结果日期
SELECT ADDDATE(date_time, 30) FROM student;

#查询入班时间在2022-01-25的学生信息
#如果按照如下写法 只能查到时间是00:00:00的学生,其他时间段的学生查不到
SELECT * FROM student WHERE date_time='2022-01-25';
#可以直接先将日期用函数获取出来,然后再进行判断,就可以获取到所有数据了
SELECT * FROM student WHERE DATE(date_time)='2022-01-25';
#查询一个时间范围内的信息
SELECT * FROM student WHERE DATE(date_time) BETWEEN '2022-01-20' AND '2022-01-25';


#查询2022年2月加入班级的学生
SELECT * FROM student WHERE YEAR(date_time) = '2022' AND MONTH(date_time)='2';

聚集函数

sql 复制代码
#聚集函数
#运用在单列上,计算和返回单个值的函数
#AVG() 返回某列的平均值
#COUNT() 统计某列的行数

#MAX()  返回某列的最大值
#MIN()  返回某列的最小值
#SUM()	返回某列值之和

SELECT AVG(age) avgAge FROM student;
#统计表中有多少行,最好用*,因为统计别的字段都有可能遇到NULL
SELECT COUNT(*) FROM student;
SELECT MAX(age) FROM student;
SELECT MIN(age) FROM student;
SELECT SUM(age) FROM student;

分组查询 group by

sql 复制代码
#分组查询 group by
#根据表中的某一个字段来将数据分为多个组,字段值相同的为一组,分组的目的是为了方便聚集计算
SELECT * FROM student GROUP BY class_id;
SELECT class_id, AVG(age) FROM student GROUP BY class_id;

#对聚集的结果进行过滤
#对分组之后的数据要进行过滤时,需要使用having关键字来指定条件,不能使用where
SELECT class_id, AVG(age) FROM student GROUP BY class_id HAVING AVG(age) <= 20;

#如果要对分组之后的结果的某个字段进行排序,可以在group by 之后继续使用order by来进行。
SELECT class_id, age FROM student GROUP BY class_id ORDER BY age DESC;

select中子句的顺序

sql 复制代码
#select中子句的顺序
#关键字		说明				是否必须使用
#SELECT		返回需要的列或者表达式		是
#FROM		从哪一个表中检索		仅在从表中选择数据的时候使用
#WHERE		行级过滤			否
#GROUP		分组说明			仅在进行按组计算的时候才使用
#HAVING		组级过滤			否
#ORDER BY	输出排序的顺序			否
#LIMIT		限制返回的行数			否


#查询2班和4班中年龄总和最大的班级以及相应的年龄之和。
SELECT class_id, SUM(age) FROM student WHERE class_id IN (2,4) GROUP BY class_id
ORDER BY SUM(age) DESC LIMIT 1;

子查询

sql 复制代码
#子查询
#SQL允许建立子查询,代表在其他查询中的查询
#可以在一个查询语句中嵌套另外一个查询语句,这种语句也叫做嵌套查询,外层是父查询,内层的是子查询。
#外层查询需要使用到内层查询的结果,所以先执行内部的查询,再执行外部的查询
SELECT stu_name, age FROM student WHERE age IN (SELECT MAX(age) FROM student);

#查询东方老师和司马老师所带班级的学生姓名
SELECT stu_name FROM student WHERE class_id IN (SELECT cls_id FROM teacher WHERE teacher_name IN ("东方老师", "司马老师"));

#子查询的规则:
#子查询中的select语句总是要圆括号括起来
#子查询最多可以嵌套32层
#任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个字段的值
#如果某个表只出现在子查询中而没有出现在外部查询中,那么该表的列就无法包含在输出中

MYSQL表联结操作

sql 复制代码
#MYSQL表联结操作
#如果在两个表进行连接的时候,没有指定条件,那么会出现笛卡尔积的框,返回的行数是第一个表的行数×第二个表的行数
SELECT * FROM student, teacher;

#在两表联结的时候要指定匹配的相应字段,才能获取有效数据
SELECT * FROM student s, teacher t WHERE s.`class_id` = t.`cls_id`; 
#查询一班和二班的代课老师以及对应的学生姓名
SELECT teacher_name, stu_name FROM student s, teacher t WHERE s.`class_id`=t.`cls_id` AND class_id IN (1,2);

#三表联合查询
#查询地址为广东的老师带的是哪些学生以及相应的授课科目。
#多表联结的时候 核心是要找到联结条件,一般情况下都是主键和外键进行相关联的。
SELECT stu_name, teacher_name, pro_name FROM student s, teacher t, project p
WHERE s.`class_id`=t.`cls_id` AND t.`project_id`=p.`pro_id` AND address='广东';
相关推荐
蓬莱道人1 分钟前
BenchmarkSQL使用教程
数据库
p@nd@16 分钟前
Oracle筑基篇-调度算法-LRU的引入
数据库·oracle·操作系统·lru
来一杯龙舌兰28 分钟前
【MongoDB】使用 MongoDB 存储日志、审批、MQ等数据的案例及优点
数据库·mongodb
技术路上的苦行僧29 分钟前
分布式专题(8)之MongoDB存储原理&多文档事务详解
数据库·分布式·mongodb
孤独的履行者36 分钟前
入门靶机:DC-1的渗透测试
数据库·python·网络安全
wy02_44 分钟前
MySQL-MVCC(多版本并发控制)
数据库·mysql
NY62 小时前
mysql运维篇笔记——日志,主从复制,分库分表,读写分离
数据库·sql
潜洋2 小时前
Spring Boot 教程之三十六:实现身份验证
java·数据库·spring boot
科马3 小时前
【Redis】缓存
数据库·redis·spring·缓存
LuiChun3 小时前
Django 模板分割及多语言支持案例【需求文档】-->【实现方案】
数据库·django·sqlite