MySQL - SQL数据查询

SQL数据查询

一、语法格式

select 字段列表|* from 表名
[where 搜索条件]
[group by 分组字段 [having 分组条件]]
[order by 排序字段 排序规则]
[limit 分页参数];

二、检索数据select

1.检索单个列:

select name from users;
如果没有明确排序查询结果,则返回的数据的顺序没有特殊意义。
返回数据的顺序可能是数据被添加到表中的顺序,也可能不是。只要返回相同数目的行,就是正常的。

2.检索多个列:

select id,name,phone from users;
在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加。
如果在最后一个列名后加了逗号,将出现错误。

3.检索所有列:

select * from users;
使用通配符,一般来说,除非你确实需要表中的每个列,否则最好不要使用 * 通配符。
虽然使用 * 通配符省事,不用明确列出所需列,但检索不需要的列通常会降低检索和应用程序的性能。
使用通配符有一大优点,由于不明确指定列名,所以能检索出名字未知的列。

4.检索不同的行DISTINCT:

select distinct id from users;
DISTINCT关键词用于指示MySQL只返回不同的值,DISTINCT应用于所有列而不仅是前置它的列。
如果检索多个列前置DISTINCT,除非指定的所有列都不同,否则所有行都会被检索出来。

5.限制结果LIMIT:

select * from users limit 3,4;
LIMIT 3,4的含义是跳过前3行然后取4行数据(第4-7行),也可以写成LIMIT 4 OFFSET 3。LIMIT 4的含义为从第1行开始取4行(第1-4行)。LIMIT常用于分页。

6.使用完全限定的表名:

select name from users;
select users.name from users;
select users.name from mingdan.users;

三、对检索数据进行排序order by

1.按单个列排序:

select * from users order by age;
默认查询出的数据并不是随机排序的,如果没有指定排序,数据一般以它在底层表中出现的顺序显示。
关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义。
通常,ORDER BY子句中使用的列将视为显示所选择的列。
但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。

2.按多个列排序:

select * from users order by id,age;
在需要对多列数据进行排序时,使用逗号分隔列名,并会按照前后顺序依次对比排序。
order by的排序默认升序,可以使用DESC设置降序排列。
select * from users order by id,age DESC;
以上语句就是先对id进行升序排序,然后在结果中对age进行降序排序。

3.注意:

ORDER BY子句的位置,在给出ORDER BY子句时,应该保证它位于from子句之后。
如果使用LIMIT,它必须位于ORDER BY之后。使用子句的次序不对将产生错误消息。

四、数据检索条件过滤where

1.WHERE子句介绍:

数据库中一般包含大量的数据,很少需要检索表中所有行。
通常只会根据特定操作和报告的需要提取表数据的子集。
只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。
select name from users where age = 22;
在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。

2.WHERE子句操作符:

= :等于
<> 或 != :不等于
< :小于
<= :小于等于
> :大于
>= :大于等于
BETWEEN… and… :指定两个值之间(前后包含)
IS NULL :空值

3.组合WHERE子句:

MySQL允许给出多个WHERE子句。
这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用,也称为逻辑操作符。
select name from users where age = 22 and sex = ‘m’;
AND用在WHERE子句中的关键字,用来指示检索所有给定条件的行。
select name from users where age = 22 or sex = ‘m’;
OR用来表示检索匹配任意给定条件的行。

4.AND与OR:

WHERE可包含任意数目的AND和OR操作符,允许两者结合以进行复杂和高级的过滤。在使用过程中要注意SQL优先处理AND操作符,而后处理OR操作符,如果需要提高优先级则需要加上圆括号。

#查询users表中age>22的数据
select * from users where age > 22;
#查询users表中name=某个条件值的数据
select * from users where name = '王五';
#查询users表中年龄在22到25之间的数据
select * from users where age >= 22 and age <= 25;
select * from users where age between 22 and 25;
#查询users表中年龄不在22到25之间的数据
select * from users where age < 22 or age > 25;
select * from users where age not between 22 and 25;
#查询users表中年龄在22到25之间的女生信息
select * from users where age >= 22 and age <= 25 and sex = '女';
#查询users表中年龄为22或25的女生信息
select * from users where (age=22 or age = 25) and sex = '女';
5.IN与NOT:

IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。
select name from users where id in(1,2,3);
IN WHERE子句用来指定要匹配值的清单的关键字,功能与OR相当。
那么,为什么要使用IN操作符呢?它的优点如下。
在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
IN操作符一般比OR操作符清单执行更快。
IN的最大优点是可以包含其他SELECT语句,使得能够更动态的建立WHERE子句。
NOT WHERE子句用来否定后跟条件的关键字。
select name from users where id not in(1,2,3);
为什么使用NOT?对于简单的WHERE子句,使用NOT确实没有什么优势。
但是在更复杂的子句中,NOT是非常有用的。
例如:在与IN操作符联合使用时,NOT使找出与条件列表不匹配的行非常简单。

