数据库

本文深入讲解Mysql数据库的安装步骤,数据库与事物的概念,事物的四大特性,隔离级别的理解,数据库分类,Mysql引擎对比,以及数据库操作命令,包括库、表、数据的基本操作,数据类型,字段约束,表结构操作,条件查询,聚合函数,去除重复数据,分组与Having子句的使用。

1.Mysql数据库的安装与介绍

(1)概念介绍
数据库:

	存储数据的仓库,按照数据结构,来组织,管理和存储数据,并提供了增、删、改、查的功能。

事物: 将一组增删改的操作看成一个独立的执行单元,要没都成功,如果有一个操作失败,那么数据库会执行回滚,一组操作都会不生效
事物的特性:

1.原子性:事物被当做一个不可分割的执行单元,要么全部成功,要么全部失败,成功则将数据应用到数据库,失败不会对数据产生影响
2.一致性:开始事物前的状态必须和事物执行之后的状态保持一致
3.隔离性:当用户并发访问数据库时,数据库会给每个用户线程开启一个事物,事物和事物之间相互隔离,互不影响
4.持久性:一旦事物提交,那么数据就会永久性地应用于数据库,就算机器出现故障,也不会将数据修改 

事物的回滚:

事物作为一个独立不可分割的执行单元,要么都成功,只要这一组操作中有一个失败,事物会执行回滚,恢复到事物执行之前的状态

在不考虑事物的隔离性的情况下,会导致以下情况:

	脏读:
	当以一个事物执行时,访问了另一个未提交事物的数据,并使用了这条数据
	不可重复读:
	事物A多次读取一条数数据,事物B对这条数据做了修改,最终导致A事物两次读取的数据不一样
	幻读:
	事物A读取一张表中的所有数据,事物B在这个表中添加或者删除了一条数据,导致A的结果和实际结果不符,类似于出现了幻觉。
	注意:幻读和不可重复读都读取另一条已提交的事物,不同的的是不可重复读查询的都是同一条数据项,而幻读针对的是一批数据整体。

事物的四种隔离级别:

**Read uncommitted**:读未提交 最低级别,可能会出现任何情况
**Read committed**:读已提交   可以避免脏读
**Repeatable read**:可重读 可以避免脏读和不可重复度
**Serializable**:串行化 可避免 脏读 不可重复读 幻读 最高的隔离级别

数据库的分类:

关系型数据库 SQL sever MySQL Oracle
是建立在数据模型的基础之上,借用集合、代数等数据概念,来去管理数据 

非关系型数据库
Redis mongodb
{key:val}

Mysql引擎:

**Myisam** :  在5.5版本之前 是默认引擎
不支持事物
数据查询速度快
相对数据安全性差
将数据存在三个文件当中
一个文件存表结构 一个文件存索引 一个文件存数据
**Innodb**:在5.5之后默认引擎
支持事物
相对于myisam 查询效率低
数据安全性高
将数据存在两个文件中
一个文件存表结构 一个文件存索引和数据

(2)安装
1.把mysql-5.7.25-winx64.zip解压放到C盘目录下

2.MySQL软件bin目录添加到PATH环境变量中  C:\mysql-5.7.25-winx64\bin

3.在MySQL安装目录下创建my.cnf文件

4.my.cnf中粘贴默认选项

[mysqld]
basedir=c:/mysql-5.7.25-winx64
datadir=c:/mysql-5.7.25-winx64/data
character-set-server=utf8
explicit_defaults_for_timestamp
[mysql]

5.安装MySQL服务,以管理员运行cmd
  执行切换到bin目录下,执行mysqld --install MySQL

6.查看MySQL服务 services.msc 或者计算机->管理-->服务和应用程序-->服务

7.初始化安装MySQL数据库在bin目录下执行
   mysqld --initialize-insecure,无密码安装,看是否多data文件夹

8.启动MySQL服务

9.MySQL连接测试 mysql -uroot -p

卸载mysql

1、停止服务,删除C:mysql该目录下剩余了所有文件,把mysql文件夹也删了

2、windows+R运行“regedit”文件,打开注册表

3、删除注册表:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL文件夹

4、删除
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL文件夹,如果没有可以不用删除了

5、使用管理员权限进去cmd,sc delete MySQL ,这里是MySQL

(3)数据的基本认识和操作

启动服务
在命令行 输入 net start mysql
停止服务: net stop mysql

