SQL 基础
简介
SQL 是 Structure Query Language(结构化查询语言)的缩写,它是使用关系模型的数据库应用语言,由 IBM 在 20 世纪 70 年代开发出来,作为 IBM 关系数据库原型 System R 的原型关系语言,实现了关系数据库中的信息检索。
20 世纪 80 年代初,美国国家标准局(ANSI)开始着手制定 SQL 标准,最早的 ANSI 于 1986 年完成,就被叫做 SQL-86.标准的出台使 SQL 作为标准关系数据库语言的地位得到了加强。SQL 标准目前几经修改,更趋完善。
分类
SQL 语句主要可以划分为 3 个类别:
- DDL(Data Definition Language)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括 create,drop,alter 等。
- DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检索数据完整性。常用的关键字主要包括:insert、delete、update 和 select 等。
- DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的关键字包括:grant、revoke 等。
MySQL 默认数据库
- information_schema:主要存储了系统中的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息、分区信息等。
- mysql:存储了系统的用户权限信息。
数据库的增删改查
- 增:
create database test1
- 删:
drop database test1
- 改:没有这样的需求,也没有这样的功能
- 查:
show databases
数据表的增删改查
- 增
create table tablename(
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints,
...
column_name_n column_type_n constraints)
- 删
drop table tablename
- 改
- 增加表字段:
alter table tablename add [column] column_definition [first | after col_name]
。例如:alter table t_emp add column age int(3);
- 删除表字段:
alter table tablename drop [column] col_name
。例如:alter table t_emp drop column age;
- 修改表类型:
alter table tablename modify[column] column_definition [first | after col_name]
。例如:alter table t_emp modify ename varchar(20);
- 修改字段名:
alter table tablename change[column] old_col_name column_definition [first | alter col_name]
。例如:alter table t_emp change age age1 int(4);
。(change 和 modify 都可以修改表字段,不同的是 change 后面需要写两次列明,不方便,但是 change 的优点是可以修改列名称,modify 则不能) - 修改表名称:
alter table tablename rename [to] new_tablename
。例如:alter table t_emp rename new_emp;
- 查
desc tablename;
show create table emp;
索引的增删改查
-
增
普通索引:alter table tablename add index index_name(column1, column2, ..., columnn)
唯一索引:alter table tablename add unique index index_name(column1, column2, ..., columnn)
主键索引:alter table tablename add primary key(column1, column2, ..., columnn)
-
删
普通索引:alter table tablename drop index index_name
主键索引:alter table tablename drop primary key
-
改:索引有改操作吗?现在还不知道
-
查
show index from tablename
show keys from tablename
数据的增删改查
- 增:就是 insert 了。可空字段、非空但有默认值字段、自增字段,insert 语句里均可不设置,它们会被自动设置为:NULL、默认值、自增的下一个数据。还有,insert 语句可以一次性插入多条记录,语法如下:
insert into tablename(field1, field2, ..., fileldn) values
(record1_value1, record1_value2, ..., record1_valuen),
(record2_value1, record2_value2, ..., record2_valuen),
...
(recordn_value1, recordn_value2, ..., recordn_valuen),
;
这个特性可以使用 MySQL 在插入大量记录时,节省很多的网络开销,大大提高插入效率。
-
删:就是 delete 了。可以一次删除多个表的数据,语法:
delete t1, t2, ..., tn from t1, t2, ..., tn [where condition]
。例如:delete a, b from emp a, dept b where a.deptno=b.deptno and a.deptno=3;
。不管是单表还是多表,不加 where 条件将会把所有记录删除。 -
改:就是 update 了。可以一次更改多个表的数据,语法:
update t1, t2, ..., tn set t1.field1=expr1, tn.fieldn=exprn [where condition]
。例如:update emp a, dept b set a.sal=a.sal*b.deptno, b.deptname=a.ename where a.deptno=b.deptno;
。 -
查:就是 select 了。limit 关键字用法:
select ...[limit offset_start, row_count]
,其中 offset_start 表示记录的起始偏移量(默认为 0,所以这个参数可以不写),row_count 表示显示的行数。其他查询内容较多,下面分开写。
聚合查询
语法:
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 关键字表示要进行聚合的字段。
with rollup 是可选语法,表明是否对分类聚合后的结果进行再汇总。
having 关键字表示对分类后的结果再进行条件的过滤。
注意:having 和 where 的区别在于,having 是对聚合后的结果进行条件的过滤,而 where 是在聚合前就对记录进行过滤,如果逻辑允许,我们尽可能用 where 先过滤记录,这样因为结果集减小,将会聚合的效率大大提高,最后再根据逻辑看是否用 having 进行再过滤。
连接查询
连接查询,分为:内连接和外连接。它们的主要区别是,内连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。我们常用的是内连接。语法区别是:内连接不用 join,条件用 where;外连接使用 join,条件用 on。
内连接语法:select ename, deptname from emp, dept where emp.deptno=dept.deptno;
外连接又分为左连接,右连接。语法:select ename, deptname from emp left join dept on emp.deptno=dept.deptno;
子查询
用于子查询的关键字主要包括:in, not in, =, !=, exists, not exists 等。
例如:select * from emp where deptno in (select deptno from dept);
如果子查询记录数唯一,还可以使用 = 代替 in:select * from emp where deptno = (select deptno from dept limit 1);
联合查询
将多个(不止两个哦) select 语句查询的结果进行汇总。语法:
select * from t1
union\ union all
select * from t2
...
union \ union all
select * from tn;
union 和 union all 的主要区别是 union all 是把结果集直接合并在一起,而 union 是将 union all 后的结果进行一次 distinct,去除重复记录后的结果。
DCL 语句
DCL 语句主要是 DBA 用来管理系统中的对象权限时使用,一般的开发人员很少使用。哎,这是我这次学习 MySQL 最感兴趣的地方了,无奈这一章没有详细介绍,以后有详细介绍的时候再学习吧!
帮助
命令行登录 MySQL 后,有内置帮助文档命令,详细内容请看登录后的提示语。学习使用官方内置帮助文档才是王道啊。
- 按照层次查看帮助:从
? contents
命令开始 - 快速查阅帮助:例如:
? show
,? create database
等
元数据
数据库 information_schema 用于记录 MySQL 中的元数据信息。元数据指的是数据的数据,比如表名、列名、列类型、索引名等表的各种属性名称。这个库比较特殊,它是一个虚拟数据库,物理上并不存在相关的目录和文件;库里 show tables 显示的各种表也并不是实际存在的物理表,而全部是视图。下面列出一些较为常用的视图:
- SCHEMATE:该表提供了当前 mysql 实例中所有数据库的信息,show databases; 的结果取之此表。
- TABLES:该表提供了关于数据库中的表的信息(包括视图),详细表述了某个表属于哪个 schema、表类型、表引擎、创建时间等信息。show tables from schemaname 的结果取之词表。
- COLUMNS:该表提供了表中的列信息,详细表述了某张表的所有列以及每个列的信息。show columns from schemaname.tablename 的结果取之此表。
- STATISTICS:该表提供了关于表索引的信息。show index from schemaname.tablename 的结果取之此表。