数据分析之SQL来了

332 阅读11分钟

SQL入门知识

关系型数据库管理系统( RDBMS) 与结构化查询语言 (SQL)

数据库是存储、调用、分析数据的仓库,主要分为关系型数据库与非关系型数据库两类

  • 关系数据库是数据库应用的主流
  • 关系型数据库以行和列的形式存储数据,这一系列的行和列被称为表,一组表组成了数据库。
  • 当前主流的关系型数据库有Oracle、DB2、Microsoft SQL Server、 MySQL 等。

操作关系型数据库时使用的语言叫结构化查询语言,简称SQL结构化查询语言。

  • MySQL是最流行的关系型数据库管理系统之一
    • 数据库:数据库是表的集合,带有相关的数据。
    • 表:一个表是多个字段的集合。
    • 字段:一个字段是一 列数据,由字段名和记录组成。
  • 在商业数据分析中使用的绝大部分数据都来自于企业数据库
  • 数据库负责数据收集、数据整合、数据调用等工作
  • 几乎所有数据分析类工具都支持调用数据库中数据

数据库操作

MySQL5.7.26+Navicat Premium15

创建数据库是指在数据库系统中划分一定的空间用来存储相应的数据

  • 创建数据库: create database 数据库名称;

例:创建名为test的测试数据库

create database test;

分号在SQL中是指语句终止符

  • 查看创建好的数据库:show create database 数据库名称;

例:查看创建好的test数据库

show create database test;

  • 查看所有数据库列表:show databases;

  • 使用数据库:use 数据库名称;

例:使用创建好的test数据库

use test;

  • 删除数据库:drop database 数据库名称;

例:删除创建好的test数据库

drop database test;

数据表操作

数据表

  • 数据库是由多个数据表构成的
  • 每张数据表存储多个字段
  • 每个字段由不同的字段名及记录构成,每个字段有自己的数据结构及约束条件

上图表示的是一个名为GoodsColor的表的详细信息,该表格中有四个字段,分别是ColorID、ColorNote、ColorSort和pt,这四个字段的数据类型分别是四个字节的可变长文本型(VARCHAR(4))、二十个字节的可变长文本型(VARCHAR(20))、整型(INT)和九个字节的可变长文本型(VARCHAR(9)),后面是各个数据字段的约束条件,数据表为了能在最大程度上保证数据资源的准确,完整以及高效利用,在数据表中必须严格规定每个字段的相关属性,无论是字段的数据类型还是字段的约束条件都要严谨对对待

想要在数据库中填充数据,必须先有重载数据的容器,这个容器就是数据表

  • 创建数据表:create table 表名(..);

例:用SQL语句创建以下员工信息表

create table emp(depid char(3),depname varchar(20),peoplecount int);

  • 查看表是否创建成功:show tables;

  • 删除数据表:drop table emp;

数据类型

数据表中的数据类型就好像是数据表中字段上的锁,字段的数据类型只有与其相匹配的数据信息才能录入到字段中,这样可以保证字段的完整性及准确性。

image.png

“位”与“字节”

  • 位:"位(bit)" 是电子计算机中最小的数据单位。每一位的状态只能是0或1。
  • 字节:8个二进制位构成1个"字节(Byte)", 它是存储空间的基本计量单位。
  • 数据类型:不同的数据类型具有不同的字节长度。字节长度越长能取值的数值区间也就越大。

一个INT整数型数据占用四个字节长度,有符号大小21474836482147483647-2147483648\sim2147483647 ,无符号大小042949672950\sim4294967295

MySQL中的数据类型

整数型

五种数值类型

每种数据的取值范围和最大显示宽度是不一样的。我们可以手动设置最大显示宽度

注意:所设置的数值只代表显示宽度,并不能限制这个数据类型实际的取值范围和占用空间

  • INT:有符号的和无符号的。有符号大小21474836482147483647-2147483648\sim2147483647 ,无符号大小042949672950\sim4294967295。最大显示宽度为11
