MySQL 系列 —— SQL

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 语句的结果,这个时候,就要用到子查询。用于子查询的关键字主要包括 innot in=!=existsnot 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 可以省略。

你可能感兴趣的:(MySQL 系列 —— SQL)