create database 数据库名 create database 数据库 character set 字符集 //添加字符集的 查询数据库 show create database 数据库名 //查看数据库的定义结构 show databases;//查询所有数据库名
删除数据库 drop database 数据库名 drop database day19;
修改数据库 alter database 数据库名 charactor set 字符集; //修改数据库的字符集
use 数据库名 //切换数据库 //注意: 在创建表之前一定要指定数据库名 select database(); //查看正在使用的数据库
create table 表名( 列名 类型 [约束], 列名 类型 [约束], … 列名 类型 [约束] ); 列: 字段 行: 记录 例如: create table user ( id int auto_increment primary key, username varchar(50) – 用户姓名 );
查询表 desc 表名 ; //查看表的定义结构
show tables; //查看所有的表
add,modify,change,rename→增加列,修改列的类型, 修改列的名称,修改表名
增加
alter table 表名 add 列名 类型 约束;//增加列
修改表 alter table 表名 modify 列名 新类型 新约束;//修改列的类型约束
alter table 表名 change 就列名 新列名 类型 约束;//修改列的名称
rename table 旧表名 to 新表名; //修改表名
删除
alter table 表名 drop 列名 //删除列 drop table 表名 //删除表
创建表 create table 表名( 列名 字段 类型 约束 列名 字段 类型 约束
) 增 insert into 表名(字段,字段…) values(记录,记录…)//插入特定的列 intsert into 表 values(值,值)//插入所有的列 删 delete from 表名 【where】 truncate table 表名; 面试题:delete 和truncate区别 DELETE 删除表中的数据,表结构还在; 删除后的数据可以找回,一条一条的删除. TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。删除的数据不能找回。执行速度比DELETE快。 工作里面的删除 物理删除: 真正的删除了, 数据不在, 使用delete就属于物理删除 逻辑删除: 没有真正的删除, 数据还在. 搞一个标记, 其实逻辑删除是更新 eg: state 1 启用 0禁用 注意:工作里面一般使用逻辑删除用的多 . 改 update 表名 set 列名=值,列名=值 [where…]
查 select * from 表名 所有的表的字段值
1.模糊查询: like 模糊查询,一般和_或者%一起使用 _ 占一位 % 占0或者n位
name like ‘张%’ --查询姓张的用户, 名字的字数没有限制 name like ‘张_’ --查询姓张的用户 并且名字是两个的字的
2.排序查询 语法:order by 列名[ASC|DESC] select * from student order by score desc; //单列排序 select * from student order by score desc ,age desc;//组合排序
3.聚合函数 语法: SELECT 聚合函数(列名) FROM 表名 [where 条件]; 函数类型:max(列名),min(列名),avg(列名),count(列名),sum(列名)→(最大值,最小值,平均值, 统计此列有多少条记录个数,求此列数据之和) 注意: 聚合函数会忽略空值NULL 解决:IFNULL(列名,默认值);
4.分组查询 语法: where 条件 group by 列 [having 条件] 例如:性别分组, 统计每一组学生的总人数> 5 SELECT sex, count() FROM student GROUP BY sex HAVING count() > 5
where和having的区别【面试】 where: 1.对查询结果进行分组前,将不符合where条件的行去掉, 即在分组之前过滤数据,即先过滤再分组。 2.where后面不可以使用聚合函数
having: 1.having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤。 2. having后面可以使用聚合函数
5.分页查询
语法: select … from … limit a ,b
6. 去重查询 select distinct 列名 from 表名 注意:distinct前面不能有字段名,一般单个字段去重,多个会出问题。
7. 别名查询 select 字段 as 别名,字段 as 别名,… from 表名 注意:as可以省略 一般都会省略
8.运算查询(+,-,*,/等) 注意:null和其他数据进行运算得到是null
外键:一张从表中的某个字段引用主表中的主键 主表: 约束别人 副表/从表:使用别人的数据,被别人约束
外键的语法: 添加外键的两种方式:
1. 新建表时增加外键: [CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名) 2. 已有表增加外键: ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名); 关键字解释: CONSTRAINT – 约束关键字 FOREIGN KEY(外键字段名) –- 某个字段作为外键 REFERENCES – 主表名(主键字段名) 表示参照主表中的主键字段
2.删除外键 ALTER TABLE 表 drop foreign key 外键名称;
外键约束的作用: 维护多表的关系, 保证引用数据的完整性
3.外键的级联 什么是级联操作:在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作 ON UPDATE CASCADE – 级联更新,主键发生更新时,外键也会更新 ON DELETE CASCADE – 级联删除,主键发生删除时,外键也会删除
添加外键级联 [CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名) ON UPDATE CASCADE ON DELETE CASCADE (建表时添加)
1.一对一: 先当做1对多, 再在外键列添加唯一约束 2.一对多: 在多方创建一个列作为外键 指向一方的主键 3. 多对多: 创建一张中间表,这个表里面至少包含两个列,都作为外键,指向一方的主键
分类: 1.交叉查询→交叉查询其实是一种错误,数据大部分是无用数据,被称为笛卡尔积. 2.内连接查询(显示内连接和隐式内连接):为了求出公共部分。 显示内连接语法: 显示里面是有inner关键字的 select * from a [inner] join b on 连接条件 [ where 其它条件] 例如:select * from dept inner join emp on dept.id = emp.dept_id; 隐式内连接语法: 隐式里面是没有inner关键字的 select * from a,b where 连接条件 --(a表里面的主键 = b表里面的外键) 例如:select * from dept,emp where dept.id = emp.dept_id; 3.外连接(左外连接和右外连接):在内连接的继承上保证左边表或右边表的数据全部显示 左外连接: select 字段 from 表名a left [outer] join 表名b on 条件 右外连接: select 字段 from 表名a right [outer] join 表名b on 条件
三种情况: 1.子查询的结果是单行单列(一个值情况) select … from … where 列 = (子查询) 2.子查询的结果是单列多行, 一般放在where后面作为条件, 通过in select … from … where 列 in (子查询) 3.子查询的结果是多行多列, 一般放在from后面作为虚拟表, 需要给虚拟表取别名 select … from (子查询) as 别名
自动事务(mysql默认) 手动开启一个事务 方式一: 手动开启事务的方式 start transaction;开启事务 commit;提交 rollback;回滚 方式二: 设置MYSQL中的自动提交的参数 查看MYSQL中事务是否自动提交 show variables like ‘%commit%’; 设置自动提交的参数为OFF set autocommit = 0;-- 0:OFF 1:ON
**
**
原子性 一致性:(Consistency)事务前后数据的完整性必须保持一致. 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。 隔离性(Isolation)事务的隔离性是指多个用户并发操作数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。 简单来说: 事务之间互不干扰
如果不考虑隔离性,会引发下面的问题 脏读:读取未提交的数据 不可重复读:内容不一致,要求一个事务在多次读取数据时是一致的 幻读:个数不一致,要求一个事务多次读取数据时数量是一致的
事务四个隔离级别
1.读未提交(read uncommitted) 2.读已提交(read committed) 3.可重复读(repeatable read) 4.串行化(serializable) 隔离级别越高,性能(效率)越差,安全性越高。
设置隔离级别 查询当前事务隔离级别 select @@tx_isolation;