数据库 | SQL查询进阶语法

在test这个数据库中,增加了两个table
一个叫students
一个叫classes
具体内容如下

mysql> select * from students;
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
| 15 | 小明      |   18 | 180.00 ||      1 |           |
| 16 | 小月月    |   18 | 180.00 ||      2 |          |
| 17 | 彭于晏    |   29 | 185.00 ||      1 |           |
| 18 | 刘德华    |   59 | 175.00 ||      2 |          |
| 19 | 黄蓉      |   38 | 160.00 ||      1 |           |
| 20 | 凤姐      |   28 | 150.00 | 保密   |      2 |          |
| 21 | 王祖贤    |   18 | 172.00 ||      1 |          |
| 22 | 周杰伦    |   36 |   NULL ||      1 |           |
| 23 | 程萧      |   27 | 181.00 ||      2 |           |
| 24 | 刘亦菲    |   25 | 166.00 ||      2 |           |
| 25 | 金星      |   33 | 162.00 | 中性   |      3 |          |
| 26 | 静香      |   12 | 180.00 ||      4 |           |
| 27 | 郭靖      |   12 | 170.00 ||      4 |           |
| 28 | 周杰      |   34 | 176.00 ||      5 |           |
+----+-----------+------+--------+--------+--------+-----------+

mysql> select * from classes;
+----+----------------+
| id | name           |
+----+----------------+
|  1 | python01_times |
|  2 | python02_times |
|  3 | python03_times |
+----+----------------+

1.查

as 给表起表名或者给列起表名
select s.name s.age from students as s;
select name as 名字, age as 年龄 from students;

select distinct gender from students;


1.1条件查询

select * from students where age<18 and age<30;
select * from students where age>20 and gender="男";

select * from students where age>25 or height>170;

取反集
select * from students where not (age>20 and gender="男");

1.2 模糊查询

like

select name from students where name="小";
select name from studnets where name like "小%";

--查询名字里面有小的所有名字
select name from students where name like "%小%";

--查询名字里面有3个字的名字
select name from students where name like "__";

--查询名字里面至少两个字以上的
select name from students where name like "__%";

rlike

-- rlike 正则
-- 查询以 周开始的姓名
select name from students where name rlike "^周*";

--查询以周开始伦结尾的姓名
select name from students where name rlike "周.*伦$";

1.3 范围查询,null

select name,age from students where age in (18, 29 ,59);

select name,age from students where age not between 19 and 30;

select * from students where height is null ;

1.4 升序降序

1.4.1单个

默认就是升序,降序需要指令desc指明

默认就是升序,所以升序可以省略,降序需要另外指定
select * from students where (age not between 18 and 30 ) and gender = 1 order by age;
select * from students where (age not between 18 and 30 ) and gender = 1 order by age asc;

select * from students where (age not between 18 and 30 ) and gender = 1 order by age desc;

1.4.2 多列

就近原则,最靠近order by的条件优先级最高,先排序,若相同,再看第二个条件

select * from students where (age not between 18 and 30 ) and gender = 1 order by age asc , id desc;

1.5 聚合,分组

select count(*) as 性别 from students where gender=1;

select max(age) as 最大年龄  from students;

select round(sum(age)/count(*),2) from students;

select gender, avg(age) from students group by gender;

select gender, group_concat(name),avg(age) from students group by gender;

select gender, group_concat(name,"_",age,"_",id),avg(age) from students g
roup by gender;

select gender, group_concat(name) from students group by gender having count(*)>3;

select gender , group_concat(name) from students group by gender having avg(age)>30;

where 和 having的区别,

  1. where在group by 前面,having在group by 后面
  2. where是对原始数据进行限制
  3. having是对查询的结果进行限制

1.6 分页(limit)

展示两个
select * from students limit 2;

从第十个开始展示5select * from students limit 105;

select * from students where gender=2 order by age desc limit 2;

limit 写在order by后面

1.7 连接查询

内连接

select * from students inner join classes on students.cls_id=classes.id;

select students.name ,classes.name from students inner join classes on students.cls_id = classes.id;

外连接

外连接的就有 left join 和 right join两个,但一般用的是left join,right join很少用

原理:就是基于left join语句左边的的这张表查询右边这张表有无对应的条件,有显示数据,没有显示为null,right join 就是把表位置互换,所以一般用left join。

select students.name as 姓名 , classes.name as 班级 from students left join classes on students.cls_id=classes.id having classes.name is null

1.8 自关联

就是表里面的一列的字段关联另一列字段,比如省市县、公司上下级

1.9 子查询

select * from students where height = (select max(height) from students);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值