一、是什么

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。RDBMS 即关系数据库管理系统(Relational Database Management System),习惯上把数据库和数据管理系统统称为数据库。

二、怎么用

2.1MySQL安装在Linux系统上

MySQL通常装载Linux上或Windows上来进行使用,Windows上安装过程略。

#通过连接进行下载
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
#安装
yum install mysql80-community-release-el7-3.noarch.rpm
#安装utils工具
yum install yum-utils -y
#关闭MySQL8服务
yum-config-manager --disable mysql80-community 
#安装MySQL5.7
yum-config-manager --enable mysql57-community
#:若启动时出现该异常 Unit not found.
yum install -y mysql-community-server
#启动MySQL
systemctl start mysqld
#登陆
mysql -uroot -p

3.1在Linux上的基本操作

  1. 查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| firstmysql         |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.12 sec)
mysql> use web;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------+
| Tables_in_web |
+---------------+
| articles      |
| articletype   |
| comments      |
| login         |
| media         |
| notice        |
| visit         |
+---------------+
7 rows in set (0.00 sec)
mysql> select * from login;
+--------+----------+----------------------------------+--------------+
| userId | username | userpassword                     | mail         |
+--------+----------+----------------------------------+--------------+
|      2 | admin    | A98E9189771112C70FC091BE683DC804 | 19063@qq.com |
+--------+----------+----------------------------------+--------------+
1 row in set (0.05 sec)
  1. 查询数据库容量
mysql> SELECT 
    -> table_schema AS '数据库',
    -> SUM(table_rows) AS '记录数',
    -> SUM(TRUNCATE(data_length/1024/1024, 2)) AS '数据容量(MB)',
    -> SUM(TRUNCATE(index_length/1024/1024, 2)) AS '索引容量(MB)'
    -> FROM information_schema.tables
    -> GROUP BY table_schema
    -> ORDER BY SUM(data_length) DESC, SUM(index_length) DESC;
+--------------------+-----------+------------------+------------------+
| 数据库             | 记录数    | 数据容量(MB)     | 索引容量(MB)     |
+--------------------+-----------+------------------+------------------+
| firstmysql         |      2160 |            22.54 |             0.64 |
| mysql              |      4098 |             2.19 |             0.20 |
| phpmyadmin         |         0 |             0.19 |             0.06 |
| information_schema |      NULL |             0.10 |             0.00 |
| web                |        26 |             0.09 |             0.00 |
| sys                |         6 |             0.01 |             0.00 |
| performance_schema |   1332090 |             0.00 |             0.00 |
+--------------------+-----------+------------------+------------------+
7 rows in set (0.63 sec)

3在Windows上操作

创建表

CREATE TABLE `goods` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `goodsName` varchar(40) NOT NULL,
  `billStatus` int(11) NOT NULL,
  `goodsPrice` float NOT NULL,
  `goodsCount` bigint(20) NOT NULL,
  `creationTime` date NOT NULL,
  `filename` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8
#把第查出来的表作为这张新表
CREATE TABLE ss as select * from goods

修改表结构:增加列定义、修改列定义、删除列,重命名列

alter table ss add name int(1);
alter table ss modify name varchar(20);
alter table ss drop name;
alter table ss rename to names;

删除表(表结构被删除表对象不存在,表数据被删除,表索引约束被删除)

drop table ss;

truncate表(被称为截断某个表,它的作用是删除该表里所有的数据,但保留表结构)

truncate ss

2.2SQL语句基础

SQL的全称是Structured Query Language结构化查询语言,是操作和检索关系型数据库的标注语言。使用SQL语句可完成数据库中检索信息,对数据库信息进行更新,改变数据库的结构,更改系统安全设置,增加或回收用户对数据库、表的许可权限。
SQL语句可分为五种类型

  • DQL(Data Query Language,数据库查询语言)。
  • DML(Data Manipulation Language,数据操作语言)语句 insert、update、delete
  • DDL(Data Difinition Language,数据定义语言)语句create、alter、drop、truncate
  • DCL(Data Control Language,数据定义语言)语句grant、revoke
  • 事物控制语句,关键字有commit、rollback、savepoint

sql语句执行顺序

(8)  SELECT  (9) DISTINCT (11) <TOP_specification> <select_list> 
(1)  FROM <left_table>  
(3) <join_type> JOIN <right_table> 
(2) ON <join_condition> 
(4) WHERE <where_condition> 
(5) GROUP BY <group_by_list> 
(6) WITH {CUBE | ROLLUP} 
(7) HAVING <having_condition> 
(10) ORDER BY <order_by_list>

