SQL 基础知识总结(1)

Wesley13
• 阅读 283

终于可以静下心来系统看一下SQL的东西,为了查阅方便特此记录,以下都是基于SQL必知必会教材,若能提出意见,不胜感激~~

select语句通常用于从表中检索数据,最主要的无非就是select...from...where...,然后在根据自己的需要添加一下字段、检索条件等等,如果省略了from子句后就是简单的访问和处理表达式,如select 3*2将返回6;select Now()将返回当前日期和时间

一、检索数据

检索所有列时可以使用通配符*(select * from),在不明确指定列名时可使用,在列名明确时不建议使用

select distinct prod_id,prod_name,prod_price --多个列时,列名之间加上逗号;distinct 去重,作用于其后的所有列;
from Products
limit 5 offset 5 --返回从第5行起的5行数据,这里的5不包括标题行

二、排序检索数据

排序默认是升序,降序关键字desc是descending缩写,order by 子句一定要放在where子句之后,否则会报错;多个SQL语句之间可用分号;隔开

select prod_id,prod_price,prod_name
from Products
order by prod_price,prod_name; --先按价格,然后按名称排序

select prod_id,prod_price,prod_name
from Products
order by 2,3; --按列位置排序,先按第二列排序(price),再按第三列排序(name)

select prod_id,prod_price,prod_name
from Products
order by product_price desc,prod_name --desc关键字只应用到直接位于其前面的列名,所以先以价格降序排序产品,然后产品名仍然是标准的升序排序

三、过滤数据

where子句操作符

SQL 基础知识总结(1)

select vend_id,prod_name
from Products
where vend_id <> 'DLL01' ;--列出所有不是供应商DLL01制造的产品,单引号用于限定字符串

select prod_name
from Products
where product_price is null --is null 空值检查(空product_price字段,不是价格为0)

四、高级数据过滤——操作符(用来连接或改变where子句中的子句的关键字,也成为逻辑操作符)

select prod_id,prod_price,prod_name
from Products
where vend_id = 'DLL01' and  prod_price <=4;  --and操作符,用于检索满足所有给定条件的行

select prod_id,prod_price,prod_name
from Products
where vend_id = 'DLL01' and  prod_price <=4;  --or操作符,用于检索任一给定条件的行

select prod_id,prod_price,prod_name
from Products
where (vend_id = 'DLL01' or vend_id = 'BRS01') --选择由供应商DLL01和BRS01制造的且价格在10美元及以上的所有产品
and  prod_price >= 10;  --and操作符在求值过程中优先级高于or操作符,这种情况可以用圆括号对操作符进行明确分组,即圆括号求值的优先级高于and和or操作符

select prod_id,prod_price
from Products
where vend_id in ('DLL01','BRS01') --in操作符功能与OR相同,但in更清楚,直观
order by prod_name;

select prod_name
from Products
where not vend_id = 'DLL01' --not操作符功能与<>相同,但not可以否定in、between、exists子句
order by prod_name

五、用通配符进行过滤

当数据筛选的是不确定值时,我们可以用通配符(用来匹配值的一部分的特殊字符);

通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索;

使用通配符时必须使用like操作符;

通配符可以在任意位置使用,可使用多个通配符;

在使用通配符匹配时需要注意空格问题;

如果其他操作符可以达到相同目的,不建议使用通配符;

在使用通配符时,尽量不要在开始处使用,否则搜索会变慢

select prod_id,prod_name
from Products
where prod_name like 'Fish%' ;--百分号(%)通配符,%表示任何字符出现任意次数,此语句找出所有以Fish开头的产品

select prod_id,prod_name
from Products
where prod_name like '_ inch teddy bear' ;--下划线(_)通配符,下划线通配符用途与%通配符一样,只是下划线通配符只匹配单个字符,%通配符可以匹配多个字符

select cust_contact
from Customers
where cust_contact like '[JM]%' --方括号([])通配符,方括号通配符用来指定一个字符集,[JM]匹配方阔号中任意一个字符,只能匹配单个字符
order by cust_contact;   --找出所有名字以J或M开头的联系人

select cust_contact
from Customers
where cust_contact like '[^JM]%' --方括号([])通配符可以用^来否定,找出所有名字不是以J或M开头的联系人,也可以用not操作符得出类似结果
order by cust_contact

