SQL分类
SQL语句主要分为以下几类:
- DDL(Data Definition Language)语句:数据定义语言。这些语句包括不同的数据段,数据库,表,列和索引等数据库对象的定义。常见的关键字有create、alter和drop。
- DML(Data Manipulation Language)语句:数据操纵语言。用于添加,删除,更新和查询数据库记录,并检查数据的完整性。
- DCL(Data Control Language)语句:数据控制语言。用于控制不同数据段直接的许可和访问级别的语句。主要的关键字包括grant和revoke等。
DDL
(1)创建数据库
create database dbname
(2)删除数据库
drop database dbname;
(3)创建表
create table tbname (col_name_1 col_type constrains,...,)engine='MyISAM'(InnoDB) default chaset ='gbk'(utf)
(4)删除表
drop table tbname
(5)修改表
修改表类型:alter table tbname modify col_name col_definition
增加表字段:alter table tbname add [column] col_name column_definition
删除表字段:alter table tbname drop [column] col_name
字段改名:alter table tbname change old_col_name new_col_name column_definition
修改字段排列顺序:add/change/modify,有一个可选项first、after col_name,这个选项用来修改字段在表中的位置,默认ADD增加的新字段是加载表的最后位置
修改表名:alter table tbname rename new_tbname
modify和change都可以修改字段的定义,但是change需要写两次表名,但是modify只需要写一次;但是change可以修改字段的名称,而modify则不可以。
字段增加和修改语法(ADD/CHANGE/MODIFY)中,都有一个可选项first|after column_name,这个字段可以用来修改字段在表中的位置,默认ADD增加的新字段是加在表的最后位置,而change/modify默认都不会改变字段的位置。
DML
(1)插入记录
insert into tbname (field1, field2, field3, ... ,fieldn) values(value1,value2,value3, ... ,valuen)
insert语句可以一次性插入多条记录:
insert into tablename (field1, field2, field3, ... ,fieldn)
values
(record1_value1, record1_value2, record1_value3, ... ,record1_valuesn),
(record1_value1, record1_value2, record1_value3, ... ,record1_valuesn),
.......
(recordn_value1, recordn_value2, record1_value3, ... ,recordn_valuesn)
insert into tbname select *,从一个或者多个表中向一个表中插入多行数据
load data (local) infile filename into tbname,高速的从一个文本文件中读取行,并装入一个表中。文本文件的名称必须为一个文字字符串。local表示filename是本地的文件。
replace into tbname select *,类似于insert into tbname select *,如果表中的一个旧记录与一个用于或一个PRIMARY KEY索引或者UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。
(2)修改记录
update tbname set field1=value1, field2=value2, ... fieldn=valuen where condition
(3)删除记录
delete from tbname where condition
(4)查询记录
查询不重复的记录
使用distinct进行实现。
条件查询
有时用户只需要根据限定条件来查询一部分数据,用where关键字可以来实现这样的操作。
结果集中将符合条件的记录列出来。where后面的条件可以是=,<,>,>=,<=,!=等比较运算符
多个条件之间还可以使用or,and 等逻辑运算符进行多条件联合查询。
排序和限制
使用关键字order by,其中DESC是按照字段进行降序排列,而ASC是按照字段进行升序排列。
order by后面可以跟多个不同的排序字段,并且每个排序字段可以有不同的书序排序。
对于排序后的记录,如果希望只显示一部分,而不是全部。这是,就可以使用LIMIT关键字来实现。limit的语法如下
SELECT ......[LIMIT offset_start, row_count],其中offset_start表示记录的起始偏移量,row_count表示显示的行数。
聚合
- 常见的聚合函数有max,min,sum,count
- group by关键字表示要进行分类聚合的字段
- having表示对分类后的结果再进行过滤的结果;
- having和where的区别在于having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤。
- 如果逻辑允许,我们尽可能用where先过滤条件,这样因为结果集减小,将对聚合的效率大大提高。
- with rollup是可选语法,表明是否对分类聚合后的结果进行再汇总。
表连接
外连接
- 左连接:包含所有左边表中的记录甚至是右边表中没有和他匹配的记录
- 右连接:包含所有右边表中的记录甚至是左边表中没有和他匹配的记录
- 完全外连接:MySQL不支持完全连接
内连接
内连接选出两张表中互相匹配的记录。
子查询
当进行查询的时候,需要的条件是另外一个select语句的结果,需要使用子查询。
关键字包括in,not in,=,!=,exist,not exist
如何子查询记录数唯一,还可以使用=代替in。
记录联合
结果合并到一起显示。
union all是把结果集合直接合并在一起。
union是将union all后的结果进行一次distinct后,取出重复记录后的结果。
DCL
(1)grant
授予权限,
grant select,insert
on table_name
to 'username'@'localhost'
identified by password
(2)revoke
收回权限,revoke insert on table_name from 'username'@'localhost'