int(11)
  • TINYINT:有符号的和无符号的。有符号大小128127-128\sim127,无符号大小为0~255。最大显示宽度为4
tinyint(4)
  • SMALLINT:有符号的和无符号的。有符号大小3276832767-32768\sim32767,无符号大小为0655350\sim65535。最大显示宽度为6
smallint(6)
  • MEDIUMINT:有符号的和无符号的。有符号大小83886088388607-8388608\sim8388607,无符号大小为0167772150\sim16777215。最大显示宽度为9
mediumint(9)
  • BIGINT:有符号的和无符号的。最大显示宽度为20
bigint(20)

注:在指定字段数据类型时如果在数据类型后加上UNSIGNED属性可以禁止负数

小数型

小数型数据也可以通过添加括号指定小数型数据的显示宽度(M)和小数位数(D)

三种数值类型

  • FLOAT(M,D):只能为有符号的。4字节,默认为(10,2)
  • DOUBLE(M,D):只能为有符号的。8字节,默认为(16,4)
  • DECIMAL(M,D):只能为有符号的。

日期和时间型

用于存储日期的一类数据

  • DATE:YYYY-MM-DD格式,在1000-01-01和9999-12-31之间。例如: 1973-12-30
  • EDATETIME:XYYY-MM-DD HH:MM:SS格式,位于1000-01-01 00:00:00和9999-12-31 23:59:59之间。例如: 1973-12-30 15:30:00
  • TIME:以HH:MM:SS格式,-838:59:59~838:59:59
  • TIMESTAMP:称为时间戳,在1970-01-01 00:00:00和2037-12-31 23:59:59之间。例如,1973年12月30日下午15:30,则在数据库中存储为:19731230153000
  • YEAR(2|4):以2位或4位格式存储年份值。如果是2位,19702069; 如果是4位,19012155。默认长度为4

字符型

字符型数据是最常用的数据类型之一,使用字符型数据时我们应该注意的一点是字符的长度应该要比我们实际输出的字段最长的长度要大(特别是varchar类型),这样才可以更好的保存我们的数据

  • CHAR(M):固定长度字符串,长度为1-255。 如果内容小于指定长度,右边填充空格。如果不指定长度,默认为1
  • VARCHAR(M):可变长度字符串, 长度为1-255。定义该类型时必须指定长度

选择CHAR还是VARCHAR?

  1. 如果我们知道所需要储存的字段长度相同,我们选择CHAR类型的数据节省空间,但是如果输入的字符长度不一致则需要选择VARCHAR避免CHAR预留的空间过大造成更多的空间浪费
  2. 如果字段长度出入不大的时候,使用CHAR会比VARCHAR效率更高,因为CHAR是固定长度,在处理固定长度的字符的时候运行效率会更高
  • BLOB或TEXT:最大长度65535。存储二进制大数据,如图片。不能指定长度。

    • 两者区别:BLOB大小写敏感
  • TINYBLOB和TINYTEXT:最大长度255。不能指定长度。

  • MEDIUMBLOB或MEDIUMTEXT:最大长度16777215字符

  • LONGBLOB或LONGTEXT:最大长度4294967295字符

  • ENUM:枚举。例如:ENUM('A','B','C')。 NULL值也可

约束条件

我们在创建数据表时,除了指明字段数据类型,还要指明约束条件才完整

  • 约束是在表上强制执行的数据检验规则
  • 用来保证创建的表的数据完整和正确

如果说不同的数据就像是不同大小的沙粒,而字段就是重载这些沙粒的容器,那么约束条件就是容器上的筛子,只有符合约束条件的数据才能加入到字段中

MySQL数据库常用约束条件

主键约束

主键约束:保证表中每行记录都不重复

主键,又称为”主码”,是数据表中一列或多列的组合。主键约束要求主键列的数据必须是唯一的,并且不允许为空。使用主键,能够惟一地标识表中的一条记录,还可以加快数据库查询的速度

主键分为两种类型:

  • 单字段主键
