MySQL基础

文章目录

      • 1.什么是MySQL
        • 1.1什么是数据库(DateBase DB)
        • 1.2数据库管理系统(DBMS)
        • 1.3数据库管理系统分类
        • 1.4MySQL简介
      • 2.MySQL的安装和使用
        • 2.1MySQL的下载地址
        • 2.2MySQL的安装
      • 3.MySQL的使用
        • 3.1连接数据库
        • 3.2常见命令
        • 3.3图形化界面工具
      • 4.SQL
        • 4.1SQL的分类
        • 4.2DDL
        • 4.3数据完整性
      • 5.运算符
        • 5.1算术运算符
        • 5.2比较运算符
        • 5.3逻辑运算符
        • 5.4位运算符
      • 6.DML
        • 6.1添加
        • 6.2修改
        • 6.3删除
      • 7.DQL
      • 8.函数
        • 8.1单行函数
        • 8.2聚合函数
        • 8.3分组函数
        • 8.4 加密函数
      • 9.TCL(事务控制语言)
        • 9.1 sql的执行流程
        • 9.2事物
      • 10.DCL

1.什么是MySQL

1.1什么是数据库(DateBase DB)

利用数据结构储存数据的仓库

1.2数据库管理系统(DBMS)

操纵和管理数据的一套系统软件

1.3数据库管理系统分类

  • 关系型的数据库管理系统(RDBMS)

    处理结构化数据(行和列)

    • Oracle:oracle公司,大型的分布式RDBMS
    • MySQL:开源免费
    • sqlserver/db2
  • 非关系型数据库管理系统(Nosql)

数据多样性

关系的复杂性

高并发和高IO操作

redis/HBase/mongoDB/Neo4

1.4MySQL简介

开源免费的关系型的数据库管理系统。
利用表(数据库表)存储和管理数据,行称为记录,列称为字段。
管理多个数据库,每个数据库中管理多张表。
支持千万级的数据量。
支持GPL许可证。
1996年由MySQL AB公司开发完成;
2000年正式开源;
2008,mysql被sun公司以10亿美元收购
2009,sun被oracle以74亿美元收购

2.MySQL的安装和使用

2.1MySQL的下载地址

https://oracle.com
https://dev.mysql.com/downloads/

2.2MySQL的安装

https://blog.csdn.net/a805814077/article/details/99707096

3.MySQL的使用

3.1连接数据库

mysql -uroot -p密码

3.2常见命令

show database;  显示数据库
use dbname;切换数据库
show tables;展示表

3.3图形化界面工具

客户端,利用图形界面来展示数据(友好),navicat,sqlyog等

4.SQL

结构化查询语言。关系数据库通用语言
结束的标识是:
字符串数据用引号;
大小不敏感

4.1SQL的分类

  • DDL(Data Definition Language):数据定义语言(结构)

    实现数据库对象的操作(创建,修改和销毁)

    create  /   alter   /   drop
    
  • DML(Data Manipulation Language):数据操作语言(数据)

    增删改

    insert  /   delete  /   update
    
  • DQL(Data Definition Language):数据查询语言

    select
    
  • TCL(Transaction Control Language):事物的控制语句

    comit   /   rollback(回滚)
    
  • DCL(Data Control Language):数据控制语言(授权)

    grant   /   revoke
    

4.2DDL

