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:存储了系统的用户权限信息。

数据库的增删改查

  1. 增:create database test1
  2. 删:drop database test1
  3. 改:没有这样的需求,也没有这样的功能
  4. 查: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;

索引的增删改查


  1. 普通索引: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)


  2. 普通索引:alter table tablename drop index index_name
    主键索引:alter table tablename drop primary key

  3. 改:索引有改操作吗?现在还不知道


  4. show index from tablename
    show keys from tablename

数据的增删改查

  1. 增:就是 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 在插入大量记录时,节省很多的网络开销,大大提高插入效率。

  1. 删:就是 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 条件将会把所有记录删除。

  2. 改:就是 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;

  3. 查:就是 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 的结果取之此表。
posted @ 2017-07-09 12:28  clearbug  阅读(381)  评论(0编辑  收藏  举报