一.简单查询
格式:select 字段名 from 表名
字段名可以指定一个,也可以指定多个,使用*代表查询所有字段
表名必须存在
select后边可以对指定字段进行数学运算
# 使用*可以查询到当前表中的所有字段 SELECT * FROM product; # 查询所有商品的指定字段(商品名,商品价格) SELECT pname, price FROM product; # 将商品名称及商品价格互换位置,则输出的数据列位置同样进行更改 SELECT price, pname FROM product; # 查询所有商品价格的同时对所有的商品价格+10后进行输出 SELECT pname, price + 10 FROM product;
二.比较查询
< > <= >= = != <>
# 需求:查询商品价格大于600的所有商品信息 SELECT * FROM product WHERE price > 600; # 查询商品价格小于2000的所有商品信息 SELECT * FROM product WHERE price < 2000; # 查询商品价格小于等于1000的所有商品的名称 SELECT pname FROM product WHERE price <= 1000; # 查询 商品价格大于等于800的多有商品的名称和价格 SELECT pname, price FROM product WHERE price >= 800; # 查询商品价格不等于800的所有商品的信息 SELECT * FROM product WHERE price != 800; SELECT * FROM product WHERE price <> 800;
三.范围查询
between and 查询连续范围内的数据,包含左右边间,是一个闭区间
between and 必须从小值到大值进行范围划分,否则没有数据
in 查询不连续区间内的数据,in (数据1, 数据2 。。。。。)
格式:select 列名 from 表名 where 字段名 in (数据1, 数据2, 数据3 。。。。)
# 需求: 查找,价格在200-2000范围内的所有商品,包含起始和终止位置,是一个闭区间[] SELECT * FROM product WHERE price BETWEEN 200 AND 2000; # in 不连续范围查询 # 需求:查找价格是200, 800, 2000, 5000的所有商品的全部信息 SELECT * FROM product WHERE price IN (200, 800, 2000, 5000); # 查询在安徽和北京的同学 SELECT * FROM student_info WHERE hometown in not ('安徽', '北京');
四.逻辑查询
逻辑运算符
and 逻辑与 同真即真
or 逻辑或 同假即假
not 逻辑非 非真即假,非假即真
# 需求: 查询价格在200-2000之间的所有商品,如果需要包含边界,则需要使用大于等于和小于等于 SELECT * FROM product WHERE price <= 2000 AND price >= 200; # 需求:查询价格不再200-2000范围内的所有商品信息 SELECT * FROM product WHERE NOT (price <= 2000 AND price >= 200); # 方法二: SELECT * FROM product WHERE price > 2000 OR price < 200;
五.模糊查询
like关键字,可以进行模糊查询:根据指定规则进行查询
- %:代表0个或多个字符
- _:代表一个字符
格式: select 列名 from 表名 where 字段 like 规则;
# 需求:查询名字以"斯"结尾的所有商品 SELECT * FROM product WHERE pname LIKE '%斯'; # 需求,查询名字以"海"开头的所有商品 SELECT * FROM product WHERE pname LIKE '海%'; # 需求:查询名字中带有"霸"的所有商品 SELECT * FROM product WHERE pname LIKE '%霸%'; # 需求:查询名字是两个字的所有商品 SELECT * FROM product WHERE pname LIKE '__'; # 查询名字是三个字符,且结尾为斯的商品信息 SELECT * FROM product WHERE pname LIKE '__斯';
六.非空查询
- is null 判断是否为空
- is not null 判断是否不为空
- 格式: select 列名 from 表名 where 字段名 is (not) null;
# 需求: 删除pid =10 的category_id 的值 UPDATE product SET category_id = NULL WHERE pid = 10; # 需求: 查询所有商品中,category_id为空的商品 # null 是不能和其他数据类型进行比较的 # 如果需要判断当前数据是否为空值,则使用is null判断 SELECT * FROM product WHERE category_id IS NULL; # 需求:查询所有商品中category_id不为空的商品 SELECT * FROM product WHERE category_id IS NOT NULL; SELECT * FROM product WHERE NOT (category_id IS NULL); # 查询所有商品中category_id为空 且 pname 不为空的商品(加上括号易于阅读,并且不容易出错) SELECT * FROM product WHERE (category_id IS NULL) AND (pname IS NOT NULL);
七.排序查询
- order by:排序的关键字,可以构建指定字段,指定规则的排序
- 格式: select 列名 from 表名 where 条件 order by 字段名 排序规则(asc 升序、 desc 降序);
- 如果按照多个字段进行排序,先按照排在前边的字段进行排序,如果排序值相同,则按照后边的规则排序。
- 如果需要升序排列,则不需要使用ASC,默认就是升序排列
- 按照多个字段规则进行排序,则先按照最前面的规则排序,如果排序过程中,值相同,则按照后边的规则进行排序
- 文本型数据排序规则
- 没有数据 < 有数据
- 排序按照编码表顺序排序 排在前边的小 排在后边的大 0-9依次递增 < A-Z 依次递增 < a – z 依次等
- 文本型数据比较大小按位比较,第一位进行比较如果值大则大,值小则小,如果相同,则比较第二位
# 需求:查询所有商品中,价格大于2000的商品并按照升序进行排列. SELECT * FROM product WHERE price > 2000 ORDER BY price ASC; # 需求:按照categroy_id进行升序排列,如果categroy_id相同,则按照价格进行降序排列 SELECT * FROM product ORDER BY category_id ASC , price DESC ; # 需求:按照价格进行降序排列,如果价格相同,则按照category_id进行升序排列 SELECT * FROM product ORDER BY price DESC , category_id;
八.分组查询
group by :将记录按照指定字段分成多组,字段相同的内容分为一组
格式:select 分组字段/聚合函数/其他函数 from 表名 group by 分组字段 having 条件
having
- 在group by 分组之后,不能使用where进行条件查询,只能通过having进行条件筛选
- 在having中可以使用聚合函数,但是在where 中不可以使用
在linux 中默认开启了group by 严格模式,在select后边不能使用除了分组字段外的其他字段
# 需求:查询当前产品中每一类商品各有多少个 SELECT category_id, count(*) FROM product GROUP BY category_id; # 需求:查询当前商品中,每一类商品的平均价格是多少? SELECT category_id, avg(price) FROM product GROUP BY category_id; # 需求:查询每一类商品的最大价格是多少? SELECT category_id, max(price) FROM product GROUP BY category_id; # 需求,查询出商品种类超过两种的商品类型 SELECT category_id, count(*) FROM product GROUP BY category_id HAVING count(*) >= 2; # 根据多个字段进行分组 # 根据多个字段分组的原则就是,两个字段同时相等,则分为一组,如果有一个字段不相同,也不能分为一组 SELECT category_id, price FROM product GROUP BY category_id, price; # 拓展 查看当前每一类商品的所有商品名称 # 在查询数据时,每一个组中有多条记录,在查询过程中,不能使用除分组字段外的其他字段进行显示,因为对应记录较多,不知道该获取哪一条记录 SELECT category_id, group_concat(pname) FROM product GROUP BY category_id;
九.分页查询
- 分页查询就是将查询到的数据按照一定的规则截取其中的一部分
- 格式:select 字段 from 表名 limit m , n
- m:当前也开始索引的位置
- n:当前页所要展示的条目数
# 需求:查询所有的商品数据,并展示前三条数据 SELECT * FROM product LIMIT 0, 3; # 如果从开头开始展示,可以将起始位置进行省略 SELECT * FROM product LIMIT 3; # 需求:查询所有商品数据,并展示第5-7条数据 SELECT * FROM product LIMIT 4, 3;
十.多表查询
内连接:交集,在查询过程中,保留左右两侧共有的记录
左连接:差集,在查询过程中,保留左侧表全部数据,以及右侧表可以匹配到左表的数据
右连接:差集,在查询过程中,保留右侧表全部数据,以及左侧表可以匹配到右侧表的数据
# 内连接:交集运算,左表中存在的数据,右表中也存在则被保存 SELECT * FROM hero INNER JOIN kongfu on hero.kongfu_id = kongfu.kid; # inner可以被省略 SELECT * FROM hero JOIN kongfu on hero.kongfu_id = kongfu.kid; # 左 外链接 左表中所有的数据都被保存下来,右表中只有能够匹配左表的数据被保留 SELECT * FROM hero LEFT OUTER JOIN kongfu ON hero.kongfu_id = kongfu.kid; # outer 可以被省略 SELECT * FROM hero LEFT JOIN kongfu ON hero.kongfu_id = kongfu.kid; # 右 外连接 右表中所有的数据都被保留下来,左表中只有能够匹配右表的数据被保留 SELECT * FROM hero RIGHT OUTER JOIN kongfu ON hero.kongfu_id = kongfu.kid; # outer 可以被省略 SELECT * FROM hero RIGHT JOIN kongfu ON hero.kongfu_id = kongfu.kid; # 字段名称和表名,可以使用as关键字,进行重命名,字段名称, # 重命名后,查询出来的内容的列名将会发生改变 SELECT h.hname AS hero_name, k.kname AS kongfu_name FROM hero AS h JOIN kongfu AS k ON h.kongfu_id = k.kid; # as 可以被省略,但是初学阶段不建议省略,增加可读性,方便日后复习 SELECT h.hname hero_name, k.kname kongfu_name FROM hero h JOIN kongfu k ON h.kongfu_id = k.kid;
十一.子查询
子查询就是select中嵌套一个select语句
select 查询,可以作为一个值,一个数据序列, 也可以作为一个表出现
子查询可以单独执行,如果子查询单独执行出现报错那放到其他语句中一样会报错
# 需求:获取所有商品的平均价格 SELECT avg(price) FROM product; # select 获取的是一个值 # 需求:获取所有商品的名称 SELECT pname FROM product; # select 获取的是一列数据 (或者说一个向量数据) # 需求:获取所有商品的全部信息 SELECT * FROM product; # select 获取的是一个表 (或者说获取的是一个矩阵) # 需求:获取产品价格大于平均价格的所有商品的信息 SELECT * FROM product WHERE price > (SELECT avg(price) FROM product); # 需求: 获取和categroy_id= 1 的商品价格相同的所有商品 # 结构: 获取商品信息 价格 in (类别为1的所有商品的价格) SELECT * FROM product WHERE price IN (SELECT price FROM product WHERE category_id = 'c001'); # 需求: 获取所有的数据,价格大于平均值 且category_id 不等于'c001'() SELECT * FROM (SELECT * FROM product WHERE category_id != 'c002') AS c WHERE price > (SELECT avg(price) FROM product);