SQL 简介
SQL 是 Structure Query Language(结构化查询语言)的缩写,它是使用关系模型的数据库应用语言。
SQL 入门
这里主要介绍标准 SQL 的基本语法和 MySQL 的部分拓展语法
SQL 分类
SQL语言主要可以划分为以下 3 个类别:
- DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括 create、drop、alter 等。
- DML(Data manipulation Languages)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用的语句关键字主要包括 insert、delete、update、select 等。
- DCL(Data Control Languages)语句:数据控制语言,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke 等。
DDL 语句
DDL 是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建、删除、修改等操作的语言。它和 DML 语句的最大区别是 DML 只是对表内部数据操作,而不涉及表的定义、结构的修改,更不会涉及其它对象。DDL 语句更多地由数据库管理员使用,开发人员一般很少使用。
创建数据库
create database test1;
如果想要查看系统中有哪些数据库,可以用如下命令:
show databases;
可以用如下命令选择要操作的数据库:
use test1;
删除数据库
drop database test1;
创建表
create table tablename (
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints,
...
column_name_n column_type_n constraints
)
因为 MySQL 的表名是以目录的形式存在于磁盘上,所以表名的字符可以用任何目录名允许的字符。
column_name 是列的名字;column_type 是列的数据类型;constraints 是这个列的约束条件。
查看表的定义
desc tablename;
查看创建表的 SQL 语句
show create table tablename;
删除表
drop table tablename;
修改表
修改表类型
alter table tablename modify column_col datatype [first|after col_name];
增加表字段
alter table tablename add [column] column_col datatype [first|after col_name];
删除表字段
alter table tablename drop [column] col_name;
字段改名
alter table tablename change [column] old_col_name column_definition datatype [first|after column_name];
修改字段排列顺序
字段增加和修改语法(add/change/modify)中,都有一个可选项 first|after column_name
,这个选项可以用来修改字段在表中的位置。
add 增加的新字段默认是加在表的最后位置,而 change/modify 默认都不会改变字段的位置。
change first|after column
这些关键字都属于 MySQL 在标准 SQL 上的扩展,在其他数据库上不一定适应。
更改表名
alter table tablename rename [to] new_tablename;
DML 语句
DML 操作是指对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select),是开发人员日常使用最频繁的操作。
插入
insert into tablename(field1,field2,...,fieldn) values(value1,value2,...,valuen);
也可以不指定字段名称,但是 values 后面的顺序应该和字段的排列顺序一致。
也可以一次性插入多条记录:
insert into tablename(field1,field2,...,fieldn)
values
(record1_value1,record1_value2,...,record1_valuen),
(record2_value1,record2_value2,...,record2_valuen),
...
(recordn_value1,recordn_value2,...,recordn_valuen);
更新
update tablename set field1=value1,field2=value2,...,fieldn=valuen [where condition];
在 MySQL 中,update 命令可以同时更新多个表中数据:
update t1,t2,...tn set t1.field=expr1,tn.fieldn=exprn [where condition];
删除
delete from tablename [where condition];
在 MySQL 中可以一次删除多个表的数据:
delete t1,t2,...tn from t1,t2,...,tn [where condition];
如果 from 后面的表名用别名,则 delete 后面也要用相应的表明。
查询记录
select * from tablename [where condition];
查询不重复的记录
select distinct col_name from tablename;
排序
select * from tablename [where condition] [order by field1 [desc\asc], field2 [desc\asc],...,fieldn [desc\asc]];
其中,desc 和 asc 是排序顺序关键字,desc 表示按照字段进行降序排序,asc 则表示升序排序,如果不写此关键字默认是升序排序。
如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序,依次类推。如果只有一个排序字段,则这些字段相同的记录将会无序排列。
限制行数
select * from tablename [limit offset_start,row_count];
其中,offset_start 表示记录的起始偏移量,row_count 表示显示的行数。
在默认情况下,起始偏移量为0,只需要写记录行数就可以,这是,实际显示的就是前 n 条记录。
limit 属于 MySQL 拓展 SQL92 后的语法,在其他数据库上并不能适应。
聚合
select [field1,field2,fieldn] fun_name
from tablename
[where where_condition]
[group by field1,field2,...fieldn]
[with rollup]
[having where_condition];
其中:
fun_name 表示要做的聚合操作,也就是聚合函数,常用的有 sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。
group by 关键字表示要进行分类聚合的字段,比如要按照班级统计学生平均分,班级就应该写在 group by 后面。
with rollup 是可选语法,表明是否对分类聚合后的结果进行再汇总。
having 关键字表示对分类后的结果再进行条件的过滤。
having 和 where 的区别在于,having 是对聚合后的结果就行条件的过滤,而 where 是在聚合前就对记录进行过滤,如果逻辑允许,尽可能用 where 先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用 having 进行再过滤
表连接
当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。
从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是,内连接仅选出两张表中互相匹配的记录,而外连接会选出其它不匹配的记录。
外连接又分为左连接和右连接,具体定义如下:
- 左连接(left join):包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。
- 右连接(right join):包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。
内连接有两种方式:
select t1.*,t2.* from tablename1 t1,tablename2 t2 where t1.field1 = t2.field2;
select t1.*,t2.* from tablename1 t1 join tablename2 t2 where t1.field1 = t2.field2;
子查询
某些情况下,当进行查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就要用到子查询。用于子查询的关键字主要包括 in
、not in
、=
、!=
、exists
、not exists
等。
记录联合
当需要把两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,这个时候,就需要用 union 和 union all 关键字来实现这样的功能。
select * from t1
union\union all
select * from t2
...
union\union all
select * from tn;
需要注意的是,union\union all 之间的查询结果列数量需要相同。
union 和 union all 的主要区别是 union all 是把结果集直接合并在一起,而 union 是将 union all 后的结果进行一次 distinct,去除重复记录后的结果。
DCL 语句
DCL 语句主要是用来管理系统中的对象权限时使用。
创建用户
create user 'username'@'hostIP' identified by 'password';
hostIP 用于指定该用户只能在哪个 ip 登录,如果要想在任意 ip 登录的话,将 hostIP 改为 %
。
用户授权
grant privileges on database.tablename to username@hostIP;
privileges 指操作权限,常用有以下几种:
- select:查询
- insert:插入
- update:更新
- delete:删除
- create:创建表
- alter:修改表结构
- drop:删除表
- index:操作索引
- create view:创建视图
- show view:查看视图
- create routine:创建存储过程、函数
- alter routine:修改存储过程、函数
- execute routine:执行存储过程、函数
如果要赋予多个权限,可以用逗号,
隔开,如果要赋予所有权限,可以用 all privileges
代替,其中 privileges 可以省略。