create table emp(depid char ( 3 ) primary key, depname varchar(20), peoplecount int);
  • 多字段联合主键
create table emp(depid char(3), depname varchar(20), peoplecount int, primary key(depname,depid) );

我们可以通过desc关键字对表字段进行约束条件的查询

desc emp;

非空约束

非空约束:指的是字段的值不能为空

语法:字段名 字段类型 not null

create table emp(depid char(3) primary key, depname varchar(20) not  null, peoplecount int);

唯一性约束

唯一性约束:要求该列的值必须是唯一的:

  • 允许为空,但只能出现一个空值
  • 一个表中可以有多个字段声明为唯一的
  • 唯一约束确保数据表的一列或几列不出现重复值

语法:字段名 数据类型 unique

create table emp(depid char(3) primary key, depname varchar(20) not null, peoplecount int unique);

唯一性和主键的区别:

  1. 主键约束(PRIMARY KEY)

    1. 主键用于唯一地标识表中的每一条记录,可以定义一列或多列为主键。
    2. 是不可能(或很难)更新.
    3. 主键列上没有任何两行具有相同值(即重复值),不允许空(NULL).
    4. 主健可作外健,唯一索引不可;
  2. 唯一性约束(UNIQUE)

    1. 唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问某行的可选手段,一个表上可以放置多个唯一性约束.
    2. 只要唯一就可以更新.
    3. 即表中任意两行在 指定列上都不允许有相同的值,允许空(NULL).
    4. 一个表上可以放置多个唯一性约束

默认约束

默认约束:指定某个字段的默认值:

当插入记录时如果没有明确为字段赋值时,那么系统就会自动为这个字段赋值为默认约束设定的值

语法:字段名 数据类型 default 默认值

create table emp(depid char(3) primary key, depname varchar(20) default '-',  peoplecount int unique);

自增字段

自增字段:一个表只能有一个自增字段,自增字段必须为主键的一部分。默认情况下从1开始自增

例:创建含各种约束条件的数据表

CREATE TABLE example(id INT PRIMARY KEY AUTO_INCREMENT, # 创建整数型自增主键
  name VARCHAR(4) NOT NULL, # 创建非空字符串字段
  math INT DEFAULT 0, # 创建默认值为0的整数型字段
  minmax FLOAT UNIQUE # 创建唯一约束小数型字段
  );

数据表操作

数据的填充和修改

导入外部数据之前,我们还是需要先创建一个承载数据的数据表

create table fruits (
f_id char(10) not null,
S_id int not null,
f_name varchar(255) not null,
f_price decimal(8,2) not null,
primary key(f_id)
);

create table Monthly_Indicator(
city_name varchar(20) not null,
month_key date not null,
aqi int(4) not null default 0,
aqi_range varchar(20) not null default '-',
air_quality varchar(20) not null default '-',
pm25 float(6,2) not null default 0,
pm10 float(6,2) not null default 0,
so2 float(6,2) not null default 0,
co float(6,2) not null default 0,
no2 float(6,2) not null default 0,
o3 float(6,2) not null default 0,
ranking int(4) not null default 0,
primary key( city_name , month_key)
);

insert into

语法:insert into 表名 (字段1,字段2,...) values ......

注意:每一个字段之间使用逗号分隔,且字段排列顺序和建表时字段的顺序一致;values后面跟我们每行数据的内容,每行数据内容介绍后都以逗号隔开(最后一行以分号终止)

insert into fruits(f_id,s_id,f_name,f_price)
values('a1',101,'apple',5.2),
('b1',101,'blackberry',10.2),
('bs1',102,'orange',11.2),
('bs2',105,'melon',8.2);

这种方法需要我们手动的去把数据录入数据表中,但是如果我们需要分析的数据量很大的情况下,这种方法是非常低效的

外部数据填充

导入外部文件的语句:

load data local infile '文件路径.txt'  # 指定文件路劲
    into table 表名   # 指定插入的表格
    fields terminated by '\t'   # 导入文件时使用的分隔符
    ignore 1 lines;  # 忽略文件中的第一行(可省略)

