![07352744124dcac4499e9f4302deea22.gif](https://img-blog.csdnimg.cn/img_convert/07352744124dcac4499e9f4302deea22.gif)
本篇使用的数据库管理工具是Navicat for MySQL,回复公众号【SQL】可获取本篇使用的3个数据源表。
本篇以3个数据源表table1,table2,table3为例,简单举例陈述SQL中数据查询语言的使用。
0 1 DB、DBMS与SQLDB(Database),即数据库,相当于一个仓库,用于有组织地存储数据。
DBMS(Database Management System),即数据库管理系统,用于操作和管理数据库。主要分为两大类:RDBMS、NoSQL。
RDBMS:关系型数据库管理系统,主要实现对结构化数据的管理,为二元关系模型。如Oracle、MySQL、SQL Server、DB2等。
NoSQL:非关系型数据库管理系统,弥补关系型数据库管理系统的不足。如Redis、MongoDB等。
SQL(Structured Query Language),即结构化查询语言,是关系型数据的一门通用语言,用于实现对数据库的查询、更新和管理。其语言主要分为四个部分:DDL、DML、DCL和DQL。
DDL(Data Definition Language),数据定义语言,它用来定义我们的数据库对象,包括数据库、数据表和列。通过使用DDL,我们可以创建、删除和修改数据库及表结构。
DML(Data Manipulation Language),数据操作语言,我们用它操作和数据库相关的记录,比如增加、删除、修改数据表中的数据。
DCL(Data Control Language),数据控制语言,我们用它来定义访问权限和安全级别。
DQL(Data Query Language),数据查询语言,我们绝大多数情况下都是在和查询打交道,因此学会编写正确且高效的查询语句非常重要。
select * from table1;
Navicat for MySQL运行结果如下:
![e738138c9355c1807d016944f76a451b.png](https://img-blog.csdnimg.cn/img_convert/e738138c9355c1807d016944f76a451b.png)
select 股票简称,现价 from table1;
Navicat for MySQL运行结果如下
:
![5932c6be7f09c64c7753677bfec0c8c1.png](https://img-blog.csdnimg.cn/img_convert/5932c6be7f09c64c7753677bfec0c8c1.png)
select * from table1 where ROE均值 >30;
Navicat for MySQL运行结果如下
:
![e097669a046370b6edfc316bacb5b45f.png](https://img-blog.csdnimg.cn/img_convert/e097669a046370b6edfc316bacb5b45f.png)
select * from table1 where
ROE均值 > 30 and
毛利率均值 >40 and
净利润现金含量均值 > 100 and
资产负债率均值 <60 ;
Navicat for MySQL运行结果如下
:
![3c0e725ae90f59b8ce1dcb1496b2e2d9.png](https://img-blog.csdnimg.cn/img_convert/3c0e725ae90f59b8ce1dcb1496b2e2d9.png)
select * from table1 where
股票简称='贵州茅台' or
股票简称='海天味业';
Navicat for MySQL运行结果如下
:
![26497945838455a72fd0a4161e34fbfd.png](https://img-blog.csdnimg.cn/img_convert/26497945838455a72fd0a4161e34fbfd.png)
select * from table1 where
ROE均值 between 30 and 35;
Navicat for MySQL运行结果如下
:
![9f4240aa674f84a50cd75940ad475e9e.png](https://img-blog.csdnimg.cn/img_convert/9f4240aa674f84a50cd75940ad475e9e.png)
select * from table1 where
上市年数 in ('3年','4年','5年');
Navicat for MySQL运行结果如下
:
as可省略
select column1 as name1,column2 as name2,... from table_name;
select column1,column2 from table_name as name
select 股票代码 as 代码,股票简称 as 股票 from table1;
Navicat for MySQL运行结果如下
:
![13211da50e1935149cebc6cdcc24db78.png](https://img-blog.csdnimg.cn/img_convert/13211da50e1935149cebc6cdcc24db78.png)
select distinct 上市年数 from table1;
Navicat for MySQL运行结果如下:
select * from table_name where column is null
select * from table_name where column is not null
select * from table1 where 现价 is null;
Navicat for MySQL运行界面如图所示:
select * from table1 where
股票简称 like '%新材';
Navicat for MySQL运行结果如下
:
select * from table1 order by ROE均值 desc;
Navicat for MySQL运行结果如下
:
select * from table1 limit 5;
Navicat for MySQL运行结果如下
:
![2babd588d92eccd0f3e5ae7c835eb8bf.png](https://img-blog.csdnimg.cn/img_convert/2babd588d92eccd0f3e5ae7c835eb8bf.png)
select 上市年数,avg(ROE均值) from table1 group by
上市年数;
Navicat for MySQL运行结果如下
:
![17e97665b756708e405a66465b17fb23.png](https://img-blog.csdnimg.cn/img_convert/17e97665b756708e405a66465b17fb23.png)
select 上市年数,avg(ROE均值) from table1 group by
上市年数 having avg(ROE均值)>30;
Navicat for MySQL运行结果如下
:
![c2befc32af9f0522ebec185aa35f9ed0.png](https://img-blog.csdnimg.cn/img_convert/c2befc32af9f0522ebec185aa35f9ed0.png)
②inner join ... on ...
select * from table_name1
inner join
table_name2
on
table_name1.column = table_name2.column
select * from table1,table2 where
table1.股票代码=table2.股票代码;
或
select * from table1 inner join
table2 on
table1.股票代码=table2.股票代码;
Navicat for MySQL运行结果如下:
table1有35条数据,table2有31条数据,两表中“股票代码”列相同的值只有31条,所以最后展示出来的只有31条数据。使用条件where和inner join ... on ... 结果相同,只不过最终会显示两个相同的列,若是想要合并该列,可使用以下第3种方法。
③合并列:inner join ... using ...
select * from table_name1
inner join
table_name2
using(column)
select * from table1inner join
table2 using(股票代码);
Navicat for MySQL运行结果如下:
内连接的方法只能将列中相同的值的行数据合并在一起,如果想要合并更多的行数据,可以使用外连接。
2)外连接:以其中一张表为驱动表,与另外一张表的每条记录进行匹配,如果能够匹配则进行关联并展示,如果不能匹配则以null填充。
①左外连接:left join ... on
select * from table_name1
left join
table_name2
on
table_name1.column = table_name2.column
select * from table1 left join
table2 on
table1.股票代码=table2.股票代码;
Navicat for MySQL运行结果如下:
以table1为驱动表,table1有35条数据,table2有31条数据,table1最后几条比table2多的数据的剩余值将以null进行填充。
②右外连接:right join ... on
select * from table_name1
right join
table_name2
on
table_name1.column = table_name2.column
select * from table1 right join
table2 on
table1.股票代码=table2.股票代码;
Navicat for MySQL运行结果如下:
以table2为驱动表,table1有35条数据,table2有31条数据,结果以table2为准只查询出31条数据。
3)自连接
select * from table_name1 name1
left join
table_name1 name2
on
name1.column1 = name2.column2
与外连接同理,在同一张表中进行匹配,如果能够匹配的则进行关联并展示,不能匹配的则以null填充。
17.组合查询 (union)1)去除重复值
select * from table_name1
union
select * from table_name2
select * from table1
union
select * from table3;
Navicat for MySQL运行结果如下:
table1有35条数据,table2在table1的基础上增加了16条共51条数据,使用union将两张表进行组合会去除其重复值,最后只显示51条数据。
2)保留重复值:
select * from table_name1
union all
select * from table_name2
select * from table1
union all
select * from table3;
Navicat for MySQL运行结果如下:
union all保留了两张表中共有的数据,所以最后显示有86条数据。
![c1d46c54fe32b715886fde8e70c40509.png](https://img-blog.csdnimg.cn/img_convert/c1d46c54fe32b715886fde8e70c40509.png)
![c0b8223b681c12e8ba14b542fffb9614.gif](https://img-blog.csdnimg.cn/img_convert/c0b8223b681c12e8ba14b542fffb9614.gif)