五、通配符的使用

1.LIKE与通配符:

前面介绍的所有操作符都是针对已知值进行过滤的。
但是,这种过滤方法并不是任何时候都好用。
例如,怎样搜索产品名中包含某文本的所有产品?用简单的比较操作符显然不行,必须使用通配符。
为在搜索子句中使用通配符,必须使用LIKE操作符。
LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
百分号(%)通配符:
在搜索串中,%表示任何字符出现任意次数。

#查询users表中name以a字符开头的数据
select name from users where name like 'a%';
#查询users表中name以a字符结尾的数据
select name from users where name like '%a';
#查询users表中name包含a字符的数据
select name from users where name like '%a%';

下划线(_)通配符:
用途和%类似,但每个下划线只匹配单个字符而不是多个字符。
使用通配符的技巧:
虽然MySQL通配符很有用,但通配符搜索的处理一般要比前面讨论的其它搜索所花的时间更长,因此不要过度使用通配符,如果其它操作符能达到相同的目的,应该使用其它操作符。在确实需要使用通配符时,除非有必要,否则不要把它们用在搜索模式的开始处,因为把通配符置于搜索模式的开始处,搜索起来是最慢的。除此之外,还要仔细注意通配符的位置,如果放错地方,可能不会返回想要的数据。

2.正则REGEXP:

所有种类的程序设计语言、文本编辑器、操作系统等都支持正则表达式。
select name from users where name regexp ‘[0-5]abc’;

六、字段的计算

存储在数据表中的数据一般不是应用程序所需要的格式。
例如:如果想在一个字段中既显示用户名,又显示班级号,但这两个信息一般包含在不同的表列中。
同时姓名、手机号和地址存储在不同的列中(应该这样),但快递单打印程序却需要把它们作为一个恰当格式的字段检索出来。
列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。
物品订单表存储物品的价格和数量,但不需要存储每个物品的总价格(用价格乘以数量即可)。为打印发票,需要物品的总价格。
需要根据表数据进行总数、平均数计算或其它计算。
计算字段并不实际存在于数据库表中,计算字段是运行时在SELECT语句内创建的。

1.拼接Concat:

users表包含用户名和手机号码信息。假如要生成一个学生报表,需要在学生的名字中按照name(phone)这样的格式列出,解决办法是把两个列拼接起来。在MySQL的SELECT语句中,可使用Concat()函数来拼接两个列。
select concat(name,’(’,phone’)’) from users;

2.使用别名As:

SELECT语句拼接字段可以完成。但此新计算列的名字是什么呢?实际上它并没有名字,只是一个值。
如果仅在SQL查询工具中查看一下结果,这样没有什么不好。
但是,一个未命名的列不能用于客户机应用中,因为客户机没有办法引用它。
为了解决这个问题,SQL支持列别名。别名(alias)是一个字段或值的替换名。别名用AS关键词赋予。
select concat(name,’(’,phone’)’) from users as name_phone from users;

七、函数的使用

与其它大多数计算机语言一样,SQL支持利用函数来处理数据。
函数一般是在数据上执行的,它给数据的转换和处理提供了方便。

1.文本处理函数:

Left() :返回串左边的字符
Length() :返回串的长度
Locate() :找出串的一个子串
Lower() :将串转换为小写
LTrim() :去掉串左边的空格
Right() :返回串右边的字符
RTrim() :去掉串右边的空格
SubString() :返回子串的字符
Upper() :将串转换为大写
Concat() :拼接字符串

#查询users表中所有name的数据,并返回每个name的前2个字符
select left(name,2) from users;
#从字符串的第1位开始返回2个字符
select substring('abcdef',1,2); #ab
#字符串拼接
select concat('aa','+++','bb'); #aa+++bb
2.日期和时间处理函数:

AddDate() :增加一个日期(年、月、日)
AddTime() :增加一个时间(时、分、秒)
CurDate() :返回当前日期
CurTime() :返回当前时间
Date() :返回日期时间的日期部分
DateDiff() :计算两个日期之差
Date_Add() :高度灵活的日期运算函数
Date_Format() :返回一个格式化的日期或时间串
Day() :返回一个日期的天数部分
DayOfWeek() :对于一个日期,返回对应的星期几
Hour() :返回一个时间的小时部分
Minute() :返回一个时间的分钟部分
Month() :返回一个日期的月份部分
Now() :返回当前日期和时间
Second() :返回一个时间的秒部分
Time() :返回一个日期时间的时间部分
Year() :返回一个日期的年份部分