2.3常见的数据库对象

  1. 表(Table )

数据库中的表与我们日常生活中使用的表格类似,它也是由行(Row) 和列(Column)组成的。列由同类的信息组成,每列又称为一个字段,每列的标题称为字段名。行包括了若干列信息项。一行数据称为一个或一条记录,它表达有一定意义的信息组合。一个数据库表由一条或多条记录组成,没有记录的表称为空表。每个表中通常都有一个主关键字,用于惟一地确定一条记录。

  1. 约束constraint

执行数据校验的规则,用于保证数据完整性的规则;约束又可分为单列约束与多列约束;建表的时候为相应数据列制定约束,建表后,以修改表的方式来增加约束;
数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性。主键主要是用与其他表的外键关联,以及本记录的修改与删除。
作用:
1) 保证实体的完整性;
2) 加快数据库的操作速度
3) 在表中添加新记录时,DBMS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。
4) DBMS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。

  • 主键约束(Primay Key Coustraint) 唯一性,非空性
CREATE TABLE `goods` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
)
  • 唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个,当 为某列创建唯 约束时, MySQL 会为该列相应地创建唯一索引 如果不给唯一约束起名,该唯 约束默认与列名相同。
#建表时创建唯 约束,使用表级约束语法建立约束
create table unique test2 
(
#建立了非空约束,这意味着 test id 不可以为 null
test id int not null, test name varchar (255) , 
test pass varchar(255) , 
#使用表级约束语法建立唯 约束
unique (test_name) , 
#使用表级约束语法建立唯一约束,而且指定约束名
constraint test2_uk unique(test_pass)
);
  • 检查约束 (Check Counstraint)对该列数据的范围、格式的限制(如:年龄、性别等)
create table hehe 
(
hehe age int not null , 
hehe_gender varchar(2) null,
check(age>0)
);
  • 非空约束 (NOT NULL Counstraint)指定某列不能为空
create table hehe 
(
#建立了非空约束,这意味着 hehe id 不可 null
hehe id int not null , 
# MySQL 空约束不能 定名字
hehe_ name varchar(255) default ' xyz' not null , 
#下面列可以为空 默认就是可以为
hehe_gender varchar(2) null
);
#增加非空约束
alter table hehe 
modify hehe gender varchar(2) not null 
#取消非空约束
alter table hehe 
modify hehe_name varchar(2) null ; 
#取消非空约束 并指定默认值
alter table hehe 
modify hehe_ name varchar(255) default 'abc' null ;
  • 外键约束 (Foreign Key Counstraint)需要建立两表间的关系并引用主表的列
#为了保证从表参照的主表存在,通常应该先建主表
create table teacher table 
(
# auto increment: 代表数据库的自动编号策略,通常用作数据袤的逻辑主键
teacher id int auto i ncrement , 
teacher name varchar(255 ) , primary key(teacher id)
);
  1. 索引(Index)

索引是根据指定的数据库表列建立起来的顺序。它提供了快速访问数据的途径,并且可监督表的数据,使其索引所指向的列中的数据不重复。mysql使用information_schema数据库中的STATISTICS表来保存该数据库实例中的所有信息。
创建索引有两种方法;
自动:当在表上定义主键约束、唯一约束和外键约束时系统为该数据列自动创建索引;
手动:create index…
索引有以下几种类型;
主键索引(PRIMARY KEY)
唯一索引(UNIQUE)
常规索引(INDEX)
全文索引(FULLTEXT)

create ndex index name 
on table name (column[ , column) . ..);

drop ndex 索引名 on 表名
  1. 视图(View)

视图看上去同表似乎一模一样,具有一组命名的字段和数据项,但它其实是一个虚拟的表,在数据库中并不实际存。在视图是由查询数据库表产生的,它限制了用户能看到和修改的数据。由此可见,视图可以用来控制用户对数据的访问,并能简化数据的显示,即通过视图只显示那些需要的数据信息。

create or replace view view_test 
as 
select teacher name , teacher_pass from teacher_table;
  1. 函数(Function)

用于完成一次特定的计算,具有一个返回值

  • 数学函数

  • 字符串函数

  • 日期和时间函数

writenoticeTime是要查日期的那个字段
分别查看今天和昨天的数据

SELECT * FROM notice WHERE TO_DAYS(writenoticeTime) = TO_DAYS(NOW());
SELECT * FROM notice WHERE TO_DAYS( NOW( ) ) - TO_DAYS( writenoticeTime) = 1;

查看近一周的数据

SELECT * FROM notice WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(writenoticeTime);
SELECT * FROM notice WHERE DATE_SUB(CURDATE(), INTERVAL 1 WEEK) <= DATE(writenoticeTime);

