基本操作:
-- 登入数据库 mysql -uroot -proot -h 127.0.0.1 -P 3306 -- 查看数据库、表 show databases show tables -- 查看指令的用法 ? create -- 创建数据库 create database databaseName; -- 查看创建过程,加\G纵向排列 show create database databaseName \G ; -- 选择数据库 use databaseName; -- 创建数据库 create table IF NOT EXISTS tableName( id int(11) primary key auto_increment, name varchar(32) not null UNIQUE, sex char(1) default '男', deptId int(11), -- 定义主键 primary key(id), -- 定义外键 CONSTRAINT fk_tableName_deptId FOREIGN KEY(deptId) REFERENCES tb_dep1(id) on delete cascade on update cascade, -- 删除、更新联动 -- 定义唯一健 CONSTRAINT STH UNIQUE(name) )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci auto_increment=1000 -- 从1000开始自增 COLLATE:字符的存储方式,有三种值: utf8_bin:是将字符串中的每个字符用二进制数据存储,区分大小写。 utf8_general_cs:(case sensitive):大小写敏感 utf8_general_ci:(case insensitive):大小写不敏感 -- 查看表结构 desc tableName;
外键:
为保证数据的完整性而定义:
一个表的外键必须为主键,可以是本表,也可以使其他表。
外键字段添加数据必须为主键中已有的字段,或者是null。
创建外键时父子表中的字段类型必须一致,父子表的存储引擎必须都是InnoDB。
外键的联动策略:
cascade: 主从联动
no action: 从表限制主表
如果一个主键是其他表的外键,则这个字段删除前必须删除外键所在的记录。
创建外键:
CONSTRAINT fk_tableName_deptId FOREIGN KEY(deptId) REFERENCES tb_dep1(id)
alter table tableName add FOREIGN KEY(deptId) REFERENCES tb_dep1(id)
10. 修改表名 alter table oldTableNmae rename [to] newTablName 11. 修改字段类型、排列顺序 alter table tableName modify column varchar(32) [frist][after column] 12. 修改字段名 alter table tableName change oldcolumn newcolumn varchar(32) 13. 添加字段(在第一列或在某一列之后) alter table tableName add newcolumn varchar(32) [frist][after column] 14. 删除字段 alter table tableName drop column 15. 修改表的引擎 alter table tableName engine=InnoDB; 16. 删除、添加外键约束 alter table tableName drop FOREIGN KEY(deptId) REFERENCES tb_dep1(id); alter table tableName add CONSTRAINT fk_tableName_deptId FOREIGN KEY(deptId) REFERENCES tb_dep1(id) on delete no action on update cascade 17. 添加主键 alter table tableName ADD primary key(id); 18. 添加唯一约束 添加唯一约束即给该字段添加了一个索引 alter table tableName add unique(id); 19. 删除约束 alter table tableName drop index indexName; -- 删除有名称索引 drop index columnName on tableName; -- 删除没名称索引 20. 查看警告: show warnings; 21. 查看数据库大小 select table_name,index_length,data_length from information_schema.tables where table_schema like 'schoolBD'
DML
1. 插入数据 insert into tableName (column1,column2) values('aa','bb'),('aa','bb'); insert into tableName values('aa','bb'),('aa','bb'); 如果数据存在则执行更新操作 insert into tableName (column1,column2) values('aa','bb'),('aa','bb') ON DUPLICATE KEY UPDATE column1=VALUES(column1)+VALUES(column2); 表数据的复制 insert into tableName (column1,column2) select column1,column2 from oldTableNmae; 如果数据存在就替换,以主键、唯一健确定唯一性。不存在直接新增。 replace into tableName (column1,column2) values('aa','bb'),('aa','bb'); 2. 更新数据 update tableName set column1=value1,column2=value2 where condition; 3. 删除数据 delete from tableName where condition; truncate table tableName; 区别:delete 是DML语句,是删除表数据。 truncate 是DDL语句,是将删表后再建表。因此清表时执行速度比delete 块 关联删除,需指定删除的表 delete t1 from tableName1 t1 left join tableName2 t2 on t1.id =t2.id
25. 运算符:
1. = 与安全等于运算符<=> 区别:=不能用来比较null,<=>可以用来比较null。相等返回1,不等返回0.
2. !=与<> 没任何区别。都不能用来比较null。
26. 字母比较运算符:
1. least(0,20,30),不能比较null, greatest(10,20,30)
27. 视图
视图是一种虚表,它并不真实存在,它依赖于原表中的数据。
创建视图可以以表为基表,也可以以视图为基表。
1. create view tableNameView as select columnName1 as 列1,columnName2 as 列2 from tableName;
2. create view tableNameView (列1,列2) as select columnName1,columnName2 from tableName;
视图的增删改:
1. 如果视图以单表为基表,则可以删除、新增,多表不行。
2. 新增时基表中不在视图中的字段允许为空。
3. 视图更新只能更新视图中的字段,不能对基表中不在视图中的字段进行操作。
4. 如果视图中数据与基表不是一对一关系,或者定义视图时使用了聚合函数、having、group by、join等sql块会使得视图不可更新。
5. 尽可能的不要使用视图去更新数据,它得使得更新操作更加复杂而导致失败。
视图的三种算法:
1. undefined: mysql优化器看着办。
2. merge: 视图定义的sql与外层合并
3. temptable:视图定义的sql先执行生成临时表再执行外层sql。
28 where和having的区别
1、having与where的区别
where:
- 是作用在查询结果进行分组之前,过滤掉不符合条件的数据。
- where中不能包含聚合函数。(注意是:where后面子句不能有聚合函数,而在含有where中可以使用聚合函数)
- 作用在group by和having字句前
- 是作用于对表与视图
having:
- 是作用在查询结果分组之后,筛选满足条件的组,过滤掉数据。
- 通常跟聚合函数一起使用。
- having子句在聚合后对组记录进行筛选。
- 是作用于分组
2、使用having例子
(1)计算出每个班级的总成绩
SELECT CLASS,SUM(TOTAL_SCORES) FROM student_score GROUP BY CLASS;
(2)筛选出总成绩大于505的班级
SELECT CLASS,SUM(TOTAL_SCORES) FROM student_score GROUP BY CLASS HAVING SUM(TOTAL_SCORES)>505;
这里用where SUM(TOTAL_SCORES)>505
的话,将会出错,因为表中根本没有总成绩分数这项,这是分组之后才有的
3、使用having与where联立的例子
利用having与where联立查询
实例:查询班级中分数大于250的学生的总成绩大于531的班级有哪几个班。
执行顺序为:
开始 -> where行记录筛选 -> group by分组 -> 聚合函数(sum、max、min)计算 -> having分组筛选->结束
具体的如下:
- where筛选学生成绩大于250的所有学生。
- group by分组班级
- sum计算分组班级中学生的总分数
- having筛选总成绩大于531的班级
具体代码如下:
-- 1.WHERE筛选出分数大于250的学生 SELECT CLASS,SNAME,TOTAL_SCORES FROM student_score WHERE TOTAL_SCORES>250;
-- 4.SUM计算之后,having筛选总成绩大于531的分组 SELECT CLASS,SUM(TOTAL_SCORES) AS SUM_SCORE FROM student_score WHERE TOTAL_SCORES>250 GROUP BY CLASS HAVING SUM(TOTAL_SCORES)>531;