六、创建计算字段

select concat(vend_name, '(' , vend_country, ')') --concat字段拼接,等价于+
from vendors
order by vend_name;

select rtrim(vend_name) +  '(' + rtrim(vend_country) +  ')' --trim()去掉字符串左右两边的空格,rtrim()去掉字符串右边的空格,ltrim()去掉字符串左边的空格;+等价于concat
from vendors
order by vend_name;

select rtrim(vend_name) +  '(' + rtrim(vend_country) +  ')'
         as vend_title --as关键字将字段命为别名
from vendors
order by vend_name;

select prod_id,quantity,item_price,quantity*item_price as expanded_price --expanded_price列是一个计算字段,数量*价格
from OrderItems
where order_num = 20008

七、使用函数处理数据

大多数SQL都支持文本处理函数、日期和时间处理函数、数值处理函数

1、文本处理函数

SQL 基础知识总结(1)

select vend_name,upper(vend_name) as vend_name_upcase --upper将文本转换为大写
from Vendors
order by vend_name

2、日期和时间处理函数

select order_num
from Orders
where year(order_date) = 2012 --year() 从日期中提取年份

3、数值处理函数

SQL 基础知识总结(1)

八、汇总数据

SQL聚集函数(对某些行运行的函数,计算并返回一个值)

SQL 基础知识总结(1)

#avg()函数

select avg(prod_price) as avg_price --avg()计算特定数据列的平均值,avg()函数忽略数值为NULL的行
from Products;

#count()函数

select count(*) as num_cust --count(*)对表中行的数目进行计数,不管表中是包含的是空值还是非空值
from Customers;

select count(cust_email) as num_cust --count(column)对特定列中具有值的行进行计数,忽略NULL值
from Customers;

#max()、min()函数

select max(prod_price) as max_price --max()返回指定列中的最大值;在用于文本数据时,返回按该列排序后的最后一行;max()忽略列值为NULL的行
from Products;

select min(prod_price) as max_price --min()返回指定列中的最小值;在用于文本数据时,返回按该列排序后的最前面一行;min()忽略列值为NULL的行
from Products;

#sum()函数
select sum(quantity) as items_ordered --sum函数返回指定列值的和;忽略数值为NULL的行
from OrderItems
where order_num = 20005

聚集不同值:5个聚集函数默认对所有行执行操作,若想只计算值不同的行,指定distinct参数

select avg(distinct prod_price) as avg_price --去重后求平均,distinct()函数只能用于count(),不能用于count(*)
from Products
where vend_id = 'DLL01'

今日暂时记录到这,明天继续~

点赞
收藏
评论区
推荐文章
技术小男生 技术小男生
2个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi /etc/profile2:按字母键i进入编辑模式,在最底部添加内容: JAVAHOME/opt/jdk1.8.0152 CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jar PATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
2个月前
Java面向对象试题
1、 请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。 创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现 接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿 吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
干货满满张哈希 干货满满张哈希
11个月前
由一次 UPDATE 过慢 SQL 优化而总结出的经验
最近,线上的 ETL 数据归档 SQL 发生了点问题,有一个 UPDATE SQL 跑了两天还没跑出来: update torderrecord set archiveid '420a7fe7476745e8a5f572280c192faa', updatetime updatetime where orderid in (select orderid
Wesley13 Wesley13
1年前
030 SSM综合练习06
**1.权限操作涉及的三张表** (1)用户表信息描述users ![](https://oscimg.oschina.net/oscnet/a4a2b1f943cbc2db1c8ddd613e7ed00a9ae.png) sql语句: CREATE TABLE users ( id VARCHAR2 ( 32 ) DEFAU
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
Easter79 Easter79
1年前
Twitter的分布式自增ID算法snowflake (Java版)
概述 == 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。 有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。 而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Wesley13 Wesley13
1年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。 表结构 : 为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。   SQL:    1.SELECT    2
Easter79 Easter79
1年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用 0x00 SQL注入 ---------- 反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下 1)表名 payload:select \* from \`users\` where user\_id=1 limit 0,1; ![](https://o
helloworld_34035044 helloworld_34035044
4个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为