查看近一月的数据

SELECT * FROM notice WHERE DATE_FORMAT( writenoticeTime, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )

查上个月的数据

SELECT * FROM notice WHERE PERIOD_DIFF( DATE_FORMAT( NOW( ) , '%Y%m' ) , DATE_FORMAT( writenoticeTime, '%Y%m' ) ) =1

查询本季度

SELECT * FROM notice WHERE QUARTER(writenoticeTime)=QUARTER(NOW());

查询今年的数据

SELECT * FROM notice WHERE YEAR(writenoticeTime)=YEAR(NOW());

日期格式转换

#原格式2021-03-01 13:54:00转换后的20210301
SELECT DATE_FORMAT(writenoticeTime,'%Y%m%d') FROM notice 
  • 条件判断函数
SELECT CASE BINARY 'b'
WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
#if
SELECT IF(1>2,2,3);
如果字符串相同,STRCMP()返回0,如果第一参数根据当前的排序次序小于第二个,返回-1,否则返回1。
select STRCMP('text', 'text2');
select STRCMP('text2', 'text');
select STRCMP('text', 'text');
  • 系统信息函数
#查看版本
SELECT VERSION()
  • 加密函数
SELECT PASSWORD('ssss');
  • 格式化函数
FORMAT(x,n)函数可以将数字x进行格式化,将x保留到小数点后n位
ORMAT(2.356,2)返回的结果将会是2.36
  1. 触发器(Trigger)

触发器是一个用户定义的SQL事务命令的集合。当对一个表进行插入、更改、删除时,这组命令就会自动执行。

  1. 存储过程(Stored Procedure)

存储过程是为完成特定的功能而汇集在一起的一组SQL 程序语句,经编译后存储在数据库中的SQL 程序。

与MySQL建立连接

1.使用Java API连接

//1.加载数据库驱动。通常使 Class 类的 forNameO 静态方法来加载驱动
Class .forName(driverClass)
//2.通过 DriverManager 获取数据库连接
DriverManager .getConnection(String url , String user, String pass)
//3.通过 Connection 对象创建 Statement 对象。
p=prepareStatement(String sql): 根据传入的 SQL 语句创建预编译的 Statement 对象
//4.使用 Statement 执行 SQL 语句
p.executeUpdate()主要用于执行 DML、DDL语句。执行DML语句返回受 SQL 语句影响的行数,执行 DDL 吾句返回0。
//5.操作结果集。 如果执行的 SQL 语句是查询语句,则执行结果将返回ResultSet 对象,该对象里保存了 SQL 语句查询的结果。程序可以通过操作该 ResultSet 象来取出查询结果。
 ResultSet rs =null;
 rs.next()
//6.回收数据库资源,包括关闭 ResultSet Statement Connection 等资源。
rs.close();
p.close();
conn.close();

mysql 在查询结果中进行二次查询

SELECT SUM(a) FROM (SELECT COUNT(1)-1 AS a from shoppingmall.orders_ods_t GROUP by shipvia)  temp;

核心的问题

Mysql三大范式

建立冗余较小、结构合理的数据库
第一范式:要求数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式
第二范式: 要求实体中没一行的所有非主属性都必须完全依赖于主键;即:非主属性必须完全依赖于主键。在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中

订单编号 商品编号 商品名称 数量 单位 价格 客户 所属单位 联系方式
dd001 001 手机 1 3999 张三 泰国 123456
dd001 002 电脑 2 4999 李四 新加坡 321457

商品信息表

商品编号 商品名称 单位 价格
001 手机 3999
002 电脑 4999

订单表

订单编号 商品编号 数量
dd001 001 1
dd002 002 2

第三范式:三范式要求:实体中的属性不能是其他实体中的非主属性。因为这样会出现冗余。即:属性不依赖于其他非主属性

数据库事物

定义:数据库事务是构成单一逻辑工作单元的操作集合
事务就是将一组SQL语句放在同一批次内去执行
– 隔离级别
事务具有隔离性,理论上来说事务之间的执行不应该相互产生影响,其对数据库的影响应该和它们串行执行时一样。
然而完全的隔离性会导致系统并发性能很低,降低对资源的利用率,因而实际上对隔离性的要求会有所放宽,这也会一定程度造成对数据库一致性要求降低

数据库常见的并发异常。

  • 脏写

脏写是指事务回滚了其他事务对数据项的已提交修改,
– 脏读

脏读是指一个事务读取了另一个事务未提交的数据
– 幻读

幻读是指事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。因而幻读通常出现在带有查询条件的范围查询中.