连接数据库
Mysql -u root -p -h -P
-u 你的mysql的用户名
-p 你的mysql密码
-h 你mysql服务的地址 ip
-P mysql数据库的端口号 默认3306
完整写法
Mysql -uroot -p -hlocalhost -P3306
数据库服务装在了本地所以-h可以省略
端口号使用是默认端口索引-P也可以省略
操作如下:连接成功
在这里插入图片描述
Mysql数据库的基本结构

Mysql关系型数据库管理软件
Mysql>database>table>filed
多条数据组成一张表
多张表组成一个库
Mysql管理多个库

Sql语句分类:

SQL结构化查询语言,用于关系型数据库数据的操作
DDL(定义)  一般适用于对库的操作和表的操作
DML(操作)  一般是 数据的添加 数据的修改 数据的删除
DQL(查询)  一般是查询
DCL(控制)  一般使用权限管理 一般是有dba来去操作

Sql的语法规则

1.sql语句必须以分号结尾
2.Sql 不去分大小写 但是一般文档中 sql关键都是大写

数据库的命令完整版

1.连接数据库
	mysql -uroot -p

2.库操作
	查看所有的库
		SHOW DATABASES;
	创建库
		CREATE DATABASE 库名;
	切换数据库
		USE 库名;
	查看当前所在的库
		SELECT DATABASE();
	删除数据库
		DROP DATABASE 库名;

3.表操作
	查看当前库中所有的表
		SHOW TABLES;

	创建表
		CREATE TABLE 表名(字段 类型 约束,字段 类型 约束)CHARSET=UTF8;

	查看表结构
		DESC 表名;

	查看建标语句
		SHOW CREATE TABLE 表名;

	删除表:
		DROP TABLE 表名;

4.数据的操作
	添加数据
		格式:INSERT INTO 表名(字段1,字段2,...) values(值1,值2,...);
		指定所有字段添加数据
		不指定字段添加数据
			向student表中添加一条数据 值的顺序必须按照表结构的顺序来添加
			INSERT INTO student values(5,'赵六',30,'1','z@163.com','web');	
		指定部分字段添加
			INSERT INTO student(id,name) values(6,'田七');
		一次添加多条数据
			INSERT INTO student values
			(7,'王八',28,'0','w@.com','ui'),
			(8,'九九',19,'1','j@qq.com','python'),
			(9,'后羿',80,'1','h@qq.com','python'),
			(10,'吴刚',79,'1','w@qq.com','python');
	更新数据
		格式: UPDATE 表名 SET 修改的字段 WHERE 条件;

		更新name为吴刚的数据 把年龄修给成77 把性别改成0
		UPDATE student SET age=77,gender='0' WHERE name='吴刚'; 
	删除数据
		格式:DELETE FROM 表名 WHERE 条件
		删除name是吴刚的数据
		DELETE FROM student WHERE name='吴刚';
	查询数据
		格式:SELECT 字段 FROM 表名;
		查询所有的数据
		SELECT * FROM student;

5.数据的数据类型

数值
	Int         4字节
	Tinyint     1字节
	decimal     一般存浮点型 小数
		格式:DECIMAL(M,D)  M你要存的数据 D保留几位小数
			  decimal(1234,2) 12.34
字符串
	char
		定长字符串
	varchar
		变长字符串

	char(20)  就算你当前字段中只存储了1个字符 那么它也是占据20个字符的大小 
	varchar(20) 
		最多能存20个字符 如果存了小于20个字符 它的实际占据大小是以你存的内容为准
	text文本类型
时间日期类型
	datetime 混合事件日期类型 年月日时分秒 格式 年-月-日 时:分:秒

6.常见的字段约束

Unsigned       无符号  一般给数值型的字段添加
				如果添加代表当前字段只能存正数
Int(5)         5代表显示的宽度  如果是有符号默认是11  如果是无符号默认10
Not null       不能为空 默认字段可以为空 如果添加了 那么此字段不能为空
Default         默认值
Primary key     主键约束(主键索引) 不能为空 且唯一 用于表示数据的唯一标识
Unique          唯一约束(唯一索引) 可以为空 不能重复 具有唯一性
Auto_increment  自动递增  一般配合主键去使用

创建一张表 demo
有字段 id 唯一索引 
uname 字符串类型 不能为空
email 字符串类型  可以为空
gender 字符串   不能为空 默认值为 2

create table demo(
	id int unsigned not null  auto_increment primary key,
	uname varchar(32) not null,
	email varchar(32),
	gender varchar(5) not null default '2'
)charset=utf8;

7.表结构的操作

格式: ALTER TABLE 表名 操作
添加字段 add
	给student表添加一个phone
	ALTER TABLE student ADD phone varchar(11) not null default '110';

