DDL
DDL:Data Definition Language,数据定义语言!
主要是用来定义和维护数据库的各种对象(比如库、表、索引和视图等),
也可以说操作的层次是在数据库和表的逻辑结构和存储结构上面,并没有对表中的实际的
数据进行操作!
主要的操作关键字:create、drop、alter等
DML
DML:Data manipulation Language,数据操作语言
主要是对表中的记录进行增删改查的操作!
其中,“查询”部分,又称为DQL(Data Query Language),数据查询语言!
主要的操作关键字:insert、delete、update、select等
DCL
DCL:Data Control Language,数据控制语言
主要是对数据库进行统一控制和统一管理的工作,比如并发控制、存取控制、安全控制等;
具体的有:数据库的权限管理,数据的备份与恢复等!
-- 从入门开始,从入门开始,从入门开始,从入门开始,从入门开始,-------
-- -------------------------------数据库操作---------------------------------
#创建数据库(增) create
#create database 数据库名 [字符集 校对规则];
create database test1;
或者
create database if not exists test1;
#创建表测试
use test1;
create table t1 (
id int,
name varchar(10)
)engine=innodb;
#增加测试数据
insert into t1 values(1, 'a'),(2, 'A'),(3, 'b'), (4,'B');
#在没有指定校验规则下,也就是不区分大小写,结果查出两条
select * from t1 where name = 'a';
#查看数据库 (查) show
show databases;
#查看数据库创建语句
show create database test1;
#删除数据库 (删) drop
drop database test1;
或者
drop database if exists test1;
#修改数据库 (改) alter
#数据库的名称不可通过sql语句进行修改!只能修改数据库的库选项信息
#如果现在就是想修改数据库名,应该怎么办?
#1,直接修改目录名!但是要谨慎,因为有时候不是所有数据库下的表都放在同一个地方!
#2,把当前所有的数据表导出,创建一个新的数据库,把导出的数据表再导入进来,最后再删除以前的数据库!
alter database 数据库名 新的库选项;
alter database test1 default charset utf8;
#通过rename语法实现数据库的重命名
#1,先创建一个新的数据库
#2,就旧数据库下所有的数据表rename到新的数据库下
#3,删除旧数据库
rename table 表名 to 数据库名.数据表名;
-- ------------------------------数据表操作---------------------------------------
#创建数据表(增) 关键字:create
create table [if not exists]表名(
字段名1 字段类型,
字段名2 字段类型,
.......
)[表选项];
create table t1(
a int,
b float
);
#增加一条测试数据
insert into t1 values(1, 5.20), (2, 3.34);
#查看数据表 (查) 关键字: show
show tables;
show create table 表名;
show create table t1;
#查看数据表的表结构
desc t1;
#删除数据表 (删) 关键字: drop
drop table 表名;
drop table t1;
#如果删除一个不存储的表,会报错,所以,还有一个比较完整的语法形式:
drop table if exists t1;
#修改数据表 (改) 关键字: alter
#表中有哪些地方可以修改?
#1,表名
#2,字段类型,字段名、增加字段、删除字段等,统称为列定义
#3,表选项
#上面的修改数据表的指令都可以分成上级命令+下级命令来记忆,其中上级命令都是一样的,
-- 上级命令
alter table 表名 .....
-- 下级命令
#增加:add
#删除:drop
#重命名表名:rename
#重命名字段名:change
#修改:modify
#修改表名,下级命令: rename
alter table 表名 rename to 新表名;
alter table t1 rename to t2;
-- 还有另外一种语法
rename table 旧表名 to 新表名;
rename table t2 to t1;
#还可以利用rename语法实现将一个数据库的数据表移动(剪切)到另一个数据库下:
rename table 表名 to 数据库名.数据表名;
#修改列定义,又可以分成很多操作,常见的有:
#增加一列,下级命令: add
alter table 表名 add 新列名 列类型;
alter table t1 add c varchar(10);
#新增的列默认是在整个字段的最后面,如果想排在最前面,需要在语句的后面加上first关键字!
alter table 表名 add 新列名 列类型 first;
alter table t1 add d varchar(10) first;
#如果是想排在另外一个字段名的后面,需要使用after关键字:
alter table 表名 add 新列名 列类型 after 字段名;
alter table t1 add e varchar(10) after a;
#删除一列,下级命令: drop
alter table 表名 drop 字段名;
alter table t1 drop e;
#修改一列, 下级命令: modify
alter table 表名 modify 字段名 新的字段类型;
alter table t1 modify c float;
#修改已有的字段排序
alter table 表名 modify 字段名1 字段类型 after 字段名2;
alter table 表名 modify 字段名 字段类型 first;
#重命名字段, 下级命令: change
alter table 表名 原字段名 新字段名 新字段类型;
alter table t1 change a aa varchar(10);
#修改表选项
alter table 表名 新的表选项;
alter table t1 engine Myisam default charset utf8;
-- --------------------------------数据的操作-----------------------------------
DML语言,增删改查
-- 创建一张测试表
create table student (
stu_name varchar(20),
stu_gender enum('male', 'famale'),
stu_age tinyint unsigned,
stu_tel varchar(20)
);
#插入数据(增), 关键字:insert
#1,字段列表可以是该表的全部字段,也可以是部分字段(也就是只插入部分数据,
# 其他的默认为null,表示什么都没有)
#2,字段列表可以和原表中的字段列表的顺序不一样,但是要保证和后面值列表的顺序是一一对应的!
insert into 表名(字段名1, 字段名2,.....) values(值1,值2.......);
insert into student(stu_name, stu_gender) values('张三', 'male');
#省略字段名,但值得顺序必须和字段名顺序一致
insert into student values('李四', 'male', 22, '13812345678'),
('王五', 'male', 25, '13812345452'),
('马六', 'male', 27, '13812345852');
#插入数据的另一种写法
insert into 表名 set 字段1=值1,字段2=值2,字段3=值3......;
#查询数据 (查), 关键字:select
select *|字段列表 from 表名 [查询条件];
select * from student;
#删除数据(删), 关键字: delete
#在实际的应用中,这里的删除条件也往往是必须的,
#因为如果省略,就代表删除了该表中的所有的记录!而且默认也不可逆的!
delete from 表名 [删除条件];
delete from student where stu_age is null;
#修改数据 (改), 关键字: update
#和删除数据一样,这里的修改条件也往往是必须的,
#因为如果省略,整个数据表的所有的记录都受影响!
update 表名 set 字段1=值1, 字段2=值2....[修改条件];
update student set stu_age = stu_age + 1 where 1;
-- -------------------------字符集-------------------------------------
#查看当前MySQL服务器支持哪些字符集
show charset;
gbk :一个汉字占用2个字节!
utf8:一个汉字占用3个字节!
为什么会出现乱码?
如果两个软件所采用的默认字符集不同,又没有进行相应的转换或说明,就会出现乱码!
字符集是多个字符(英文字符,汉字字符,或者其他国家语言字符)的集合,
字符集种类较多,每个字符集包含的字符个数不同。
①字符编码方式是用一个或多个字节表示字符集中的一个字符!
②每种字符集都有自己特有的编码方式,因此同一个字符,
在不同字符集的编码方式下,会产生不同的二进制!
#查看MYSQL系统变量值
show variables like '%character%';
库、表、列字符集的由来
①建库时,若未明确指定字符集,则采用character_set_server指定的字符集。
②建表时,若未明确指定字符集,则采用当前库所采用的字符集。
③新增时,修改表字段时,若未明确指定字符集,则采用当前表所采用的字符集。
设置字符集编码
set names 'utf8';
相当于同时设置:
set character_set_client = utf8;
set character_set_results = utf8;
set character_set_connection = utf8;
-- -----------------------------校对规则--------------------------------------
校对规则(collation):
是在字符集内用于字符比较和排序的一套规则,比如有的规则区分大小写,有的则无视。
校对规则都基于字符集的,每一套字符集都有与之相关的校对规则!
通过show collation命令来查看当前数据库有哪些排序规则:
只看utf8_开头的
show collation like '%utf8_%';
常见的有:
ci结尾的:不区分大小写(针对英文)
cs结尾的:区分大小写(针对英文)
bin结尾:二进制编码比较
#utf8不支持中文比较,但是gbk支持(比较拼音)
#修改校对规则的语法为:
alter database 数据库名 default collate utf8_general_ci;
alter database test1 default collate utf8_general_ci;
由于校对规则都是基于字符集的,所以修改了相关校对规则之后,可能会自动的修改了默认的字符集: