SQL 基本语法
学习sql
语句和mysql
基本数据类型,学习掌握数据插入,修改,删除的 sql 语句,查询语句,以及各类特定的查询语句。
学会数据库事务的概念,特性以及使用方法。
sql
的目录也整理一个思维导图:
sql 语句简介
结构化查询语言简称SQL
,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
sql
语句就是对数据库进行操作的一种语言。
sql
分三种类型:
-
DDL
语句,数据定义语句,定义了不同数据库,表,列,索引等数据库对象。 -
DML
语句,数据操作语句,用于添加,删除,更新和查询数据库记录,并检查数据完整性。 -
DCL
语句,数据控制语句,定义数据库,表,字段,用户的访问权限和安全级别。
mysql 基本数据类型
mysql
提供了多种数据类型,包括数值类型,字符串类型,日期和时间类型。
-
数值类型
-
字符串类型
-
日期和时间类型
数值类型
mysql
的数值类型:
-
整数类型
-
浮点数类型
-
定点数类型
整数类型:
-
tinyint
-
small int
-
medium int
-
int
-
big int
浮点数类型:
-
float
-
double
定点数类型:
-
decimal
整数类型的划分是根据存储空间的大小和表示范围的大小来划分
浮点类型是用来表示实数的一种方法,根据位数和精度,浮点类型分单精浮点数(8 位精度)和双精浮点数(16 位精度)。
字符串类型
提供了多种字符串类型:
-
char
-
varchar
-
binary
-
varbinary
-
blob
-
text
-
enum
-
set
char 与 varchar
-
char
定义固定长度字符串 -
varchar
定义可变长度字符串
char
的长度固定为创建表时声明的长度,其取值范围为 0 到 255,当保存char
值时,在右边填充空格以达到指定的长度。
当检索到char
值时,其尾部的空格会被删除,所以在存储时,一般字符串右边不能有空格。如果字符串右边有空格,在查询出来后会被删除。
varchar
的长度可以指定为 0 到 6535,varchar
值在保存时只保存需要的字符串,并另外加一个字节来记录长。
`binary`与`varbinary`
binary
和varbinary
用来存储二进制字符串。没有字符集,并且会排序和比较基于列值字节的数值。
text 与 blob
text
和blob
是以对象类型保存的文本与二进制。
text
视为足够大的varchar
,将blob
视为足够大的varbinary
,但text
和blob
与varchar
和varbinary
的不同之处:
-
当保存或检索
blob
和text
的值时不删除尾部空格。 -
在比较时,会用空格对
text
进行扩充以适应比较的对象。 -
对于
blob
和text
的索引,必须制定索引前缀的长度。 -
blob
和text
不能有默认值。
对弈text
和blob
对象的最大字符串长度由其类型确定。
text
分为tinytext
,text
,mediumtext
和longtext
四种类型。
blog
分为tinyblob
,blob
,mediumblob
和longblob
四种类型。
enum
enum
表示枚举类型,它的取值范围需要在创建表时通过枚举方式显式制定。enum
是忽略大小写的。enum
只允许从值集合中选取单个值,不能一次选取多个值。
set
set 是一个集合对象,可以包含 0 到 64 个成员,其所占存储空间的大小是因集合成员数量的不同而有所不同的。
日期和事件类型
提供了多种日期和时间类型:
-
year
-
time
-
date
-
datetime
-
timestamp
日期格式,year
,YYYY;time
,HH:MM:SS;date
,YYYY-MM-DD;datetime
,YYYY-MM-DD HH:MM:SS,timestamp
,YYYY-MM-DD HH:MM:SS。
数据插入
insert into 表名 values (值1,值2,...);
insert into 表名 (列1,列2,...) values (值1,值2);
在mysql
中,insert
语句,可以一次性插入多条记录,语法格式如下。
insert into 表名 (列1,列2,...) values (值1,值2,...), (值1,值2,...),...;
数据修改
通过update
命令进行修改:
update 表名 set 列名 = 新值 whert 列名 = 某值;
update 表1,表2,...set 表1.列1,表2.列2,...where 条件;
数据删除
可以使用delete
命令进行删除:
delete from 表名 where 列名=值;
delete
命令可以一次删除多个表的数据:
delete 表1,表2,... from 表1,表2,...where 条件;
数据查询
最基本的select
语句的语法格式:
select 字段 from 表名 where 条件;
条件查询
条件查询的语句:
select 字段 from 表名 where 条件;
联合查询
union
操作符
union
操作符用于合并两个或多个select
语句的结果集。
代码:
select 条件 from 表 1
union
select 条件 from 表 2;
union 和 union all 的主要区别
-
union all
用于将结果集直接合并在一起。 -
union
用于将union all
后的解构进行一次distinct
,以删除重复结果记录。
不重复查询
语法格式如下:
select distinct 字段 from 表名;
模糊查询
语法格式:
select 字段 from 表名 where 字段 like 值;
%
的使用,用来匹配 0 个或多个字符,可以匹配任意类型和长度的字符,对长度没有限制。
“_”
的使用,用来匹配任意单个字符,常用来限制表达式的字符长度。
排序查询
使用order by
关键字来排序:
select 字段 from 表名 where 条件 order by field1 desc/asc, field2 desc/asc, ...;
排序方式:desc
表示降序排列,asc
表示升序排序。默认值为asc
。
order by
后面可以跟多个不同的排序字段。
限制查询
使用limit
关键字进行限制查询,格式:
select 字段 limit 起始偏移量,行数;
聚合
聚合语句格式:
select 字段 op_name from 表名 where 条件 group by filed1, filed2, ... with rollup having 条件;
op_name
表示要进行的聚合操作,就是聚合函数。
聚合函数:
-
sum
函数求和 -
count
函数记录数 -
max
函数最大值 -
min
函数最小值 -
groupby
表示要进行分类聚合的字段 -
with rollup
表示是否对分类聚合后的结果进行在汇总 -
having
表示对分类后的结果进行条件过滤
连接
内连接
内连接查询是指所有查询的结果都能够在连接的表中有对应记录。在默认情况下是内连接,可以不写join
关键字,或者写inner join
。
join
分三类:
-
inner join
:获取两个表中字段匹配关系的记录。 -
left join
:获取左表所有记录,即使右表没有对应匹配的记录。 -
right join
:用于获取右表所有记录,即使左表没有对应匹配的记录。
左连接和右连接
左连接是指以左边的表的数据为基准,去匹配右边的表的数据。
-
如果匹配到相应数据,则显示匹配结果
-
如果匹配不到相应数据,就显示为 null
左连接的关键字:left join
。
右连接的关键字:right join
。
右连接反之。
事务
事务概述:事务,一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元。
事务由事务开始和事务结束之间执行的全体操作组成。
事务就是一组由sql
语句组成的业务逻辑,只有事务内的所有sql
语句都成功执行,整个事务才算成功,否则就是失败。
事务的四大特性
-
原子性
-
一致性
-
隔离性
-
持久性
事务提交
默认情况下,sql
语句是自动提交的,每条sql
语句在执行完毕后会 自动提交事务,要想统一提交事务,需要先关闭mysql
的自动提交功能。
查看数据库是否开启自动提交:
show variables like 'autocommit';
使用命令关闭自动提交:
set autocommit=0;
命令手动进行事务提交:
commit
事务回滚
事务中已执行成功的语句结果应该回退至未执行状态,称为事务回滚。
事务回滚:
rollback
事务隔离级别
事务的并发读问题
-
脏读:读取到另一个事务未提交数据;
-
不可重复读:两次读取不一致;
-
幻读(虚读):读到另一事务已提交数据。
开始事务
事务以begin transaction
开始:
格式:
begin transaction <事务名称> |@ <事务变量名称>
语法说明如下:
@<事务变量名称>
由用户定义的变量,必须用char,varchar,nchar或nvarchar
数据类型来声明该变量。
begin transaction
语句的执行。
提交事务
commit
表示提交事务,即提交事务的所有操作。
撤销事务
rollback
表示撤销事务,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态。
语法格式:
rollback[transaction]
MySQL 正则表达式
-
^
匹配输入字符串的开始位置。 -
$
匹配输入字符串的结束位置。 -
[...]
字符集合。匹配所包含的任意一个字符。 -
[^...]
负值字符集合。匹配未包含的任意字符。 -
*
匹配前面的子表达式零次或多次。 -
+
匹配前面的子表达式一次或多次。 -
{n}
n 是一个非负整数。匹配确定的 n 次。 -
{n,m}
m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。
sql 语句
sql
语句:
select lastname from persons
-
select
从数据库表中获取数据 -
update
更新数据库表中的数据 -
delete
从数据库表中删除数据 -
insert into
向数据库表中那个插入数据
DDL 语句
-
create database
创建新数据库 -
alter database
修改数据库 -
create table
创建新表 -
drop table
删除表 -
alter table
变更数据库表 -
create index
创建索引 -
drop index
删除索引
语句
SELECT
语句用于从表中选取数据。
SELECT 列名称 FROM 表名称
SELECT * FROM 表名称
SELECT LastName,FirstName FROM Persons
SQL SELECT DISTINCT
语句
在表中,可能会包含重复值。关键词 DISTINCT 用于返回唯一不同的值。
语法:
SELECT DISTINCT 列名称 FROM 表名称
WHERE
子句用于规定选择的标准。
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
|操作符| 描述|
|:---|:---|
|=
| 等于|
|<>
| 不等于|
|>
| 大于|
|<
| 小于|
|>=
| 大于等于|
|<=
| 小于等于|
|BETWEEN
| 在某个范围内|
|LIKE
| 搜索某种模式|
如果第一个条件和第二个条件都成立,则 AND
运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR
运算符显示一条记录。
ORDER BY
语句用于对结果集进行排序。
INSERT INTO
语句
INSERT INTO 表名称 VALUES (值1, 值2,....)
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
Update
语句用于修改表中的数据。
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
DELETE
语句用于删除表中的行。
DELETE FROM 表名称 WHERE 列名称 = 值
总结
数据库的发展历程:
-
网状型数据库
-
层次型数据库
-
关系数据库
-
面向对象数据库
关系数据库:
-
桌面数据库
-
客户/服务器数据库
数据表是存储数据的逻辑单元。
数据表中,一行称为一条记录,一列称为一个字段。