一个小细节

我们在输入文件路径时需要输入双反斜杠以避免转义问题,也可以使用左斜杠避免

为字段赋值

update...set:为字段赋值,语法为:update 表名 set 字段名=值;

例:将fruits表中的f_id = 'a1'的字段的f_name修改为'watermelon'

update fruits set f_name='watermelon' where f_id = 'a1';

注意:WHERE 子句规定哪条记录或者哪些记录需要更新。如果您省略了 WHERE 子句,所有的记录都将被更新!

删除记录

delete:删除数据表中的数据,语法为DELETE FROM 表名 [WHERE Clause]

如果省略where的话则删除表中所有数据记录

例:将fruits表中的f_id = 'a1'的字段删除

delete from fruits where f_id = 'a1';

检查表数据

在数据源导入完成后,我们需要对表的数据进行检查,对导入表中的数据一般从导入内容、导入数据总行数以及表结构三方面进行检查

  • 检查导入内容
Select * from 表名称;

  • 检查导入数据总行数
Select count(*) from 表名称;

  • 检查表结构
Desc 表名称;

  • (拓展)查看表的创建过程
SHOW CREATE TABLE 表名;

修改数据表

修改表指的是修改数据库中已经存在的数据表的结构

MySQL使用alter table语句修改数据表结构,包括:修改表名,修改字段数据类型或字段名,增加和删除字段,修改字段的排列位置等

修改表名

例:将数据表emp改名为empdep

alter table emp rename empdep;

修改字段数据类型

例:将数据表empdep中depname字段的数据类型由varchar(20)修改成varchar(30)

alter table empdep modify depname varchar(30); 

修改字段名

例:将数据表empdep中depname字段的字段名改为dep

alter table empdep change depname dep varchar(30);

例:将数据表empdep中dep字段的字段名改回为depname,并将该字段数据类型改回为varchar(20)

alter table empdep change dep depname varchar(20);

增加和删除字段

例:为数据表empdep添加新字段maname,新字段数据类型为varchar(10),约束条件为非空

alter table empdep add maname varchar(10) not null;

例:删除maname字段

alter table empdep drop maname;

修改字段的排列位置

例:将数据表empdep中maname字段的排列顺序改为第一位

alter table empdep modify maname varchar(10) first;

例:将数据表emp中maname字段的排列顺序改到depid字段之后

alter table empdep modify maname varchar(10) after depid;

关于数据表中的删除

删除数据表

数据表的删除我们可以通过drop关键字进行删除

例:删除test数据库中的fruits数据表

drop table test.fruits;

数据库名称也可以使用use语句指定,即上面的SQL语句等价于

use test;
drop table fruits;

删除数据表中的字段

上面我们介绍的delete关键字具有数据可恢复的优点,但是如果我们需要删除的字段过多,效率是非常低下的

清空数据表

清空数据表是指在保留数据表结构的基础上删除数据表里全部的数据。数据表的清空我们可以使用truncate关键字,语法为:truncate table 表名;

例:清空fruits表中的全部数据

truncate table fruits;

注意:这种方法虽然处理速度快,但是数据不可恢复

删除表中部分数据

删除表中部分数据我们可以通过不同的情况选择不同的语句进行数据删除

  1. 指定条件删除
delete from 表名 where 指定条件;
  1. 删除唯一键范围内的数据

例:删除表中第1到5条数据

delete from 表名 where 唯一键 between 1 and 5;
  1. 删除排序后的某些数据

例:删除倒序排序后表中前5条记录

delete from 表名 order by 排序字段 desc limit 5;

例:删除升序排序后表中前5条记录

delete from 表名 order by 排序字段 asc limit 5;

数据表的复制

数据表的复制包括整张表的复制以及个别字段的复制

整表复制: 从一个表复制数据,然后把数据插入到另一个新表中,常用于创建表的备份复件或者用于对记录进行存档

