Java面向对象系列[v1.0.0][SQL语法之基础查询]

本文介绍了SQL中的select语句用于单表查询的基本用法,包括选择列、使用算数运算符、条件过滤、别名设置、排序及去除重复项。示例展示了如何结合比较运算符、通配符和逻辑运算符进行复杂查询。同时强调了运算符优先级和使用orderby子句进行结果排序的重要性。

单表查询

select语句的功能就是查询数据,select语句也是SQL语句中功能最丰富的语句,单表查询,多表联合查询,子查询,本质上它就是用于从一个或者多个数据表中选出特定行、特定列的交集
语法如下:

select column1, column2... from 数据源
[where condition]

数据源可以是表或者视图等

例句:

select davieyang_name from davieyang_test where davieyang_id >3;

当使用select语句进行查询时,还可以在select语句中使用算数运算符(+,-,*,/),通过算数表达式来完成查询,其规则如下:

  • 对数值型数据列、变量、常量可以使用算数运算符(+,-,*,/)创建表达式
  • 对日期型数据列、变量、常量可以使用部分算数运算符(+,-)创建表达式,两个日期之间可以进行减法运算,日期和数值之间可以进行加、减运算
  • 运算符不仅可以在列和常量、变量之间进行运算,也可以在两列之间进行运算

无论从哪个角度来看,数据列都像一个变量,只是这个变量的值具有指定的范围,逐行计算表中的每条记录时,数据列的值依次变化,因此能使用变量的地方,基本上都可以使用数据列

select davieyang_id + 5 from davieyang_test;
select * from davieyang_test where davieyang_id * 3 > 4;

select 后的不仅可以是数据列,还可以是表达式,还可以是变量、常量等

# 数据列实际上可当成一个变量
select 3*5, 20 from davieyang_test;

SQL语句中算术运算符的优先级与JAVA中的运算符优先级完全相同,乘除高于加减,同级运算从左到右,使用括号可改变优先级的运算顺序
MySQL中没有提供链接运算符,无法用+号将字符串常量、字符串变量或者字符串链接起来,而是使用concat函数来进行字符串链接运算

select concat(davieyang_name, 'xxx') from davieyang_test;

对于数据库而言,如果让字符串和null进行连接运算,它会把null当成空字符串处理


如果不希望直接使用列名作为列标题,则可以为数据列或者表达式起个别名,为数据列或表达式起别名时,别名紧跟数据列,中间以空格隔开,或者使用as关键字隔开

select davieyang_id + 5 as DY_ID from davieyang_test;

如果列别名中使用特殊字符,或者需要强制大小写敏感,都可以通过为别名添加双引号来实现

select davieyang_id + 5 "DY'id" from davieyang_test;

除了给列或者表达式起别名还可以为表起别名,语法完全一样

selct davieyang_id+5 as DY_ID, davieyang_name from davieyang_test as DT

列名可以当成变量处理,因此运算符也可以在多列之间进行运算

select davieyang_id+5 DY_ID, concat(davieyang_name, davieyang_id) davieyang_name from davieyang_test where davieyang_id *2 >3;
select 5+4 from davieyang_test where 2<9;
mysql> select 5+4
    -> from davieyang_test
    -> where 2<9;
+-----+
| 5+4 |
+-----+
|   9 |
+-----+
1 row in set (0.06 sec)

mysql> select * from davieyang_test;
+---------+-----------+------------+-----------+--------------------+---------------------+
| test_id | test_name | test_price | test_desc | test_img           | test_date           |
+---------+-----------+------------+-----------+--------------------+---------------------+
|       1 | davieyang |         10 | davieyang | 0x70617468         | 2020-09-25 00:00:00 |
+---------+-----------+------------+-----------+--------------------+---------------------+
1 row in set (0.02 sec)

对于选择常量的情况,指定数据表实际没有意义,MySQL提供了一种扩展语法,允许select语句后没有from子句,即select 4 + 5;但如此写法并不是标准SQL,在Oracle中提供了一个名为dual的虚表,新版本的MySQL也支持dual虚表,它没有实际意义,仅作为from后的占位符,因此SQL可以改写为select 4 + 5 from dual;

select语句会把符合条件的所有语句都查询出来,可以使用distinct关键字去重

select distinct davieyang_name, davieyang_description from davieyang_test;

distinct的作用是判断被查询的列是否重复,如果重复则去掉,而不是判断整条记录是否重复

where子句包含的是一个条件表达式,所以可以使用>、>=、<、<=、=和<>等基本的比较运算符,SQL中的比较运算符不仅可以比较数值之间的大小,也可以比较字符串、日期之间的大小;SQL中判断两个值是否相等的比较运算符是单等号,判断不相等的运算符是<>;SQL中的赋值运算符不是等号,是冒号等号

此外还有一些比较运算符
在这里插入图片描述

select * from davieyang_test where davieyang_id between 2 and 4;
select * from davieyang_test where 2 between davieyang_id and davieyang_age;

select * from davieyang_test where davieyang_id in (2,4);
select * from davieyang_test where 2 in (davieyang_id, davieyang_age);

# 通配符百分号代表任意多个字符,下划线代表任意一个字符
select * from davieyang_test where davieyang_name like 'd%';
select * from davieyang_test where davieyang_name like '__';
select * from davieyang_test where not davieyang_name like '\_%';
# 转义
select * from davieyang_test where davieyang_name like '\_%'

标准SQL语句并没有提供反斜线的转义字符,而是使用escape关键字显式进行转义

# 在标准的SQL中选出所有名字以下划线开头的学生
select * from davieyang_test where davieyang_name like '\_' escape '\';

is null 用于判断某些值是否为空,判断是否为空不能用=null,在SQL中null=null返回null

select * from davieyang_test where davieyang_name is null;
select * from davieyang_test where davieyang_name is null and davieyang_description like '__' and davieyang_id >3;

当使用比较运算符、逻辑运算符来链接表达式时,必须注意运算符优先级
在这里插入图片描述
如果要改变优先级的默认顺序,可使用括号,括号的优先级比所有的运算符都高

select * from davieyang_test where (davieyang_id>3 or davieyang_name > '杨') and davieyang_age>1;

执行查询后的结果默认按照插入顺序排列,如果需要查询结果按某列值的大小进行排序,则可以使用order by子句

order by column_name [desc], column_name2 ...

进行排序时默认按升序排列,如果强制按降序排列,则需要在列后使用desc关键字,对应的正序排列是asc关键字,默认就是正序
语法中设定排序列时可以采用列名,列序号,列别名

select * from davieyang_test order by davieyang_name;

如果需要按多列进行排序,则每列的asc、desc都必须单独设定,并且第一个排序列是首要拍序列,只有当第一列种存在相同的值时,第二个排序列才会起作用

select * from davieyang_test order by davieyang_name desc, davieyang_id;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Davieyang.D.Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值