博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql 查询(详细版)
阅读量:6279 次
发布时间:2019-06-22

本文共 3120 字,大约阅读时间需要 10 分钟。

hot3.png

1. 基本查询

  • 查询所有字段
select * from students;
  • 查询指定字段
select name,age,gender from students;   -- 只有一张表select s.name,s.age,s.gender from students as s;    -- 有多张表,将sudents表指定为s
  • 消除重复行
select distinct name from student;        -- distinct可以过滤掉重复的数据

2. 条件查询

  • where 后面支持多种运算符,进行条件的处理
-- 比较运算符和逻辑运算符select * from students where id > 5 and gender = 1;    -- 查询id>5的男同学select * from students where name != '张三' or id <= 3;    -- 查询id小于等于3或者名字不等于3的学生
-- 模糊查询(使用like)select * from students where name like '张%' or name like '%三';    -- 查询名字以张开头的学生或者以三结尾的学生(%表示一个或多个字符)select * from students where name like '张_' or name like '_三'    -- 查询名字以张开头或者以三结尾的两个字的学生(_表示一个字符)
-- 范围查询(between and ,in)select * from students where id between 1 and 3;    -- 查询id在1-3之间的学生select * from students where id in (3, 6, 9);        -- 查询id是3,6,9的学生

3. 排序和分组

  • 排序(order by)
select * from students where gender = 1 and is_deleted = 0 order by id desc;-- 将没有被删除的男生按降序排序select * from students where name like '张%' and gender = 1 order by id;-- 将姓张的男生按升序排序
  • 分组(group by ... having)
-- 分组是对数据表某一个字段执行一次排序操作,然后总结出分类数量。select gender,count(*) from students group by gender;    -- 统计男女生数量select gender, any_value(name) from students group by gender;  -- 获取分组后分类的默认值,用any_value,但不能同时获取分组数量select gender,count(*) from sudents group by gender having gender =2; -- 统计班上女生的数量(使用having做判断)-- where和group by区别:where是对from后面指定的表进行数据筛选,属于对原始数据的筛选;having是对group by的结果进行筛选

4. 聚合函数和分页

  • 聚合函数(max,min,avg,count,sum)
select max(height) from students where gender = 1;    -- 统计身高最高的男生select avg(height) from students;        -- 统计平均身高(取的是非空值)
  • 分页(limit start,end)
-- pageNum, pageSizeselect * from students limit 0,5;    -- 查询前5条数据select * from students limit pageSize*(pageNum-1),pageSize; -- 分页公式

5. 连接查询(inner A join B on a = b)

  • 内连接查询
select s.name,c.name from students as s inner join classes as c on s.cls_id = c.cls_id;-- 查询班上学生所在的班级select A.name,B.name from A inner join B on A.cls_id = B.cls_id;   -- 连接查询的公式-- 内连接省略写法(inner join 可以写成join 或者cross join)
  • 外连接查询(left join和right join)
select * from students as s left join classes as c on s.cls_id = c.cls_id; -- 左连接,查出来的数据以左边的表为主表,右边的为附表select * from students as s right join classes as c on s.cls_id = c.cls_id; -- 右连接,以右边的表为主表,所有内容都显示,左边的显示一部分,空余的部分用null填充。-- 外连接省略写法(left join 可以写成 outer join)

6. 自关联查询

  • 常见的省市关联
create table areas(aid int primary key,atitle varchar(20),pid int);     -- 创建areas表select p.atitle,s.atitle from areas as p inner join areas as s on s.pid = p.aid where pid='湖北省';    -- 通过内联查询,找出父子表之间的关系(查询湖北省的所有市)
  • 类似的也常见于二级菜单,树形结构等

7. 子查询(select .... select ....)

  • 分类:标量,行级,列级,表级
--  查询班上大于平均身高的学生-- 充当数据源select * from (select * from students) as t;   -- 必须要有别名-- 充当条件select * from students where height > (select avg(height) from students); --子查询必须要有括号-- 列级子查询的应用select classes.name from classes where cls_id in (select cls_id from students);     -- 查询有学生的班级-- 行级子查询应用(构建行元素)-- 关键字(in 范围,any/some 任意一个,all 所有)select * from students where (age, height) = (select max(age),max(height) from students);     -- 查询班级年龄最大,身高最高的学生(如果最大不在一个人身上,返回空)-- 表级子查询一般效率较低,并且一般都可以用连接查询实现。

转载于:https://my.oschina.net/chinahufei/blog/1583801

你可能感兴趣的文章
Spring MVC中文文档翻译发布
查看>>
docker centos环境部署tomcat
查看>>
JavaScript 基础(九): 条件 语句
查看>>
Linux系统固定IP配置
查看>>
配置Quartz
查看>>
Linux 线程实现机制分析
查看>>
继承自ActionBarActivity的activity的activity theme问题
查看>>
设计模式01:简单工厂模式
查看>>
项目经理笔记一
查看>>
Hibernate一对一外键双向关联
查看>>
mac pro 入手,php环境配置总结
查看>>
MyBatis-Plus | 最简单的查询操作教程(Lambda)
查看>>
rpmfusion 的国内大学 NEU 源配置
查看>>
spring jpa 配置详解
查看>>
IOE,为什么去IOE?
查看>>
java 用反射简单应用,将Object简单转换成map
查看>>
Storm中的Worker
查看>>
dangdang.ddframe.job中页面修改表达式后进行检查
查看>>
Web基础架构:负载均衡和LVS
查看>>
Linux下c/c++相对路径动态库的生成与使用
查看>>