SQL
SQL(Structure Query Language):结构化查询语言。其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
分类:
1) DDL(Data Definition Language)数据定义语言。 用来定义数据库对象:数据库,表,列、索引等。关键字:create, drop,alter 等。
2) DML(Data Manipulation Language)数据操作语言。 用来对数据库中表的数据进行增删改查,并检查数据的完整性。关键字:insert, delete, update 和 select 等
3) DCL(Data Control Language)数据控制语言。 控制不同数据段直接的许可和访问级别的语句,定义数据库、表、字段、用户访问权限和安全级别。 关键字:grant、revoke等
Ⅰ .操作数据库
1. C(Create):创建
* 创建数据库:
* create database dbname;
* 创建数据库,判断不存在,再创建:
* create database if not exists dbname;
* 创建数据库,并指定字符集
* create database dbname character set 字符集名;
2. R(Retrieve):查询
* 查询所有数据库的名称:
* show databases;
* 查询某个数据库的字符集:查询某个数据库的创建语句
* show create database dbname;
3. U(Update):修改
* 修改数据库的字符集
* alter database dbname character set 字符集名称;
4. D(Delete):删除
* 删除数据库
* drop database dbname;
* 判断数据库存在,存在再删除
* drop database if exists dbname;
5. 使用数据库
* 查询当前正在使用的数据库名称
* select database();
* 使用数据库
* use dbname;
Ⅱ.操作表
1. C(Create):创建
1. 语法:
create table tbname(
列名1 数据类型1,
列名2 数据类型2,
....
列名n 数据类型n
);
* 注意:最后一列,不需要加逗号(,)
* 复制表:
* create table tbname like 被复制的表名;
2. R(Retrieve):查询
* 查询某个数据库中所有的表名称
* show tables;
* 查询表结构
* desc tbname;
3. D(Delete):删除
* drop table ;
* drop table if exists tbname;
4. U(Update):修改
alter table tbname ...
1. 修改表名
alter table tbname rename to 新的表名;
2. 修改表的字符集
alter table tbname character set 字符集名称;
3. 添加一列
alter table tbname add 列名 数据类型;
4. 更新列名称 类型
alter table tbname change 列名 新列别 新数据类型;
alter table tbname modify 列名 新数据类型;
5. 删除列
alter table 表名 drop 列名;
6. 修改字段排列顺序
在3、4、5操作中,都有个可选项 first | after column_name,可以修改字段在表中位置。但是该方法是MySQL在SQL上拓展,不一定适用其他数据库。
e.g. alter table emp add birth date after name; --在name列后加birth
alter table emp add birth date first; --在第一列加birth
1. 添加数据:
* 语法:
* insert into tbname(列名1,列名2,...列名n) values(值1,值2,...值n);
* 注意:
1. 列名和值要一一对应。
2. 如果表名后,不定义列名,则默认给所有列添加值
insert into tbname values(值1,值2,...值n);
3. 除了数字类型,其他类型需要使用引号(单双都可以)引起来
2. 删除数据:
* 语法:
* delete from tbname [where 条件]
* 注意:
1. 如果不加条件,则删除表中所有记录。
2. 如果要删除所有记录
1. delete from tbname; -- 不推荐使用。有多少条记录就会执行多少次删除操作
2. TRUNCATE TABLE tbname; -- 推荐使用,效率更高 先删除表,然后再创建一张一样的表。
3. 更新数据:
* 语法:
* update tbname set 列名1 = 值1, 列名2 = 值2,... [where 条件];
* 注意:
1. 如果不加任何条件,则会将表中所有记录全部修改。
4. 查询数据:
* 语法:
* select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定;
1. 条件查询
1. where子句后跟条件
· 运算符:
* > 、< 、<= 、>= 、= 、<>
* BETWEEN...AND
* IN( 集合)
* LIKE:模糊查询
* 占位符:
* _:单个任意字符
* %:多个任意字符
* IS NULL
* and 或 &&
* or 或 ||
* not 或 !
2. having条件语句,对分类后的结果再进行条件的过滤
区别:
在查询过程中:
聚合语句(sum,min,max,avg,count),要比having子句优先执行;优先执行where ,再执行聚合语句(sum,min,max,avg,count)。
分组:
Having是先分组在进行筛选,而where是先筛选再进行分组。
2. 排序和限制
1. order by , limit
2. 关键字:
DESC 和 ASC: 降序和升序。默认升序。
,:可以多个条件排序。 e.g: select * from emp order by age,by height;
order 和 limit放一起,常常用来记录分页显示: e.g: select * from emp order by age limit 1,3;
3. 聚合
1. 语法:
select [field1, field2.....] fun_ame from tbname [where 条件] [group by field1, ....] [with POLLUP] [having 条件];
2. 关键字:
fun_name: 表示要做的聚和操作,即聚合函数,如sum(求和)、count(*)(记录数)、max(最大)、min(最小)。
group by:表示要进行分类的聚合的字段。
with POLLUP:可选语法,表明是否对分类聚合后的结果进行再汇总。
having 表示对分类后的结果再进行条件的过滤。
e.g: select student from class group by sex having score > 60;
4. 表连接
1. 解释:
当需要同时显示多个表中给的字段时,使用表连接来实现。
分内连接和外连接:内连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。常使用内连接,但是有时候也必须使用外连接。
2. 内连接:
使用比较运算符根据每个表共有的列的值匹配两个表中的行。有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。
隐式的:
select
a.name , b.price
from
Product a, Price b
where
a.ib = b.pid;
显示的:
select
a.name , b.price
from
Product a
inner jion
Price b
on
a.ib = b.pid;
3. 外连接:
左连接:包含所有左边表中记录,甚至是右边表没有与它匹配的记录。
关键字: LEFT JOIN或LEFT OUTER JOIN
eg: select a.name , b.price from Product a left join Price b on a.ib = b.pid;
右连接:包含所有右边表中记录,甚至是左边表没有与它匹配的记录。与左连接相反
关键字:RIGHT JOIN 或 RIGHT OUTER JOIN
完整外部连接:接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
关键字:FULL JOIN 或 FULL OUTER JOIN
5. 子查询
1. 解释:
某些情况,当进行查询的时候,最需要的条件是另外一个select语句的结果的时候,这时候就要用到子查询。
2. 关键字:in、not in、=、!=、exits、not exits等。有时候子查询记录数唯一,还可以用=代替in;同时,子查询在某些情况可以转换为表连接,因为表连接要优于子查询。
e.g:select * from table1 where name1 = (select name2 from table1 );
5. 记录联合
1. 解释:
某些情况,讲两个表的数据按照一定的查询条件查询出来后,将结果并到一起显示,就需要union和union all实现这种功能。
union 与 union all:前者比后者多做了一次distinct去重。
2. 语法:
select * from table1
union | union all
select * from table2
...
union | union all
select * from tablen;