DDL,Data Definition Language,数据库定义语言,该语言包括以下内容:
-- 查看所有的数据库
show databases
-- 创建数据库
create database [if not exists] test [charset=utf8]
-- 切换 选择 数据库
use test
-- 删除数据库
drop database [if exists] test
--修改数据库编码
alter database test character set utf8
注意:在sql server 中使用,if exists和mysql不同,sql server里面检查是否有这个表再删除,需要这样:if exists (select * from dbo.sysobjects where id = object_id(N’表名’) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
create table [if not exists]表名(
字段名,数据类型[(宽度)],约束,[comment'字段说明']
)
PS:记录一些数据类型的使用与sql server不同的地方(日后补充):
1.在SQL Server中, Tinyint类型表示一个无符号整数,它的取值范围是从0到255。而MySQL中,默认取值范围是从-128到127,可以通过unsigned关键字的使用,取值范围变为0到255
2.MySQL中没有nvarchar数据类型,但可以使用varchar类型来存储Unicode字符数据。使用utf8mb4字符集和正确的排序规则可以确保正确存储和比较Unicode字符数据
-- 查看数据库的其他表
show tables
-- 查看某个表的创建语句
show create table 表名 # 可以看到字段数据类型及长度还有约束等
-- 查看表结构
desc 表名 //这个真的很好用,比sql server方便很多!
-- 删除表
delete table 表名
-- 添加
alter table 表名 add 列名 数据类型(长度) [约束]
-- 修改 可以适用于很多修改
alter table 表名 change 旧列名 新列名 数据类型(长度) [约束]
-- 删除
alter table 表名 drop 列名
注意: SQL Server中修改字段名和数据类型需要分开修改,如下所示:
-- SQL Server
exec sp_rename '表名.旧列名','新列名'
alter table 表名 alter column 新列名 数据类型(长度)
-- mysql
rename table 表名 to 新表名
-- sql server
exec sp_rename '表名','新表名'
DML,Data Manipulation Language,用来对数据库中表的数据记录进行更新
关键字:
insert into 表(列1,列2,...) values (值1,值2,...) //插入一行
insert into 表(列1,列2,...) values (值1,值2,...),(值11,值22,...) //插入多行
insert into 表(列1,列2,...) select 值1,值2,... [from 其他表]
update 表名 set 字段名=值1 [where 条件]
delete from 表名 [where 条件] # 与sql server不同的是,sql server中可以直接使用 delete 表名,from可以省略
truncate table 表名 | truncate 表名
注意:delete和truncate原理不同,delete只删除内容,而truncate类似于drop table ,可以理解为将整表删除,然后再创建该表
表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性.
分类:
-- 在create table时,通过primary key关键字来指定主键
create table 表名(
<字段名> <数据类型> primary key
)
-- 在定义字段之后再指定主键
create table 表名(
...
[constraint <约束名>] primary key(字段名)
);
create table 表名(
...
[constraint <约束名>] primary key(字段1,字段2,...)
);
注意:联合主键的每一列都不能为空
alter table 表名 add primary key (字段) //可当列可多列
alter table 表名 drop primary key
语法: 字段名 数据类型 auto_increment
特点:
-- 创建表时指定
create table 表名(
字段 数据类型 primary key auto_increment,
...
) auto_increment=100
-- 创建表之后指定
create table 表名(
字段 数据类型 primary key ,
...
) auto_increment=100
alter table 表名 auto_increment=100
--
注意:设置了自增长的字段上,在mysql中,直接插入null值或者0,系统会默认成自增长的值,但是在sql server中会直接报错
# 创建表时指定
create table 表名(
字段 数据类型 not null ,
...
)
# 创建表之后指定
alter table 表名 modify 字段 数据类型 not null ;
# 方法1
alter table 表名 modify 字段 数据类型 ;
# 方法2
alter table 表名 change 字段 数据类型 ;
# 注意:如果是主键,不能直接删除非空约束
alter table 表名 drop primary key
alter table 表名 change 字段 数据类型 ;
# 方法1 创建表时指定
create table 表名(
字段 数据类型 unique, # 默认字段名就是约束名
...
)
# 方法2 创建表之后指定
alter table 表名 add constraint 约束名 unique(列名) ;
注意:添加唯一约束的时候系统会给添加一个索引 create unique index,默认名字是字段名
# 方法1
alter table 表名 drop index 约束名 ;
# 方法2
drop index 约束名 on 表名;
# 方法1 创建表时指定
create table 表名(
字段 数据类型 default 默认值 ,
...
)
#方法2 创建表之后指定
alter table 表名 modify 字段 数据类型 default 默认值 ;
# 方法1
alter table 表名 change 字段名 字段名 数据类型;
# 方法2
alter table 表名 modify 字段 数据类型 default null ;
create table 表名(
字段 数据类型 zerofill ,
...)
alter table 表名 modify 字段 数据类型 ;
DQL:Data Query Language 数据查询语言,用来查询数据库中的记录
select [all|distinct] 字段1 [别名1],字段2 [别名2]...
from 表名
where 条件
group by 分组字段
having 分组之后的条件 [asc|desc]
order by 排序
limit 数字或列表
详细用法见数据查询语言DQL
mysql通过关键字regexp支持正则表达式进行字符串匹配
-- ^ :在字符串开始处进行匹配
select 'abc' regexp '^a' --1
--$ : 在字符串末尾开始匹配
select 'abc' regexp 'a$' --0
select 'abc' regexp 'c$' --1
-- . :可以匹配除了换行符以外的任意字符
select 'abc' regexp 'a.' --1
select 'abc' regexp '.b' --1
select 'abc' regexp '.c' --1
select 'abc' regexp '.d' --0
-- [...] 匹配括号内的任意单个字符
select 'abc' regexp '[xyz]' --0
select 'abc' regexp '[xaz]' --1
-- [^...] 注意^符号只有在[]内才是取反的意思,在别的地方都是表示开始处匹配
select 'a' regexp '[^xyz]' --1
select 'x' regexp '[^xyz]' --0
select 'abc' regexp '[^a]' --1
-- a* 匹配0个或多个a,包括空字符串。 可以作为占位符使用.有没有指定字符都可以匹配到数据
SELECT 'stab' REGEXP '.ta*b' --1
SELECT 'stab' REGEXP '.(ta)*b' --1
SELECT 'stb' REGEXP '.ta*b' --1
SELECT 'stb' REGEXP '.(ta)*b' --0
SELECT '' REGEXP 'a*' --1
-- a+ 匹配1个或者多个a,但是不包括空字符
SELECT 'stab' REGEXP '.ta+b' --1
SELECT 'stb' REGEXP '.ta+b' --0
-- a? 匹配0个或者1个a
SELECT 'stb' REGEXP '.ta?b' --1
SELECT 'stab' REGEXP '.ta?b' --1
SELECT 'staab' REGEXP '.ta?b' --0
-- a1|a2 匹配a1或者a2
SELECT 'a' REGEXP 'a|b' --1
SELECT 'b' REGEXP 'a|b' --1
SELECT 'b' REGEXP '^(a|b)' --1
SELECT 'a' REGEXP '^(a|b)' --1
SELECT 'c' REGEXP '^(a|b)' --0
-- a{m} 匹配m个a
SELECT 'auuuuc' REGEXP 'au{4}c' --1
SELECT 'auuuuc' REGEXP 'au{3}c' --0
-- a{m,n} 匹配m到n个a,包含m和n
SELECT 'auuuuc' REGEXP 'au{3,5}c' --1
SELECT 'auuuuc' REGEXP 'au{4,5}c' --1
SELECT 'auuuuc' REGEXP 'au{5,10}c' --0
-- (abc) abc作为一个序列匹配,不用括号括起来都是用单个字符去匹配,如果要把多个字符作为一个整体去匹配就需要用到括号,所以括号适合上面的所有情况。
SELECT 'xababy' REGEXP 'x(abab)y' --1
SELECT 'xababy' REGEXP 'x(ab)*y' --1
SELECT 'xababy' REGEXP 'x(ab){2,3}y' --1
SELECT 'xababy' REGEXP 'x(ab){3}y' --0
//创建表时添加
create table 从表表名(
...,
[constraint 外键名 ] foreign key 列名 references 主键表(主键字段)
)
//创建表后添加
alter table 从表表名 add constraint 外键名 foreign key (列名) references 主键表名(主键字段)
//删除外键
alter table 表名 drop foreign key 外键名
注意:mysql对full join 的支持不好,一般用union 来达到目的