SELECT * INTO 新表名 [IN 数据库名] FROM 表名1;

注意:MySQL 数据库不支持 SELECT ... INTO 语句,但支持 INSERT INTO ... SELECT

例:将fruits表复制到newfruits表中

SELECT * INTO newfruits FROM fruits;

在MySQL中,我们可以

INSERT INTO newfruits SELECT * FROM fruits;

也可以

CREATE TABLE newfruits AS SELECT * FROM fruits;

两个语句的区别在于新的表是否提前存在

指定列复制: 从一个表复制数据,然后把数据插入到一个已存在的表中

INSERT INTO 被插入的表名(字段) SELECT 字段 FROM 插入的表名;

例:将fruits表中f_id,S_id,f_name三列数据插入到newfruits中

INSERT INTO newfruits(f_id,S_id,f_name) SELECT f_id,S_id,f_name FROM fruits;

SQL查询与连接

函数

常用数学函数

常用的数学函数:主要用于处理数字值

例:使用abs函数求所有水果平均值与最大值差值的绝对值

select abs(avg(f_price)-max(f_price)) from fruits;

常用的字符串函数

常用的字符串函数:主要用于处理字符串值

例:使用length函数求每个f_name的名字与他们的字符长度

select f_name, length(f_name) from fruits group by f_name;

常用的日期及时间函数

日期及时间函数:用来处理日期时间型数据

例:使用now函数求当前的日期和时间

select NOW();

常用的聚合类函数

所谓聚合类函数是指针对一组数,求汇总值的函数

其他函数

其他函数:除上述函数之外的一些常用函数

  • GROUP_CONCAT()函数:常与关键字GROUP BY一起使用,能够将分组后指定的字段值都显示出来。

例:使用group_concat函数查询不同s_id下对应的所有f_name信息

SELECT s_id, GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id;

例:使用concat函数在f_name字段值前添加'fruit_'信息

update fruits set f_name = concat('fruit_',f_name);
select * from fruits;

数据库的排序和组合

Order by

order by:从英文里理解就是行的排序方式,默认的为升序(asc),可手动指定为降序(desc)。 order by 后面必须列出排序的字段名,可以是多个字段名

order by 字段1(字段2,...) 排序规则

例:将fruits表的数据工具水果价格进行降序排序

select * from fruits order by f_price;

Group by

group by:从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。在使用group by的语句中,只能select用于分类的列(表达式),或聚合函数。where条件用于group by之前,having用于group by 之后对结果进行筛选。

group by 分组字段 (having 筛选条件)

例:查看fruits表中不同的S_id和对应的水果均价并筛选出不同组价格平均值小于10的数据

select S_id,avg(f_price) from fruits group by S_id having avg(f_price) > 10;

有坑: select表达式中含有不是聚合函数列,没有依赖group by 子句中的列,会导致报错

SQL查询

Select语句的操作符

  • 算术操作符

++(加号)、-(减号)、*(乘号)和//(除号)

  • 比较操作符

==(等于)、>>(大于)、<<(小于)、<=<=(小于等于)、>=>=(大于等于)、!=!=<><>(不等于)、!>!>(不大

于)和!<!<(不小于)

SQL查询

单表查询

SELECT单表查询语句的语法

SELECT <目标列组>   # 我们需要提取哪些字段
FROM <数据源>   # 字段从哪来
[WHERE (元组选择条件)]   # 选择符合什么条件的数据
[GROUP BY <分列组> [HAVING <组选择条件>]]   # 通过什么进行分组,选择分组过后哪个组的数据
[ORDERBY <排序列1> (排序要求1) [,...n]];   # 数据怎么排序

例:查询大气质量表中的全部内容

select * from monthly_indicator;

例:查询北京的大气质量数据

select * from monthly_indicator where city_name = '北京';

例:查询不同月份PM2.5的最大值

select month_key, max(pm25) from monthly_indicator group by month_key;

例:降序查询不同城市PM10的平均值

