文章目录
一、sql语句分类
1.DDL(数据定义语句)
create 创建数据库,数据表
create 创建数据库语句:
mysql>create database testdemotb(表名;
create 创建表语句语法:
mysql>create table 表名(
列名1 数据类型 [约束条件]
列名2 数据类型 [约束条件]
...
[表级约束条件]
)[engine=存储引擎] [default charset=utf8mb4];
mysql>create table[if exists] employees(
student_id int primary key auto_increment,
student_age int not null,
student_score int not null,
student_height int not null,
student_weight int not null
)engine=innodb default charset=utf8mb4;
alter 修改数据或结构
查看表结构
mysql>desc employees;
修改表名称
1.alter table 旧表名称 rename 新表名称
2.rename table 旧表名称 to 新表名称
alter 添加字段:
mysql>alter table employees add student_name varchar(20);
alter 删除字段
mysql>alter table employees drop student_name varchar(20);
alter 修改字段
mysql>alter table employees change student_weight student_name varchar(20);
drop 删除库和表
删除数据库
mysql>drop database testdemotb;
删除数据表
mysql>drop table employees;
2.DML语句(数据库操作语句)
insert 插入语句
上面我们准备了一张employees数据表 现在写一些数据插入这张数据表.
mysql>INSERT INTO employees (
) VALUES
(1,19, 90, 168, 60),
(2,20, 78, 180, 75),
(3,18, 92, 172, 58),
(4,21, 85, 185, 80);
update 修改表
cmysql>update employees set student_age=88 where student_id=1;
3.DQL语句(数据库查询语句)
查看数据库:
mysql>show databases;
切换数据库:
mysql>use testdemotb;
查看数据表:
mysql>show tables
查看表数据:
select * from employees;
4.DCL语句(数据库权限语句)
grant(权限)
主从复制给予权限
mysql>grant replication slave on *.* to 'repl'@'%';
刷新权限
mysql> fulsh privileges ;
二. sql语句如何执行的
server and engine
可以看看丁奇《MySQL实战45讲》 上述图片来自那里
MySQL服务器分为server层和存储引擎层,每一条sql语句都会在其中进行,每一个模块都有自己的功能。
例如:select * from students具体如何实现的;
1.客户端连接MySQL 可以用 show processlist 查看当前用户连接状态和权限
2.MySQL5.5.5版本之后就没有查询缓存了,所有这里直接省略
3.到达分析器,主要工作是,查看sql语句词汇语法是否正确,这里是查看students表是否存在
4.优化器查看索引,执行计划,当出现多个索引时,会选择最快的那一个进行索引并执行
5.server层最后的执行器开始执行这select * from students 这个sql语句
6.查询完成之后,返回到存储引擎
存储引擎
mysql> engine=innodb(mysql默认)
mysql>engine=myisam
mysql>engine=memory
区别
innodb是MySQL默认存储引擎
1.事务方面:innodb支持事务,myisam不支持
2.外键:innodb支持外键,myisam不支持
3.锁:innodb默认行锁或者表锁,myisam默认表锁
4.索引:innodb为聚簇索引(b+树)数据存放在叶子节点上,所以必须要有主键。myisam是非聚簇索引 数据和索引是分开的
5.mvcc(多版本并发控制): innodb支持 myisam不支持
6.count(*) innodb比较慢 因为都在叶子节点上会考虑索引问题 。myisam比较快 因为数据本来就记录这个表的行数
总结:这些差别最终会造成[读写性能和并发处理上]的差距
myisam在读方面性能比较高,而innodb在读写方面计较均衡