SQL语法之DDL和DML
SQL语法之DDL和DML
DDL数据库定义语言
create 创建
alter 修改
drop 删除
drop和delete的区别
truncate
DML 数据操作语言
insert 插入数据
update 修改已有数据
delete from删除表中数据
数据库约束
空值与非空
primary key
auto_increment
unique
foreign key
级联删除
default
索引
---------------------
DDL(数据库定义语言)
操作表结构
create (创建)
创建表
create table [if not exists] 表名(
列名 列类型,
列名 列类型,
...
);
创建表并从其他表中复制数据
create table 表名
as
select * from 表名
alter (修改)
添加列定义 (列名必须是原表中不存在的)
alter table 表名 add(
列名 数据类型 ,
...
);
修改列定义 (列名必须是原表中存在的)
alter table 表名 modify 列名 数据类型;
MySQL中 一次只能修改一个列定义
如果修改数据列的默认值,只会对以后插入操作有作用,对以前已经存在的数据不会有任何影响
删除列
alter table 表名 drop 列名;
重命名数据表
alter table 旧表名 rename to/as 新表名;
改列名
alter table 表名 change 旧列名 新列名 type;
改列名并修改数据类型
alter table 表名 change 旧表名 新表名 type [default expr] [first | after 列名];
修改数据库成utf8的.
mysql> alter database 数据库名 character set utf8;
修改表默认用utf8.
mysql> alter table 表名 character set utf8;
修改字段用utf8
mysql> alter table 表名 modify type_name varchar(50) CHARACTER SET utf8;
drop (删除)
-删除表
drop table 表名
- 表结构被删除,表对象不再存在
- 表里的数据也被删除
- 该表的所有相关索引,约束也被
drop和delete的区别
- drop只是针对表结构
drop table 表名;
从数据库中删除这张表 - delete针对表数据
delete table 表名;
清空这张表中的所有数据
truncate
truncate 表名;
删除表中的全部数据,但保留表数据.
相对于delete而言,速度更快,
不能像delete能删除指定的记录,truncate只能一次性删除整个表中的全部记录
DML (数据操作语言)
操作数据表中的数据
insert (插入数据)
- 按列的地理顺序插入
insert into students values(
1,'张三','男',25,'123467890'
);
- 当只需要插入部分数据,或者不按照顺序插入
insert into students (name,sex,age) values('田七','男',30);
- 从其他表中一次插入多条数据
inster into 表名 (列名1,列名2,...)
select 列名 from 表名;
要求选择出来的数据列和插入目的地的数据列个数相同,类型匹配.
MySQL提供了一种扩展语句,可以一次插入多条语句
insert into students values
(1,'张三','男',25,'123467890'),
(2,'李四','男',22,'0987654321'),
(3,'王五','男',20,'0984324321'),
(4,'赵六','男',29,'0944654321');
update (修改已有数据)
upadte用于修改数据表的记录,每次可以修改多条记录.通过使用where
子句限定修改哪些记录. where
类似于Java中的if
,只有符合条件的记录才会被修改,没有where
限定的值总是为true
,
表示该表的的所有记录都会被修改
update 表名 set
列名1=值1,
列名2=值2,
...
[where 条件];
delete from(删除表中数据)
delete from
语句用于删除指定数据表记录,使用delete from
时不需要指定列名,因为总是整行的删除.
delete from 表名 [where 条件];
使用where
指定删除满足条件的记录,不使用where
时删除全部记录
数据库约束
通过约束可以更好的保证数据表中数据的完整性.
约束是在表上强制执行的数据校验规则.
当表中数据存在相互依赖性时,可以保护相关的数据不被错误的删除.
约束分为表级约束和列级约束
约束类型包括 :
- not null (非空约束);
- primary key (主键约束);
- unique key (唯一约束);
- default (默认约束);
- foreign key (外键约束);
- check (检查) mysql中不支持
空值与非空
- NULL ,字段值可以为空
NOT NULL,字段值不允许为空
创建表的时候添加约束
create table tb(
username varchar(20) not null,
age tinyint unsigned null
);
- 表创建好之后增加删除非空约束
--增加非空约束
alter table tb
modify age tinyint unsigned not null;
--删除非空约束
alter table tb
modify username carchar(20) null;
--取消非空约束并制定默认值
alter tabel tb
modify age tinyint unsigned null default 90;
primary key
- 主键约束相当于非空约束和唯一约束,即不能出现重复值,也不允许出现null值
- 每张数据表只能存在一个主键
- 主键保证记录的唯一性
主键自动为
not null
创建表时使用列级约束语法
create table primary_test(
--创建主键约束
test_id int primary key,
test_name varchar(255)
)
- 创建表时使用表级约束语法
create table primary_tset2(
test_id not null,
test_name varchar(255),
test_pass carchar(255),
--指定主键约束名为test2_pk,对大部分数据库有效,但对mysql无效,
--mysql数据库中该主键约束名依然是PRI
constraint test2_pk primary key(test_id)
);
- 创建表时建立组合主键约束
create table primary_test3(
test_name varchar(255),
test_pass varchar(255),
primary key(test_name,test_pass)
);
- 表被创建好之后添加主键约束
--使用add关键字
alter table primary_tset3
add primary key(test_name,test_pass);
--使用modify关键字
--为单独的列添加主键约束
alter table primary_test3
modify test_name varchar(255) primary key;
- 删除数据表的主键约束
alter table primary_test3
drop primary key;
auto_increment
- 自动编号,且必须和主键组合使用
- 默认情况下,起始值为1,每次的增量为1
create table tb2(
id smallint unsigned auto_increment primary key,
username varchar(20) not null
);
一旦指定了某列具有自增长特性,则向该表插入记录的时候不可为该列指定值,
该列的值由数据库系统自动生成
unique
- 唯一约束保证了记录的唯一性
- 唯一约束的字段可以为空
每张数据表可以存在多个唯一约束
建表时创建唯一约束 使用列级约束语法
create tabel unique_test(
test_id int not null ,
--建立唯一约束,test_name不能出现相同的值
test_name varchar(255) unique
);
- 建表时使用表级约束为多列组合建立唯一约束
create table nuique_test2(
test_id int not null,
test_name varchar(255),
test_pass varchar(255),
--使用表级约束语法建立唯一约束
unique (test_name),
--使用表级约束语法建立唯一约束,并指定约束名
constraint test2_nk unique (test_pass)
);
上面分别为name和pass建立唯一约束,意味着这两列都不能出现重复值
- 建表时建立组合唯一约束
create table nuique_test3(
test_id int not null,
test_name varchar(255),
test_pass vatchar(255),
--使用表级约束语法建立唯一约束,指定两列组合不能为空
constraint test3_nk unique (test_name,test_pass)
);
上面的情况要求name和pass组合的值不能出现重复
- 表创建以后修改删除唯一约束
-添加唯一约束
alter table unique_test3
add unique(test_name,test_pass);
--使用modify关键字为单列采用列级约束语法添加唯一约束
alter table student
modify test_name varchar(255) unique;
--删除unique_tset3表上的test3_uk唯一约束
alter table unique_test3
drop index test3_uk;
foreign key
- 保证数据一致性,完整性
- 实现一对一或一对多关系
- 外键约束的要求
- 父表和子表必须使用相同的存储引擎,而且禁止使用临时表;
- 数据表的存储引擎只能是InnoDB
- 外键列和参照列必须具有相似的数据类型,其中数字的长度或者是有符号位必须相同;而字符的长度则可以不同
- 外键列和参照列必须创建索引,如果外键列不存在索引,MySQL将自动创建索引
子表:有foreign key的表
父表:被参照的表
- 采用列级约束语法建立外键约束直接使用references关键字,references指定该列参照哪个主表,以及参照主表的哪一个列
-为了保证从表参照的主表存在,通常应该先建立主表
create table teacher_table1
(
teacher_id int auto_increment,
teacher_name carchar(255),
primary key(teacher_id)
);
create table student_table1
(
--为本表建立主键约束
sutdent_id int auto_increment primary key,
sutdent_name carchar(255),
--指定java_teacher参照到teacher_table1的teahcer_id列
java_teahcer int references teacher_table1 (teacher_id)
);
上面这种方法在mysql中不会生效,仅仅是为了和标准的SQL保持良好的兼容性,
因此如果要使mysql中的外键约束生效,则必须使用表级约束语法
- 表级约束语法
create table teacher_table
(
teacher_id int auto_increment,
teacher_name varchar(255),
primary key(teacher_id)
);
create table student_table
(
student_id int auto_increment primary key,
student_name varchar(255),
java_teacher int,
foreign key(java_teacher) references teacher_table(teacher_id)
);
!
以上这种方法没有指定约束名,mysql则会为该外键约束名命名为table_name_ibfk_n,其中table_name时从表的表名,而n时从1开始的整数
建立多列组合的外键约束
foreign key(列名1,列名2,...) references 引用的表名(引用的列名1,引用的列名2,...)
- 表级约束语法,并指定外键约束名
create table teacher_table
(
teacher_id int auto_increment,
teacher_name varchar(255),
primary key(teacher_id)
);
create table student_table
(
student_id int auto_increment primary key,
student_name varchar(255),
java_teacher int,
constraint student_teacher_fk foreign key(java_teacher) references teacher_table(teacher_id)
);
- 添加外键约束
alter table 表名
add foreign key(列名1[,列名2,...])
references 引用的表名(引用的列名1[,引用的列名2,...]);
- 删除外键约束语法
alter table 表名
drop foreign key 约束名;
级联删除
如果想定义删除主表记录时,从表记录也被删除,则需要在建立外键约束后添加
on delete cascade 或者 on delete set null
第一种是删除主表记录时,把参照该主表记录的从表记录全部级联删除
第二种是指定当删除主表记录时,把参照该主表记录的从表记录的外键设置为null
default
- 默认值
- 当插入记录时,如果没有明确为字段赋值,则自动赋值为默认值
索引
索引总是从属于数据表,但它也和数据表一样属于数据库对象.
创建索引的唯一作用就是加快对表的查询,索引通过四通快速路径访问方法来快速定位数据,
从而减少磁盘I/O.
创建索引的两种方式
- 自动:当在表上定义主键,唯一和外键约束时,系统自动为该数据列创建对应索引
- 手动:通过create index..语句创建索引
删除索引的两种方式
- 自动:数据表被删除时,该表上的索引自动被删除
- 手动:通过drop index..
语句删除索引
- 创建索引
create index index_name on table_name (列名1[,列名2,...]);
- 删除索引
drop index index_name
on 表名;
在mysql数据库中,以为只要求同一个表内索引不能同名,所以删除索引时必须指定表名
而在例如Oracle数据库中要求索引名必须不同,所以无须指定表名.
SQL语法之DDL和DML的更多相关文章
- SQL中的DDL、DML、DCL、TCL
1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...
- SQL语言分类DDL、DML、DQL、TCL、DCL
关系型数据库的SQL语句都可以分为4大类: 1. DDL(数据定义语言) DDL 主要是指如下的四种SQL 语句,以 CREATE.DROP.ALRET开头和 TRUNCATE TABLE 语 ...
- SQL中有关DQL、DML、DDL、DCL的概念与区别?
SQL(Structure Query Language)结构化查询语言是数据库的核心语言,是高级的非过程化编程语言.它功能强大,效率高,简单易学易维护.SQL语言基本上独立于数据库本身.使用的机器. ...
- jdbc java数据库连接 3)Statement接口之执行DDL、DML、DQL
|- Statement接口: 用于执行静态的sql语句 |- int executeUpdate(String sql) : 执行静态的更新sql语句(DDL,DML) |- ResultSet ...
- JAVA-Unit01: 数据库原理 、 SQL(DDL、DML)
Unit01: 数据库原理 . SQL(DDL.DML) SQL语句是不区分大小写的,但是行业里习惯将关键字与分关键字用大小写岔开以提高可读性. SELECT SYSDATE FROM dual DD ...
- SQL之DDL、DML、DCL、TCL
SQL SQL(structured query language)是一种领域特定语言(DSL,domain-specific language),用于管理关系型数据库(relational data ...
- [转]MySQL 最基本的SQL语法/语句
MySQL 最基本的SQL语法/语句,使用mysql的朋友可以参考下. DDL-数据定义语言(Create,Alter,Drop,DECLARE) DML-数据操纵语言(Select,Delete ...
- Hadoop Hive sql语法详解
Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...
- 面试必须要知道的SQL语法,语句
面试必须要知道的SQL语法,语句 收藏 asc 按升序排列desc 按降序排列下列语句部分是Mssql语句,不可以在access中使用.SQL分类: DDL—数据定义语言(Create,Alter,D ...
随机推荐
- 高斯消元和高斯约旦消元 Gauss(-Jordan) Elimination
高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵. 在讲算法前先介绍些概念 矩阵的初等变换 矩阵的初等变换又分为矩阵的初等行变换和矩阵的初等列变换 ...
- 禁止input文本框输入select无法选择
readonly.disabled.autocomplete readonly表示此域的值不可修改,仅可与 type="text" 配合使用,可复制,可选择,可以接收焦点,后台会接 ...
- Python程序的执行过程
1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...
- spring源码学习之容器的扩展(二)
六 BeanFactory的后处理BeanFactory作为spring容器的基础,用于存放所有已经加载的bean,为了保证程序上的高扩展性,spring针对BeanFactory做了大量的扩展,比如 ...
- linux下定位文件
参考:http://www.cnblogs.com/ccode/p/4033088.html: 在linux命令行模式下,经常会遇到定位文件的问题,这时候采用locate和find都是可以的,下面简述 ...
- LUOGU P1290 欧几里德的游戏
题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数 ...
- poj 2318 TOYS(计算几何 点与线段的关系)
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12015 Accepted: 5792 Description ...
- 文件上传之Java篇
最近做了一个下载文档的功能,于是联想到了上传功能,于是自己研究了一下后台语言是java的情况下怎样实现将文件上传到指定的目录,以下是项目的语言: 1.后台用jfinal框架 2.前台用jquery提交 ...
- 使用openssl 生成网站证书
*.key是私钥文件 证书通常以.crt为后缀,表示证书文件 CSR(Certificate Signing Request)包含了公钥和名字信息.通常以.csr为后缀,是网站向CA发起认证请求的文件 ...
- 使用Python进行文件操作
作为高级语言,对文件进行操作时必不可少的功能.那么,Python是怎么对文件进行操作的呢? 1.什么是文件? 文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容. 文件包括两种类型:文本文件 ...