select city_name, avg(pm10) from monthly_indicator group by city_name order by avg(pm10) desc;

例:对大气质量表进行有选择的查询

select city_name, avg(pm25), avg(pm10)
from Monthly_Indicator
where pm25 > 50
group by city_name, month_key having city_name <>'北京'
order by avg(pm25) desc;

在Monthly_Indicator提取PM2.5>50的记录,将记录通过城市名和月份进行汇总且汇总结果中不包含北京的数据,通过PM2.5的平均值降序排序后返回城市名、PM2.5均值和PM10均值3个字段

多表查询

多表查询指的是将两个以上的数据表通过关键字段连接在一起,并从不同表中取不同字段进行查询的方法

关键字段: 用来连接两表的内容信息能够匹配的上的字段

  • 相连的两表中都需要有关键字段
  • 关键字段中的记录信息能够匹配的上

关键字段是通过值去进行匹配而不是字段名进行匹配,所以关键字段的字段名不一致是不影响多表查询的

  • 最理想的连接状态是两表中的两个关键字段都是主键,而且两个主键的值能够一一匹配的上
SELECT <select_list> FROM <表1> xx join <表2> on1.key = 表2.key
  1. xx代表链接的方向,可以是inner、left、 right等关键字
  2. 在连接语句前边的表是“左表”,在连接语句后边的表是“右表”
内连接查询

内连接:按照连接条件合并两个表,返回满足条件的行

SELECT <select list> FROM A INNER JOIN B ON A.Key = B.Key;

例:将学员信息表与学员成绩表进行内连接

select 学员信息表.*,学员成绩表.* from 学员信息表 inner join 学员成绩表 on 学员信息表.学号=学员成绩表.学号;

INNER JOIN 与 JOIN 是相同的

select xyxx.*,xycj.* from xyxx inner join xycj on xyxx.xh=xycj.xh;

左连接查询

左连接:结果中除了包括满足连接条件的行外,还包括左表的所有行

SELECT <select list> FROM A LEFT JOIN B ON A.Key = B.Key;

例:将学员信息表与学员成绩表进行左连接

select学员信息表.*,学员成绩表.* from 学员信息表 left join 学员成绩表 on 学员信息表.学号 = 学员成绩表.学号;

在某些数据库中,LEFT JOIN 称为LEFT OUTER JOIN

select xyxx.*,xycj.* from xyxx left join xycj on xyxx.xh=xycj.xh;

右连接查询

右连接:结果中除了包括满足连接条件的行外,还包括右表的所有行

SELECT <select list> FROM A RIGHT JOIN B ON A.Key = B.Key;

例:将学员信息表与学员成绩表进行右连接

select学员信息表.*,学员成绩表.* from 学员信息表 right join 学员成绩表 on 学员信息表.学号 = 学员成绩表.学号;

在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN

select xyxx.*,xycj.* from xyxx right join xycj on xyxx.xh=xycj.xh;

完全连接查询

完全连接:结果中既包含了左表的所有行,又包含了右表的所有行

SELECT <select list> FROM FROM A FULL JOIN B;

例:将学员信息表与学员成绩表进行完全连接

select* from 学员信息表 full join 学员成绩表;

在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。

select * from xyxx full join xycj;

联合查询

如果说上面我们介绍的多表查询是横向合并的话,下面我们所介绍的就是纵向合并

union:用于合并两个或多个SELECT语句的结果集,并消去表中任何重复行。(去重)

限制条件: UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同

例:用union合并t1与t2表

select t1.* from t1 union select t2.* from t2;

union all:用于合并两个或多个SELECT语句的结果集,保留重复行。(不去重)

例:用union all合并t1与2表

select t1.* from t1 union all select t2.* from t2;

查询操作符子查询

操作符

AND: 用来联合多个条件进行查询,条件与条件间是“和”的意思

条件表达式1 AND 条件表达式2 [...AND 条件表达式n]

例:用and操作符查询s_id为101并 且f_id为a1 的水果记录

select * from fruits where s_id= 101 and f_id= 'a1';

