一、是什么
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上的基本操作
- 查看数据库
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)
- 查询数据库容量
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常见的数据库对象
- 表(Table )
数据库中的表与我们日常生活中使用的表格类似,它也是由行(Row) 和列(Column)组成的。列由同类的信息组成,每列又称为一个字段,每列的标题称为字段名。行包括了若干列信息项。一行数据称为一个或一条记录,它表达有一定意义的信息组合。一个数据库表由一条或多条记录组成,没有记录的表称为空表。每个表中通常都有一个主关键字,用于惟一地确定一条记录。
- 约束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)
);
- 索引(Index)
索引是根据指定的数据库表列建立起来的顺序。它提供了快速访问数据的途径,并且可监督表的数据,使其索引所指向的列中的数据不重复。mysql使用information_schema数据库中的STATISTICS表来保存该数据库实例中的所有信息。
创建索引有两种方法;
自动:当在表上定义主键约束、唯一约束和外键约束时系统为该数据列自动创建索引;
手动:create index…
索引有以下几种类型;
主键索引(PRIMARY KEY)
唯一索引(UNIQUE)
常规索引(INDEX)
全文索引(FULLTEXT)
create ndex index name
on table name (column[ , column) . ..);
drop ndex 索引名 on 表名
- 视图(View)
视图看上去同表似乎一模一样,具有一组命名的字段和数据项,但它其实是一个虚拟的表,在数据库中并不实际存。在视图是由查询数据库表产生的,它限制了用户能看到和修改的数据。由此可见,视图可以用来控制用户对数据的访问,并能简化数据的显示,即通过视图只显示那些需要的数据信息。
create or replace view view_test
as
select teacher name , teacher_pass from teacher_table;
- 函数(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
- 触发器(Trigger)
触发器是一个用户定义的SQL事务命令的集合。当对一个表进行插入、更改、删除时,这组命令就会自动执行。
- 存储过程(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语句放在同一批次内去执行
– 隔离级别
事务具有隔离性,理论上来说事务之间的执行不应该相互产生影响,其对数据库的影响应该和它们串行执行时一样。
然而完全的隔离性会导致系统并发性能很低,降低对资源的利用率,因而实际上对隔离性的要求会有所放宽,这也会一定程度造成对数据库一致性要求降低
数据库常见的并发异常。
- 脏写
脏写是指事务回滚了其他事务对数据项的已提交修改,
– 脏读
脏读是指一个事务读取了另一个事务未提交的数据
– 幻读
幻读是指事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。因而幻读通常出现在带有查询条件的范围查询中.