MySQL:select查询语法大全

张开发
2026/4/10 8:04:21 15 分钟阅读

分享文章

MySQL:select查询语法大全
本文详细介绍了MySQL的查询语法并配有举例说明请耐心观看。额外说明#在sql中代表注释符号。下方是举例要使用的表和数据可以根据自生情况进行更改。drop database csdn; create database csdn; use csdn; create table student( id int primary key auto_increment, name varchar(20), age int, sex int, class_id int ); create table teacher( id int primary key auto_increment, name varchar(20), age int, sex int, class_id int ); create table class( id int primary key auto_increment, name varchar(20) ); # 由于篇幅问题这里将插入数据写为了一行 # 插入班级数据 INSERT INTO class (id, name) VALUES(1, 一班),(2, 二班),(3, 三班),(4, 四班),(5, 五班); # 插入学生数据 INSERT INTO student (id, name, age, sex, class_id) VALUES(1, 张三, 18, 1, 1),(2, 李四, 19, 1, 1),(3, 王五, 18, 0, 1),(4, 赵六, 20, 1, 1),(5, 钱七, 19, 0, 1),(6, 孙八, 18, 1, 2),(7, 周九, 19, 1, 2),(8, 吴十, 20, 0, 2),(9, 郑一, 18, 1, 2),(10, 刘二, 19, 0, 2),(11, 陈三, 18, 1, 3),(12, 杨四, 19, 1, 3),(13, 黄五, 20, 0, 3),(14, 周六, 18, 1, 3),(15, 林七, 19, 0, 3),(16, 何八, 18, 1, 4),(17, 高九, 19, 1, 4),(18, 罗十, 20, 0, 4),(19, 宋一, 18, 1, 4),(20, 谢二, 19, 0, 4),(21, 韩三, 18, 1, 5),(22, 唐四, 19, 1, 5),(23, 冯五, 20, 0, 5),(24, 邓六, 18, 1, 5),(25, 曹七, 19, 0, 5); # 插入教师数据 INSERT INTO teacher (id, name, age, sex, class_id) VALUES(1, 王老师, 35, 1, 1),(2, 李老师, 42, 0, 1),(3, 张老师, 38, 1, 2),(4, 赵老师, 45, 0, 2),(5, 刘老师, 40, 1, 3),(6, 陈老师, 36, 0, 3),(7, 杨老师, 43, 1, 4),(8, 黄老师, 39, 0, 4),(9, 周老师, 41, 1, 5),(10, 吴老师, 37, 0, 5),(11, 欧阳老师, 37, 0, 6);1、基础语法select 字段名1,字段名2 ...from 表名; #查询该表中的具体某一个或几个字段或select * from 表名; #查询该表中的所有字段select * from student; select id, name, sex from student;2、关键字2.1 as 和 distinct2.1.1 asas 后接自定义名称用于给字段起别名可以在展示时将原有字段名或表名替换为自定义名称注意事项不是每个查询语句都需要取别名一般按按实际需求来。as可以省略字段名或表名在与别名之间用空格就行。子查询作为from数据源时必须要使用别名。select id, name as username, sex gender from student;2.1.1 distinctdistinct 用于给字段去重distinct必须写在所有字段的前面对后方所有字段进行组合去重select distinct class_id from student ; select distinct class_id , id from student ; select id ,distinct class_id from student ;#本行sql会报错2.2 wherewhere后接条件用于筛选符合条件的数据2.2.1 条件判断符号符号作用大于小于等于!不等于不等于大于等于小于等于is null是否为nullis not null是否不为nullin在其中几个之一between在两数之间注意事项和以及都不可以对null进行比较。null只能用is null和is not null进行比较。日期类型也可以用上述符号进行比较。in和between前可以加not作用与之相反select * from student where id 1; select * from student where name is not null; select * from student where id in (1,7,13); select * from student where id between 1 and 3;2.2.2 like 模糊匹配注意事项%为匹配符表示0个或多个字符串。%加在匹配词前表示要匹配所有以匹配词为末尾的数据。%加在匹配词后表示要匹配所有以匹配词为开头的数据。%在匹配词的前后都加表示要匹配所有匹配词居中的数据。like前可加not关键字表示匹配与匹配结果不同的数据所有字段均可以匹配。#匹配所有姓周的学生 select * from student where name like 周%;2.2.3 正则匹配符号作用^匹配开头位置$匹配末尾位置.匹配除“\n”之外的任何单个字符[...]匹配括号内的任意一个字符[^...]匹配不在括号内的任意一个字符(a1|a2|a3)匹配括号中的某一个字符串就行*匹配前面的子表达式零次或多次匹配前面的子表达式至少一次{n}匹配前面的子表达式n次{n,}匹配前面的子表达式至少n次{n,m}匹配前面的子表达式至少n次最多m次regexp和rlike是进行正则匹配的关键字二者作用相同。注意事项^加在正则表达式开头$加在正则表达式的末尾。若^和$都被加在正则表达式上则只有数据严格等于正则表达式才会被匹配中。(a1|a2|a3)中的每一个匹配项都可以是正则表达式且|优先级极高在使用中若还有其它的正则匹配规则括号必不可少。{n}只匹配前一个表达式建议将要匹配的子表达式用括号括起来。#匹配所有姓周或姓王的学生 select * from student where name rlike ^[周王];2.2.4 合并条件符号符号作用and要同时满足and前后的条件not不满足not后的条件oror的前后条件之中满足一个即可注意事项and除在between中使用外和or都需要至少要两个条件才能使用且放在两个条件之间。not可以在单个条件使用放在该条件之前也可以在多个条件中使用放在条件之间。#匹配所有姓周或姓王的学生 select * from student where name like 周% or name like 王%; #匹配所有不姓王的学生 select * from student where not name like 王%;2.3 group bygroup by 后接字段用于分组注意事项group by 字段 后不可以接asc或desc只能使用order by排序。group by 字段字段字段......group by后可以接多个字段进行分组先根据第一个字段进行分组再根据第一次分组的结果每一小组再根据第二个字段进行分组以此类推。聚合函数公式作用count(*)获取行数max(列名)取最大数min(列名)取最小数sum(列名)求和avg(列名)求平均值group_concat(distinct 列名,列名...separator 间隔内容)将列与列拼接distinct可加可不加separator后的为行与行的间隔内容可以不写separator默认为逗号select max( id),class_id from student group by class_id ; select class_id,group_concat(name) from student group by class_id ; select class_id,group_concat(name separator *) from student group by class_id ;2.4 havinghaving后接条件用于展示分组数据。注意事项只有使用了group by才能使用having。having后接的条件条件判断中的字段必须是select要查询出来的字段如select 字段1max(字段2) 字段max count(*) size from 表1 group by 字段1 条件判断中的字段就只能在字段1、字段max和size中使用除非使用聚合函数才能使用表1中的其它字段。select max(id) as max_id,class_id from student group by class_id having max_id 1 ;2.5 order byorder by后接字段再后可接asc或desc。注意事项asc为升序desc为降序默认为asc。order by后也可以接多个字段并使用asc或desc关键字先按第一个字段排序有相同排名的在使用第二个字段排序以此类推。order by后接的条件条件判断中的字段必须是select要查询出来的字段如select 字段1字段2 字段3 from 表1 order by 字段1 条件判断中的字段就只能在字段1、字段max和size中使用。select * from student order by id; select * from student order by id desc; select * from student order by id asc ;2.6 limitlimit后接索引数量也可以只接数量注意事项索引是从0开始的与id或其它自定义字段无关。从索引处开始取指定数量的数据。select * from student limit 2;#取前两个 select * from student limit 2,2;#取第3第4个3、联表查询inner join 、left join 和 cross join 都可以互相叠加3.1 inner join表1 inner join 表2 on 条件 可以把两个表用特定的条件组合起来注意事项inner join 的 inner 可省略直接写为 join 。表1 inner join 表2 on 表1.字段1 表2.字段1与 form 表1表2 where 表1.字段1 表2.字段1前者是显式内连接后者式隐式内连接。作用一致但显式内连接结构更加清晰。推荐使用 inner join 。inner join 可以叠加表1 inner join 表2 on 表1.字段1 表2.字段1 inner join 表3 on 表2.字段1 表3.字段1select * from student inner join class on student.class_id class.id;3.2 left join表1 left join 表2 on 条件要返回表1的全部数据表2匹配条件的数据就相应返回没有与表1相匹配的数据就null注意事项left join 与 right join 的作用正好相反。left join 也可以叠加。#id为11的teacher没有对应的class select * from teacher left join class on teacher.class_id class.id;3.3 cross join表1 cross join 表2 无需条件返回两张表的笛卡尔积所有组合select * from teacher cross join class ;4、子查询4.1 标量子查询整个子查询只返回一个值select max(id) from class; select * from student where id (select max(id) from student);4.2 列子查询整个子查询只返回一列数据select id from class; select * from student where class_id in (select id from class);4.3 行子查询整个子查询只返回一行数据select class_id ,max( id) from student group by class_id order by class_id limit 1; select * from student where (id,class_id) (select max(id) id ,class_id from student group by class_id order by class_id limit 1);4.4 表子查询一般返回多行多列和正常查询差不多select class_id ,max( id) from student group by class_id order by class_id; select * from student where (id,class_id) in (select max(id) id ,class_id from student group by class_id order by class_id );4.5 子查询的注意事项每一个子查询都是一个完整且独立的查询语句。子查询可以做from的数据源也可以做where中的判断数据。但子查询在做from的数据源时必须要起别名。

更多文章