数据定义语言,用于操作数据库对象的结构
  • 数据库的创建和销毁
    # 创建数据库
    create database [if not exists] bd1906;
    
    #销毁
    drop database [if exists] bd1906;
    
  • 表的创建,修改和销毁
    1.创建表
    create table student{
    sid int,
    sname VARCHAR(20),
    age int,
    gender VARCHAR(10)
    };
    # 查看表的状态
    desc student;
    2.修改结构(添加字段,销毁字段,修改字段(字段名称,类型,长度,位置,约束等))
    alter table tname add/drop/change/modify    colname coltype... first|after
    * 添加字段
      追加字段
      alter table student add email varchar(20);
      添加到首列
      alter table student add phone char(11) first;
      指定位置
      alter table student add card char(18) after sid;
    * 销毁字段
      alter table student drop card;
    * 修改字段
      alter table student modify colname 类型 约束...
      alter table student change 旧字段名称 新字段名称 类型 约束...
      # 修改字段名称
        alter table student change email semail varchar(20);
      # 修改字段的类型和长度
        alter table student modify name varchar(50);
      # 修改位置
        alter table student modify semail varchar(20) after
    3.销毁表
        drop table student;
    4.修改表的名称
        rename table student to stu;
    5.清空表
        truncate table stu;
        
        deletetruncatedrop的区别?
            delete删除(清空)某一条数据
            truncate不改变机构,只清空数据和重置。
            drop销毁表结构;
    
    • 数据类型(仅限mysql)
      数值类型:
          整数:
              int / bigint
          浮点数:               float(10,2):长度是10,小数点后的位数是2               double(16,4):长度为16,小数点后的位数是4                   decimal(m,n)金额等数据时必须使用decimal
              
      字符串类型:必须指明长度
          char(n):固定长度
          varchar(n):可变长度
      日期类型:
          date:日期
          time:时间
          datetime:日期和时间
          timestamp:时间戳
      其他类型:
          text: 文本类型
          blob: 而进行数据类型
          enum() / set() / json()
      

4.3数据完整性

数据的准确性和可靠性

实体完整性

实体指的就是记录,就是保证记录是准确的,不重复的

  • 主键约束:唯一而且不能为空(primary key)
        # 场景1:创建表的同时添加约束
        create table student(
            sid int primary key,
            sname varchar(20)
        );
        create table student(
            sid int,
            sname varchar(20),
            primary key(sid)
        );        
        # 场景2:表已经存在(主键字段绝对不能存在重复的数据)
        alter table stu add constraint PK_ID primary key (sid);
        
        # 注意:
        1.每张表必须有主键,但是有且只能有一个,允许有联合主键
        2.主键字段一般数据类型和长度尽可能小
        3.主键字段不要使用业务段
  • 唯一约束:字段的值必须唯一
    create table student(
        card char(18) unique
    )
    alter table stu add constraint UQ_CARD unique (card);
    * 主键自增
        auto_increment:默认从1开始增加1

域完整性

    域:字段
    类型约束
    not null:非空约束
    default:默认值

引用完整性

其中一张表的字段取值需要依赖于另一张表

外键约束

    alter table emp add constraint FK_DEPTNO foreign key(deptno) references dept(deptno)


5.运算符

5.1算术运算符

# 结果集 resultest
select 1 + 1 sum;
select 2 - 1;
select 1 * 1;
select 5 / 2;# 2.5
select 5 div 2;# 取整
select 3 / 0;# null
select 5 % 2;

5.2比较运算符

#比较运算符
select 1 > 2;# 0
select 2 > 1;# 1
select 1 != 2;
select 1 <> 2;# 不等于

5.3逻辑运算符

#逻辑运算符
select 1 > 2 and 2 > 1;
select 1 > 2 or 2 > 1;
select !(1 > 2);

5.4位运算符

# 位运算符,二进制算
select 2 & 3; #2 10 11 10
select 2 | 3; #3 10 11 11
select 2 ^ 3; #1 10 11 01

6.DML

6.1添加

insert into tname[(col1,col2...)] values(val1,val2...);
# 1.insert 给所有的字段添加值,值的顺序必须和表中字段的顺序一致
insert into stu values(5,'zl',30,'man');
# 2.部分字段添加值,值的顺序和前面字段的声明顺序一致
insert into stu(sname,age,gender) values('zw',30,'man');
# 3.添加三条记录
insert into stu(sname,age,gender) values('zw',30,'man'),('zw',31,'man'),('zw',33,'man');
# 4.表复制
	# 创建一个和stu结构相同的表
	create table student select * from stu where 0=1;	
	
	#插入stu表所有的数据到student表
	insert into student() select *from stu;


6.2修改

update tname set coll = val1,col2 = val2...[where条件]
如果需要唯一确定某条记录,最好使用主键作为条件

6.3删除

delete from tname [where 条件]

drop,truncatedelete区别?
	drop:销毁整个表的结构
	truncate:表及巩固没有删除,清空所有的数据,重置了自增的结构
	delete:删除数据,只与数据有关,与结构无关

