MySQL数据库查询详解
1.查询之前需要做的准备
1.1如果是自己创建的数据库或者有权限查看数据库中每个表之间的关系,则可以把数据库内容导入到navicat工具或者其他的软件,通过查看E-R图能够快速熟悉表与表之间的关系,为多表连接查询做好准备。
1.2数据库不是自己所创建的,没有权限查看数据库中表与表之间的关系,只能查看每个数据表中的字段的定义和内容。在数据表不是特别多情况下就打开逐一打开每个数据表熟悉每个字段,了解每个数据表中各个字段表示什么含义,常见的是两个表存在主外键的关系,两个数据表中存在共同的字段,则比较容易建立连接关系,特别需要注意的是不一定实在字段名称相同的情况下两个表才能连接起来,只要两个数据表表达的字段的含义(字段数据类型必须一致)相同,即可让两个数据表建立连接。例如,在project数据表中存在个id,name(项目名称),number等字段,在team表中有name(团队名称),project等,需要注意的是虽然两个数据表都有name字段,但是表示的含义却完全不同,因此不能作为连接的条件,而project表中的id(int类型)表示的项目编号,而在team表中project字段(假设是int类型的)和project表中的id字段虽然两个字段名称不同,但是表示的确实相同的含义,即都表示项目编号,可以作为两个连接的条件。其他表的连接也遵循这一原则。至于表数量特别多,然后又没有权限查看表与表之间关系的,只能联系数据库管理人员,申请权限进行访问了。
2.单表查询
2.1介绍一下MySQL数据库中常用的关键字
1.distinct关键字
作用:检索出有不同值的列,比如一个商品表中存在供应商product_pro,一个供应商会对应很多商品,我们要查找有多少供应商,就可以用到该关键字去重。
select distinct product_pro fromproducts;
2.limit关键字
作用:返回表中指定行范围的数据(即查询有限条数据)
select name from products limit 5; --返回不多于5行的数据
select name from products limit 1,5; --返回从1行开始的5行。
3.order by关键字
作用:对所查询的列进行升序排列
select name from products order by id asc(其中asc可以省略不写,默认按升序进行排序)
在字段后加上desc关键字进行降序排序
select name from products order by id desc;
order by 和 limit 组合可以查询最大值,示例如下:
select prod_price from products orderby prod_price DESC limit 1;
order by 和 where 语句连着使用时必须放在where后面。
4.and 和 or 结合使用
and和or常在where后面进行条件的限定,要求and两端的条件都要满足,而or只要求满足其中一个条件即可。
5.in 和 not in
用 in可以代替 or
应用场景:假设1002和1003生产的商品
select * from products where vend_id =1002 or vend_id = 1003; -- or方法
select * from products where vend_id in(1002,1003); -- in方法
select * from products where vend_idnot in (1002,1003); -- not in方法查询不是 1002 和1003 生产的商品
6. like 关键字
作用:进行一些模糊匹配,通常和一些通配符进行搭配查找
select * from products where prod_namelike 'jet%' --匹配以jet开头的字符
select * from products where prod_name like'%dcb%' --匹配任何位置包含dcb字符商品信息
select * from products where prod_namelike '_jet' -- 匹配一个字符
select * from products where prod_namelike '[jdk]%'; --匹配以 j, d , k ,开头的商品
select * from products where prod_namelike '[!jdk]%'; --匹配不以j , d , k ,开头的商品
7.update 关键字
作用:根据一些条件更新数据库中的值,update 表名set 字段 = 新的值 where 条件(是什么),示例如下:
update products set prod_price = 100where prod_name = jet; --修改商品名称为jet商品价格
8.union 关键字
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个SELECT 语句中的列的顺序必须相同。
SELECT City FROM Customers UNION SELECTCity FROM Suppliers
ORDER BY City;
UNION 不能用于列出两个表中所有的城市。如果一些客户和供应商来自同一个城市,每个城市只会列出一次。UNION 只会选取不同的值。请使用 UNION ALL 来选取重复的值!
SELECT City FROM Customers UNION ALL SELECTCity FROM Suppliers
ORDER BY City;
2.2基本查询
查询的格式:
SELECT[distinct]*(所有)|字段名,...字段名 from 表名 [where 条件过滤] -- 查询指定字段信息pname,price
SELECT pname,price FROM products; -- 去除价格重复的记录
SELECT DISTINCT price FROM products; --别名查询,使用的as关键字,as可以省略的
SELECT pname AS 名称,priceAS 价格 FROM products或者写成
SELECT pname 名称,price价格 FROM products都可以
-- 查询出所有的商品价格,把价格增加20元
SELECT pname,price+20 price FROMproducts;
2.3条件查询
格式:
select [distinct]*(所有)|字段名,...字段名 from 表名[where 条件过滤]
比较运算符 >(大于) <(小于) >=(大于等于) <=(小于等于) =(等于)<>或者!=(不等于)
查询商品名称为“花花公子”的商品所有信息
SELECT * FROM products WHERE pname = '花花公子';
SELECT * FROM products WHERE pname IN('花花公子');
查询价格为800商品
SELECT * FROM products WHERE price =800;
查询价格不是800的所有商品
SELECT * FROM products WHERE price !=800或者
SELECT * FROM products WHERE price<> 800
查询商品价格大于60元的所有商品信息
SELECT * FROM products WHERE price >60;
2.4聚合函数:
count:统计指定列不为NULL的记录行数;
sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
使用聚合函数的格式如下:
select 聚合函数(字段) from 表名
2.5分组查询
分组查询语句:
select 被分组的字段 from 表名 group by 字段 [having 字段]
注意:被分组的字段,一定要写在select后面
例:根据商品名称相同,对数据进行分组,对每组数据进行求和
SELECT pname,SUM(price) FROM productsGROUP BY pname;
例:对分组求和的结果进行过滤,只显示求和结果大于1000的商品
SELECT pname,SUM(price) s FROM productsGROUP BY pname
HAVING SUM(price)>1000;
3、多表查询(主要分为内连接、外连接、交叉连接)
3.1连接方法如下:
内连接:join,inner join
外连接:left join,left outer join,right join,right outer join,union
交叉连接:cross join
3.2 内连接
首先是内连接,使用join或者是inner join
格式如下(查询列1):select 列1,列2 from 表1 join 表2 on 表1.字段 = 表2.字段
Where条件
注意:1、两个表连接的前提是具有共同的字段,所谓共同的字段是指名称有可能相同也有可能不同,但是两个字段所表达的含义一定是一样的。
2、使用内连接的两个表,查询出来的数据是两个表共有的数据(指的是连接条件),
比如说表1中有id为1,2,3,4,表2中有id为2,3,4,5的数据那么id为表一和表二
的连接条件,查询出来的数据只有id为2,3,4的字段内容。
3.3外连接
使用left join或者left outer join(左连接)
表一与表二查询出来的结果把表一的id为1234所有数据都查询出来,表二中没有id为1的数据则用null进行代替。
使用right join或者 right outer join(右连接)
表一与表二查询出来的结果把表二的id为2345所有数据都查询出来,表1中没有id为1的数据则用null进行代替。
3.4交叉连接
格式:select 表一.字段1,表一.字段2,表二.字段1,表二.字段2 from 表一 cross join表二 where 条件
在什么时候使用交叉连接,示例如下:
某些情况下,用于 寻找连续日期中残缺的数据 的时候,可以先笛卡尔积做一个排列组合。然后和目标表进行关联,查找哪些数据缺少了。