select now();
select date(now());
select time(now());
select addtime(now(),'2:2:2');
select adddate(now(),5);
select datediff(curDate(),'2020-09-20');
3.数值处理函数:

Abs() :返回一个数的绝对值
Cos() :返回一个角度的余弦
Exp() :返回一个数的指数值
Mod() :返回除操作的余数
Pi() :返回圆周率
Rand() :返回一个随机数
Sin() :返回一个角度的正弦
Sqrt() :返回一个数的平方根
Tan() :返回一个角度的正切

八、聚集函数与分组group by

1.聚集函数的使用:

我们经常需要汇总数据而不是把它们实际检索出来,为此MySQL提供了专门的函数。
使用这些函数,MySQL查询可用于检索数据,以便分析和报表生成。
例如:确定表中行数(或者满足某个条件或包含某个特定值的行数);获得表中行组的和;找出表列(或所有行或某些特定的行)的最大值、最小值和平均值。
上述例子都需要对表中数据(而不是实际数据本身)汇总。
因此,返回实际表数据是对时间和处理资源的一种浪费。
COUNT() :返回某列的行数
MAX() :返回某列的最大值
MIN() :返回某列的最小值
SUM() :返回某列值之和
AVG() :返回某列的平均值
注意:在使用count时,如果指定列名,则指定列的值为空的行被忽略,但如果count()函数中用的是星号(*),则不会忽略。

select count(*) from users;
select count(sex) from users;
select count(id),max(age),min(age),sum(age),avg(age) from users;
select count(id) as num,max(age) as max_age,min(age) as min_age from users; #起别名
select count(id) num,max(age) max_age,min(age) min_age from users; #as也可以省略
2.数据分组GROUP BY:

SQL聚集函数可用来汇总数据。这使我们能够对行进行计数、计算和平均数,获得最大和最小值而不用检索所有数据。
目前为止的所有计算都是在表的所有数据或匹配特定的WHERE子句的数据上进行的。
例如我们需要获取某个班级的学生人数:
select count(*) as nums from users where class_id = 2;
但如果要返回每个班级的人数怎么办?
此时就需要使用分组,分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。
select class_id,count(*) as nums from users group by class_id;
那么,如果需要返回人数少于5人或大于5人的班级怎么办?

3.过滤分组HAVING:

除了能用GROUP BY分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。
例如:需要获取班级人数小于等于5人的班级。
事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。
唯一的差别是WHERE过滤行,而HAVING过滤分组。
select class_id,count(*) as nums from users group by class_id;
select class_id,count(*) as nums from users group by class_id having nums >= 5;

4.使用GROUP BY的注意点:

在使用group by进行分组时,按照标准的SQL模式,需要把select查询中的所有列(除了聚集函数外)全部都列在group by后面。

要下载Flink SQL Connector for MySQL CDC,您可以按照以下步骤进行操作: 1. 首先,您需在您的项目中添加Flink SQL Connector for MySQL CDC的依赖项。可以使用Maven或Gradle构建工具来完成这一步骤。在您的项目配置文件中,将以下代码添加到依赖项部分: ``` <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-sql-connector-mysql-cdc_2.11</artifactId> <version>1.13.1</version> </dependency> ``` 2. 在使用Flink SQL Connector for MySQL CDC之前,您需要确保已经安装并启动了Flink集群。您可以从Flink官方网站下载并按照安装说明进行安装。 3. 下一步是配置MySQL的Change Data Capture (CDC)。您可以在MySQL的配置文件中启用CDC功能,并配置要监视的数据库表。具体配置项可能会因MySQL版本而有所不同,您可以参考MySQL的官方文档或相关教程进行操作。 4. 配置完CDC后,您可以使用Flink的Table API或SQL语句来读取CDC的数据。可以使用`TableEnvironment`对象来创建与MySQL CDC连接,并定义CDC表。以下是一个示例代码片段: ```java // 创建Flink Table环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env); // 注册MySQL CDC Connector String ddl = "CREATE TABLE mysql_cdc_table (..., PRIMARY KEY (id)) " + "WITH (...properties...) "; tableEnv.executeSql(ddl); // 查询CDC数据 String query = "SELECT * FROM mysql_cdc_table"; Table result = tableEnv.sqlQuery(query); // 打印查询结果 tableEnv.toRetractStream(result, Row.class).print(); // 执行作业 env.execute(); ``` 这样,您就可以下载、配置和使用Flink SQL Connector for MySQL CDC来处理MySQL的Change Data Capture数据了。若需要进一步了解和使用该连接器的更多功能,建议参考官方文档或相关教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值