7.DQL

select 字段/表达式(控制结果集的内容)
from/视图/结果集(控制从什么地方查询)
where 条件(简单,组合条件等)
order by 字段(排序 asc|desc)
group by 字段(分组)
having 条件(分组之后再过滤)
# DQL
	# 1.查询emp表中所遇的记录信息。
		select * from emp;
	# 2.查询emp表中所遇的员工名称和薪水
		select ename,sal from emp;
	# 3.在emp表中查询员工编号为7788的员工的姓名和所在的部门编号
	select ename,deptno from emp where empno = 7788;
	# 4.在emp表查询20号部门工资超过2000的员工信息
	select * from emp where sal >= 2000and deptno = 20;
	# 5.在emp表中查询员工编号为7369,7521,7788的员工信息
	select * from emp where empno = 7369||empno = 7521 || empno = 7788;
	# 6.查询工资在1000到2000之间的员工信息
	select * from emp where sal >= 1000 and sal<=2000;
	select * from emp where sal between 1000 and 2000;
	# 7.在emp表中查询员工编号为7369,7521,7788的员工信息(集合查询)。
	select * from emp where empno in (7369,7521,7788);
	# 8.查询emp表中所有的职位信息(去重 distinct)
	select distinct job from emp; 
	# 9.查询员工工资提升15%之后的员工姓名和薪水。(别名 [as] 别名)
	select ename,sal*1.15 sal from emp;
	# 10.在emp表中查询没有奖金的员工信息(空判断 --> is null)。
	select * from emp where comm is null;
	# 11.按照工资升序查询员工信息(order by 字段 [asc] | desc)
	select * from emp order by sal,empno desc;
	# 12.查询ename以s开头的所有的员工的信息(模糊查询 like)%:0到多个字符。
    select * from emp where ename  like 's%';
	select * from emp where ename  like '%n';
	select * from emp where ename  like '%s%'; # 包含
	# 第二个	_:代表一个字符
	select * from emp where ename  like '_l%';
	# 13.查询前五条记录(限制结果查询 limit  index,length)
	select * from emp limit 5;
	select * from emp limit 1,5;

8.函数

8.1单行函数

  • 函数

    # 1.1数学函数
    select abs(-16);	# 绝对值
      select floor(12.5);# 向下取整
      select ceil(-12.3);# 向上取整
      select round(12.46,-1)# 四舍五入
      select PI();# π
      select mod(5,2);# 取模运算
      select pow(2,3);# n次方
      select sqrt(25);# 开平方
      select rand(); #[0,1)随机数
    
  • 字符函数

    select length('this is an apple');# 计算字符长度
    	select length(ename) from emp;# 计算指定字符长度
    	select lower('THIS IS');# 转换为小写
    	select UPPER('this is');# 转换为大写
    	select SUBSTR('abcde',1,2);# 截取
    	select REPLACE('abcde','bc','ggg');# 替换
    	select TRIM('     a   bc   ');# 去空格
    	select lpad('abc',10,'*');# 在左边添加('字符串',总长度,填充物)
    	select rpad('abc',10,'*');# 在右边添加('字符串',总长度,填充物)
    
  • 日期函数

     select SYSDATE();# 获取系统时间
     select NOW();
     select CURRENT_DATE();
     select CURRENT_TIME();
     select CURRENT_TIMESTAMP();
     select YEAR('1998-09-08');
     select MONTH(NOW());
     select DAY(NOW());
     
      #实现日期运算
    	select DATE_ADD('2019-07-03',INTERVAL 2 week);
    	
    	#获取指定时间该月的最后一天
    	select LAST_DAY(date)
    

8.2聚合函数

	select max(sal) from emp;	
	select min(sal) from emp;
	select avg(sal) from emp;
	# 统计记录数
	select count(*) from emp;
	# 统计该字段不为空的数目
	select count(comm) from emp;	
	select sum(sal) from emp;

8.3分组函数

group by 字段
# 获取每个职位的平均工资
select ename,job,avg(sal) from emp group by job;

使用分组函数,select自居中能够出现聚合函数和分组的字段

