SQL 基础知识总结(1)

Wesley13
• 阅读 621

终于可以静下心来系统看一下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'

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这