什么是数据库 数据库(DB,DataBase) 概念:数据仓库,软件,安装在操作系统之上 作用:存储数据,管理数据 数据库分类 关系型数据库: ·MySQL,Oracle,Sql Server,DB2,SQLlite ·通过表和表之间,行和列之间的关系进行数据的存储 非关系型数据库: ·Redis,MongDB ·非关系型数据库,对象存储,通过对象的自身的属性来决定 DBMS(数据库管理系统) ·数据库的管理软件,科学有效的管理数据,维护和获取数据 ·MySQL,数据库管理系统 MySQL是一个关系型数据库管理系统 DDL 数据定义语言 CREATE、DROP、ALTER、TRUNCATE DML 数据操作语言 INSERT、UPDATE、DELETE、CALL DQL 数据查询语言 SELECT DCL 数据控制语言 GRANT、REVOKE 创建数据库 create database 一、DDL 1、操作数据库 1.1查询数据库 查询MySQL中所有的数据库 show databases; 查询当前正在使用的数据库 select database(); 1.2创建数据库 普通创建 create database 创建并判断 create database if not exists 数据库名称; 创建一个数据库,并指定字符集 create database itheima default charset utf8mb4; 1.3删除数据库 普通删除 drop database 数据库名称; 删除并判断 drop database if exists 数据库名称; 1.4使用数据库 Use 数据库名称; 2、操作表 1.1 创建(CREATE) CREATE TABLE 表名(字段名1 数据类型,字段名2 数据类型); 1.2 查询(retrieve) SHOW TABLES; DESC 表名; SHOW CREATE TABLE 表名; 1.3 修改(ALTER) 修改表名 ALTER TABLE 表名 RENAME TO 新的表名; 添加一列 ALTER TABLE 表名 ADD 列名 数据类型 [COMMENT注释]; 修改某列(字段)数据类型 ALTER TABLE 表名 MODIFY 列名 新的数据类型; 修改列名和数据类型 ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 [COMMENT注释]; 删除列(字段) ALTER TABLE 表名 DROP 列名; 1.4删除(DROP) 普通删除 DROP TABLE 表名; 删除并判断 DROP TABLE IF EXISTS 表名; 删除指定表并重新创建 TRUNCATE TABLE 表名; 二、DML 1.添加数据(INSERT) 给指定列添加数据 INSERT INTO 表名(列名1,[列名2],[...) VALUES (值1,[值2],[...]); 给全部列添加数据 INSERT INTO 表名[所有列名] VALUES (值1,值2,...); 批量添加数据 INSERT INTO 表名(列名1,[列名2],[...])VALUES(值1,值2,...),[(值1,值2,...)],[...]; 批量给全部列添加数据 INSERT INTO 表名[所有列名] VALUES(值1,值2,...),(值1,值2,...),...; 2.修改数据(UPDATE) UPDATE 表名 SET 列名1=值1,[列名2=值2],[...][WHERE条件]; 如果不使用WHERE条件,会将表中所有数据进行修改 3.删除数据(DELETE) DELETE FROM 表名 [WHERE条件]; 如果不使用WHERE条件,会将表中所有的数据删除 三、DQL DQL编写顺序: SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段 HAVING 分组后条件 ORDER 排序字段 LIMIT 分页限定 DQL执行顺序: ④SELECT 字段列表 ①FROM 表名列表 ②WHERE 条件列表 ③GROUP BY 分组字段 ⑤HAVING 分组后条件 ORDER BY 排序字段 ⑥LIMIT 分页限定 1.基础查询 查询字段 SELECT 字段1,[字段2],[...] FROM 表名; SELECT * FROM 表名 ;-- 查询表中所有字段 -- 注意:查询表中所有字段虽然可以使用*,但是推荐使用字段列表(更加清晰) 去除重复记录 SELECT DISTINCT 字段1,[字段2],[...] FROM 表名; 起别名 SELECT 字段1 AS 别名1,[字段2 AS 别名2],[...] FROM 表名; -- 注意:起别名的关键字AS可以省略,但是别名和字段名要有空格隔开 AS:可以给字段或表起别名,通常该关键字可以省略,但是要别名和字段/表要用空格隔开 2.条件查询 SELECT 字段1,[字段2],[...] FROM 表名 WHERE 条件列表 条件运算符: 2.1模糊查询 模糊查询使用关键字LIKE,同时需要了解常用的通配符; %:表示任意长度的字符串,例如:a%表示,以a开始后面接任意长度的字符串 _:表示任意单个字符,例如:a_表示,以a开始后面只能接一个字符 2.2排序查询 排序查询使用关键字ORDER BY,同时需要了解常用的排序方式: ·ASC:升序排序(MySQL默认的排序方式) ·DESC:降序排序 升序、降序是自上而下的;当使用两个排序条件时,只有前面的条件值一样时,才会根据第二个排序条件进行排序 3、聚合函数 COUNT(*)表示统计表的总行数,也可以使用主键的字段名 DISTINCT:去除重复的值,即遇到重复的值不会加1 ALL:不去重(MySQL默认) SELECT 聚合函数名([DISTINCT|ALL] 列名) FROM 表; 4、分组查询 分组查询使用关键字GROUP BY,可以让查询结果按照某一列或多列的值进行分组 分组的目的:为了细化聚合函数的作用对象 SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤]; WHERE和HAVING的区别: ·执行时机不一样:WHERE是分组之前进行限定,不满足WHERE条件,则不参与分组,而HAVING是分组之后对结果进行过滤 ·可判断的条件不一样:WHERE不能对聚合函数进行判断,HAVING可以 5、分页查询 分页查询使用关键字LIMIT,该关键字是MySQL数据库的方言 SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询条目数; 索引是从0开始的,和数组中的索引是一样的 6、多表查询 SELECT * FROM 表1,表2,...[WHERE条件]; 查询结果是多张表的笛卡尔积 6.1内连接 内连接是查询多张表的交集数据,它是从多张表中查询出满足条件的待查询字段数据,就是多张表先要满足给定的条件,等条件筛选后再进行查询 隐式内连接 SELECT 字段列表 FROM 表1,表2… WHERE 条件; 显示内连接 SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 [JOIN ...] ON 条件; 6.2外连接 外连接就算查询一个表的所有数据和满足条件的其他表数据 外连接分为: ·左外连接:查询A集合的所有数据以及满足条件的B集合数据 ·右外连接:查询B集合的所有数据以及满足条件的A集合数据 左外连接 SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件; 右外连接 SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件; 6.3 自连接 6.4 联合查询 7、子查询 查询中嵌套查询 四、DCL 数据控制语言,用来定义数据库中的访问权限和安全级别,以及创建用户 1、管理用户 查询用户 select * from mysql.user; 创建用户 CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; 修改用户密码 ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ; 删除用户 DROP USER '用户名'@'主机名' ; 2、管理权限 查询权限 SHOW GRANTS FOR '用户名'@'主机名' ; 授予权限 GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名'; 撤销权限 REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名'; 事务的ACID特性: ·原子性:事务是数据库的不可分割的逻辑工作单位,要么全做,要么全不做 ·一致性:事务的执行结果必须使数据库从一个一致性状态转变成另一个一致性状态 ·隔离性:一个事务的执行不能被其他事务干扰 ·持续性:事务一旦提交或回滚,它对数据库的改变是永久的 并发性事务问题 ·读未提交:指事务未成功提交的数据也能够被其它事务所读取,存在脏读、不可重复读、幻读问题 ·读已提交:指只有事务提交成功后的数据才能够被其它事务所读取,存在不可重复读、幻读问题 ·可重复读:指事务开始读取到的数据和事务结束前读取到的数据必须保持一致,存在幻读问题 ·串行化:在每个读的数据行上,加上锁,使之不可能相互冲突,但是性能很低,容易发生请求超时和请求堆积问题 从上往下,隔离强度逐渐增强,性能逐渐变差。MySQL默认的隔离级别是可重复读,而Oracle的默认隔离级别是读已提交 脏读:读到无效数据 不可重复读:指同一事务中多次查询同一字段,出现数据不一致,通常针对数据更新(UPDATE)操作 幻读:指的是同一个事务中在前后两次查询中,后一次的查询里面,出现了前一次查询没有查到的记录