having:分完组之后再次实现检索(条件)
1.where子句在group by 之前
2.where子句中不能使用聚合函数,having中可以使用聚合函数
select deptno,avg(sal) from emp GROUP BY deptno having avg(sal) >= 2000;

8.4 加密函数

select MD5('root');
select sha('root');
select password('root');

9.TCL(事务控制语言)

9.1 sql的执行流程

mysql的核心是存储引擎

存储引擎本质是数据库底层的软件组织,涉及到增删改查操作,涉及到数据如何存储,事物的支持,锁的水平,并发的处理等。

mysql中支持多种存储引擎,采用插件式的方式实现设置mysql5.5之后默认采用的存储引擎是innoDB。

show engines;

InnoDB: 支持事物,行级锁,以及外键。适合做高并发,以及增删改较多的场景。
如何配置存储引擎:
my.ini --> default_storage_engine=innodb

9.2事物

保证数据一致性。

由一系列的dml操作组成,要么同时成功,要么同时失败。

在数据库中,任何的增删改操作都必须在事物的环境下运行。

# 开启事物
一组dml操作
# 提交/回滚事物

# 查看事物的自动提交,默认开启
show variables like '%autocommit%';

如果事物自动提交开启,默认会将每一个dml操作当做单独的事物进行处理

如果将多个dml操作放在同一事物:
1.关闭事物的自动提交
 set autocommit = 0;
2.手动开启事物(显式开始事务)
begin/start transaction;
3.一组dml操作
#如果未显示开启事务,执行第一句增删改操作时会隐式开启事务
update account set money = money + 1000 where id = 2;
update account set money = money - 1000 where id = 1
4.手机提交事物(回滚)
commit;(持久化数据到文件中)
  • 事务的四大特性

    • 原子性:同一事务中的dml作为整体不可分割。
    • 一致性:事务执行前后整体的状态不变。
    • 隔离性:并发事务之间独立的。
    • 持久性:事务提交完成数据库应该持久化到数据库,不会随意发生改变
  • 并发事务产生的问题

    • 脏读

      t2事务读到t1事物未提交的数据

    • 不可重复读

      t2事务在可读范围内,t1事物修改了该数据并且进行了事物提交。

      t2在多次读取的过程中发现数据不一致。

    • 幻读(虚读)

      t2事物在可读范围内,t1事物删除记录并且进行了事物提交

      t2在多次读取过程中发现数据数目不一致。

  • 事务的隔离级别

    • 读未提交:不能解决任何并发问题
    • 读已提交:解决脏读数据(Oracle)
    • 可重复读:脏读和不可重复读(mysql)
    • 串行化:解决所有问题(效率低)

    10.DCL

1. 管理用户
	1. 添加用户:
		  语法:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
	2. 删除用户:
		  语法:DROP USER '用户名'@'主机名';
	3. 修改用户密码:
		
		UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
		UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi';
		
		SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
		SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');

		#  mysql中忘记了root用户的密码?
            1.net stop mysql;(需要管理员权限)

            2.使用无验证方式启动mysql服务:mysqld --skip-grrant-tables

            3.打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功

            4.use mysql;

            5.update user set password = password('你的新密码')where user = 'root';

            6.关闭两个窗口

            7.打开任务管理器,时候互动结束mysqld.exe的进程

            8.启动mysql服务

            9.使用新密码登录

	4. 查询用户:
		-- 1. 切换到mysql数据库
		USE myql;
		-- 2. 查询user表
		SELECT *  FROM USER;
		
		#  通配符: % 表示可以在任意主机使用用户登录数据库

2. 权限管理:
	1. 查询权限:
		-- 查询权限
		SHOW GRANTS FOR '用户名'@'主机名';
		SHOW GRANTS FOR 'lisi'@'%';

	2. 授予权限:
		-- 授予权限
		grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
		-- 给张三用户授予所有权限,在任意数据库任意表上
		
		GRANT ALL ON * .*  TO 'zhangsan'@'localhost';
	3. 撤销权限:
		-- 撤销权限:
		revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
		REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';

你可能感兴趣的:(MySQL,数据库,MySQL基础,MySQL)