修改字段 modify/change  (modify改约束,change可改字段名和约束)
注意:如果要修改约束, modify/change 都需要将对应的约束修改,其他的保持不变,否则修改后只剩下修改的那一项约束
	修改字段约束
	将phone字段的类型改成char类型
	ALTER TABLE student MODIFY phone char(11);
	将phone字段的类型改成int类型
		注意:将字符串转成数值型的时候,当前字段的值都必须是数字表示的字符串
	ALTER tABLE student MODIFY phone int;
	修改字段名
	将phone字段的名字改成 aa
	ALTER TABLE student CHANGE phone aa varchar(11);
	将字段的约束改成 char(11);
	ALTER TABLE student CHANGE aa aa char(11);
删除字段 drop
	删除aa字段
	ALTER TABLE student DROP aa;
修改表名 rename as
	修改student表名为 students
	ALTER TABLE student RENAME AS students;
修改表的编码格式
	ALTER TABLE students CHARSET=GBK;
修自增值
	修改自增值为20
	ALTER TABLE students AUTO_INCREMENT=20;

8.where条件查询
运算符 可以用在where条件

查询所有的数据
	SELECT * FROM 表名 WHERE 条件

练习:
1.查询年龄不等于18岁的所有用户信息
SELECT * FROM students WHERE age!=18;

2.查询班级为python的所有用户信息
SELECT * FROM students WHERE class='python';

3.查询年龄大于16岁的所有用户信息
SELECT * FROM students WHERE age>16;

4.查询年龄在18到24岁之间的所有用户信息 包含18和24岁;
SELECT * FROM students WHERE age>=18 and age<=24;
SELECT * FROM students WHERE age between 18 and 24;

5.查询年龄不在18到24之间的所有用户信息 not between 不包含开始和结束
SELECT * FROM students WHERE age<18 or age>24;
SELECT * FROM students WHERE age not between 18 and 24;

6.查询id值是1,3,4,6的所有用户信息
SELECT * FROM students WHERE id=1 or id=3 or id=4 or id=6;
SELECT * FROM students WHERE id in (1,3,4,6);

7.查询python班和web班级的所有女生信息
SELECT * FROM students WHERE (class='python' or class='web') and gender='0';

9.模糊查询:
like 有两个
% 任意位的任意字符
_ 一位任意字符

1.查询名字以‘小’开头的用户信息
SELECT * FROM students WHERE name like '小%';
2.查询emial中包含q的所有用户信息
SELECT * FROM students WHERE email like '%q%';
3.查询姓名是两个字的用户信息
SELECT * FROM students WHERE name like '__';
4.查询姓名以小开头并且是两个字的用户信息
SELECT * FROM students WHERE name like '小_';

10.聚合函数
Max() min() count() avg() sum()
1.统计当前表中一共有多少条数据
SELECT count(*) FROM students;

2.查询python班级最大年龄最小年龄以及平均
SELECT max(age),min(age),avg(age) FROM students WHERE class='python';

3.统计男生的数量
SELECT count(*) FROM students WHERE gender='0';

11.去除重复的数据:distinct
1.查询所有的班级
SELECT distinct class FROM student;
SELECT class FROM students group by class;

2.查询不重复的班级和性别
SELECT distinct class,gender FROM student;

12.分组group by

注意:count(*) 在分组中使用时,统计的分别是分组后每个组的数据条数

1.查询表中有哪些班级
SELECT class FROM students GROUP BY class;

2.统计当前表中男生和女生的人数各多少人
SELECT gender,count(*) FROM students GROUP BY gender;

3.统计每个班级的人数
SELECT class,count(*) FROM student GROUP BY class;

4.统计每个班,男生和女生个多少人
SELECT class,gender,count(*) FROM students GROUP BY class,gender;

Having 子句查询
	只能在分组后面去使用 
	类似于where 但是having筛选的是分组后的数据

1.统计每个班级的人数,并查询出班级人数大于2的班级
	SELECT class,count(*) FROM students GROUP BY class HAVING count(*)>2;

2.查询每个班级男生人数大于2的班级
SELECT class,gender,count(*) FROM students GROUP BY class,gender HAVING gender='1' and count(*)>2;

先查询出所有的男生 在按照班级分组 然后在用having过滤
SELECT class,count(*) FROM students WHERE gender='1' GROUP BY class HAVING COUNT(*)>2;

13.运算符:

算术运算符: + - * / %
比较运算符:>  <  >=  <=  =  !=  <>
特殊比较运算符:in, not in,is null,is not null,like,between and
逻辑运算符:and or not  
逻辑运算符优先级 or<and<not
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值