OR: 用来联合多个条件进行查询,条件与条件间是“或”的意思

条件表达式1 OR 条件表达式2 [...OR 条件表达式n]

例:用or操作符查询苹果或者橙子的相关记录

select * from fruits where f_name = 'apple' or f_name = 'orange';

IN: 判断某个字段的值是否在制定的集合中,如果在集合中则满足查询条件,如果不在则不满足查询条件

[NOT] IN (元素1,元素....元素n)

其中NOT是可选参数,加上NOT表示不在集合内满足条件

例:用in操作符查询苹果和橙子的相关记录

select * from fruits where f_name in( 'apple','orange');

例:用notin操作符查询苹果和橙子之外的水果的相关记录

select * from fruits where f_name not in('apple','orange'); 

BETWEEN: 判断某个字段的值是否在指定的范围内,如果在则满足查询条件,如果不在则不满足查询条件

[NOT] BETWEEN 取值1 AND 取值2

其中NOT是可选参数,加上NOT表示不在指定范围内满足条件

例:用between...and操作符查询f_price在10元到20元之间的水果记录

select * from fruits where f_price between 10 and 20;

LIKE: 用来匹配字符串是否相等,如果字段的值与指定的字符串相匹配,则满足查询条件,如果与指定的字符串不匹配,则不满足查询条件

[NOT] LIKE '字符串'

其中NOT是可选参数,加上NOT表示指定的字符串不匹配时满足条件

字符串参数的值可以是一个完整的字符串,也可是包含%或者_的通配符。其中%代表任意长度的字符串。例如b%k表示以字母b开头,以字母k结尾的任意长度的字符串。比如bak,book, break等都可以。而_只能表示单个字符。例如b_k表示以字母b开头,以字母k结尾的3个字符。只有上例中的bak是匹配项,而book 与break均不满足匹配要求。

例:用like操作符查 询所有f_id由b开始且字符长度为两位的水果记录

select * from fruits where f_id like 'b__';

IS NULL: 用来判断字段的值是否为空值(NULL)。如果字段的值为空值,则满足查询条件,如果字段的值是非空值,则不满足查询条件

IS [NOT] NULL

其中NOT是可选参数,加上NOT表示字段不是空值时满足条件。

例:用is null操作符查询所有f_name为空的水果记录

select * from fruits where f_name is null;

DISTINCT:用来消除重复记录。

SELCT DISTINCT 字段名

例:查询fruits表中所有不重复的s_id

select distinct s_id from fruits;

操作符与子查询的组合应用

子查询: 写在()中,把内层查询结果当做外层查询参照的数据表来用

ANY: 表示满足其中任意-一个条件,使用Any关键字时,只要满足内层查询语句返回的结果中的任何一个,就可以通过该条件来执行外层查询语句

例:用any操作符与子查询语句来查询所有f_id对应的f_price在10元到20元之间的水果记录

select * from fruits where f_id = any(select f_id from fruits where f_price between 10 and 20);

ALL: 表示满足所有条件,使用All时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句

例:用all操作符与子查询语句来查询所有fprice大于10元的水果记录

select * from fruits where f_price > all(select f_price from fruits where f_price <= 10);

EXISTS: 表示存在,使用Exists关键字时,内层查询语句不反悔查询的记录,而是返回一个真价值,如果内层查询语句查询到满足条件的记录,就返回真值,否则返回假值,当返回真值时,外层查询语句将进行查询,当返回假值时,外层查询语句不进行查询或者查询不出任何记录

例:用exists操作符与子查询语句来查询是否存在f_price大于20元的水果记录

select * from fruits where exists(select * from fruits where f_price > 20);

as:可以将表或字段名重新命名为别的名称使用,只在查询中有效

例:用as将fruits表 名重命名为f后使用

select f.* from fruits as f;

limit:查询后只显示limit指定数字的行数结果

例:显示f_price金额最大的前三名水果记录

select * from fruits order by f_price desc limit 3;