SQL的全称是Structured Query Language,也就是结构化查询语言。SQL是操作和检索关系数据库的标准语言,标准的SQL语句可用于操作任何关系数据库。
使用SQL语句,程序员和数据库管理员(DBA)可以完成如下任务。
- 在数据库中检索信息
- 对数据库的信息进行更新
- 改变数据库的结构
- 更改系统的安全设置
- 增加或回收用户对数据库、表的许可权限
在上面5个任务中,一般程序员可以管理前三个任务,后面两个任务通常由DBA来完成
标准的SQL语句通常分为如下几种类型
- 查询语句:主要有select关键字完成,查询语句是SQL语句中最复杂、功能最丰富的语句。
- DML(Data Manipulation Language,数据库操作语言)语句:主要由insert、 update和delete三个关键字完成。
- DDL(Data Definition Language,数据库定义语言)语句:主要由create、alter、drop和truncate四个关键字完成。
- DCL(Data Control Language,数据控制语言)语句:主要由grant、和revoke两个关键字完成
一、DDL语句
DDL语句是操作数据库对象的语句,包括创建(create)、删除(drop)、和修改(alter)数据库对象。
常见的数据库对象
对象名称 | 对应关键字 | 描述 |
表 | table | 表是存储数据的逻辑单元,以行和列的形式存在;列就是字段,行就是记录 |
数据字典 | 就是系统表,存放数据库相关信息的表。系统表里的数据通常由数据库系统维护,程序员通常不应手动修改系统表及系统表数据,只可查看系统表数据 | |
约束 | constraint | 执行数据校验的规则,用于保证数据完整性的规则 |
视图 | view | 一个或多个数据表里数据的逻辑显示。视图并不存储数据 |
索引 | index | 用于提高查询性能,相当于书的目录 |
函数 | function | 用于完成一次特定的计算,具有一个返回值 |
存储过程 | procedure | 用于完成一次完整的业务处理,没有返回值,但可以通过传出的参数将多个值传给调用环境 |
触发器 | trigger | 相当于一个事件监听器,当数据库发生特定事件后,触发器被触发,完成相应的处理 |
1.创建表的语法
// 标准的建表语句语法如下:
create table [模式名.]表名
(# 可以有多个列定义
columnNamel datatype [default expr],
........)
如果指定列的默认值,则使用default关键字,而不是使用等号(=)
// 例如 建立下面一个表test
create table test(
# 整型通常使用int
test_id int,
# 小数点数
test_price decimal,
# 普通长度文本,使用default 指定默认值
test_name varchar(255) default 'xxx',
# 大文本类型
test_desc text,
# 图片
test_img blob,
# 时间类型
test_data datetime
);
列类型 | 说明 |
tinyint/smallint/mediumint int(integer)/bigint | 1字节/2字节/3字节/4字节/8字节整数,又可分为有符号和无符号两种。这些整数类型的区别仅仅是表示数的范围不同 |
float/double | 单精度、双精度浮点型 |
decimal(dec) | 精确小数类型,相对于float和double不会产生精度丢失的问题 |
date | 日期类型,不能保存时间。把java.util.Date对象保存进date列时,时间部分将会丢失 |
time | 时间类型,不能保存日期。把java.util.Date对象保存进time列时,日期部分会丢失 |
datetime | 日期、时间类型 |
timestamp | 时间戳类型 |
year | 年类型,仅仅保存时间的年份 |
char | 定长字符串类型 |
varchar | 可变长字符串类型 |
binary | 定长二进制字符串类型,它以二进制形式保存字符串 |
varbinary | 可变长度的二进制字符串类型,它以二进制形式保存字符串 |
tinyblob/blob/mediumblob /longblob | 1字节/2字节/3字节/4字节的二进制大对象,可用于存储图片、音乐等二进制数据,分别可存储:255B/64KB/16MB/4GB大小 |
tinytext/text/mediumtext /longtext | 1字节/2字节/3字节/4字节的文本对象,可用于存储超长长度的字符串,分别可存储:255B/64KB/16MB/4GB大小的文本 |
enum(‘value1’,'value2',...) | 枚举类型,该列的值只能是enum后括号里多个值之一 |
set(‘value1’,'value2',...) | 集合类型,该列的值可以是set后括号里多个值的其中几个 |
// 子查询建表语句语法:
create table [模式名.]表名[column[,column...]] as subquery;
例如:
// 创建hehe数据表,该数据表和user_inf完全相同,数据也完全相同
create table hehe as select * from user_inf;
2. 修改表格结构的语法
修改该表结构使用alter table,修改表结构包括增加列定义、修改列定义、删除列定义、删除列、重命名列等操作。
// 增加列定义的语法如下:
alter table 表名
add(
# 可以有多个列定义
column_name1 datatype [default expr],
...);
// 为数据表增加字段的SQL语句如下:
// 为hehe数据表增加一个字段hehe_id,该字段的类型为int
alter table hehe
add hehe_id int;
// 为hehe数据表增加字段aaa、bbb,两个字段的类型为varchar(255)
alter table hehe
add (aaa varchar(255) default 'xxx',
bbb varchar(255));
// 修改列定义的语法如下:
alter table 表名
modify column_name datatype [default expr] [first|after col_name];
// 将hehe表的hehe_id列修改成varchar(255)类型
alter table hehe
modify hehe_id varchar(255);
// 将hehe表的bbb列修改成int类型
alter table hehe
modify bbb int;
// 从数据表中删除列的语法比较简单:
alter table 表名
drop column_name;
// 删除hehe表中的aaa字段
alter table hehe drop aaa;
MySql提供了两种特殊的语法:
重命名数据表和完全改变列定义
// 重命名数据表的语法:
alter table 表名
rename to 新表名
// 如下sql语句将hehe数据表重命名为wawa
alter table hehe
rename to wawa;
// alter table语法的change选项,用于改变列名。change选项语法如下:
alter table 表名
change old_column_name new_column type[default expr] [first|alter col_name]
// 将wawa数据表的bbb字段重命名为ddd
alter table wawa
change bbb ddd int;
3.删除表的语法
// 删除表语法的格式
drop table 表名
//例如
drop table wawa;
删除数据表的效果如下:
- 表结构被删除,表对象不在存在
- 表里的所有数据也被删除
- 该表所有相关的索引、约束也被删除
4.truncate表
对于大部分数据库而言,truncate都被当成DDL处理,truncate被称为截断某个表——它的作用是删除表里的全部数据,但保留表结构。相对于DML里的delete命令而言,truncate的速度要快的多,而且truncate不想delete可以删除指定的记录,truncate只能一次性删除整个表的全部记录。
// truncate命令的语法如下
truncate 表名