文章目录
- 一、MySql概述
-
- 1.1安装
-
- [1.1.1 版本](#1.1.1 版本)
- [1.1.2 连接](#1.1.2 连接)
- [1.1.3 企业使用方式(了解)](#1.1.3 企业使用方式(了解))
- [1.2 数据模型](#1.2 数据模型)
-
- [1.2.1 关系型数据库](#1.2.1 关系型数据库)
- [1.2.2 数据模型](#1.2.2 数据模型)
- [1.2 SQL简介](#1.2 SQL简介)
-
- [1.2.1 分类](#1.2.1 分类)
- [1.2.2 通用语法](#1.2.2 通用语法)
- 二、SQL语句(DDL、DML、DQL)
-
- [2.1 DDL(数据定义语言)](#2.1 DDL(数据定义语言))
-
- [2.1.1 创建表的语法](#2.1.1 创建表的语法)
- [2.1.2 数据类型](#2.1.2 数据类型)
- [2.1.3 设计表的流程](#2.1.3 设计表的流程)
- [2.1.4 查询](#2.1.4 查询)
- [2.1.5 修改](#2.1.5 修改)
- [2.2 DML(数据操作语言)](#2.2 DML(数据操作语言))
-
- [2.2.1 insert(增)](#2.2.1 insert(增))
- [2.2.2 update(改)](#2.2.2 update(改))
- [2.2.3 delete(删)](#2.2.3 delete(删))
- [2.3 DQL(数据查询语言)](#2.3 DQL(数据查询语言))
-
- [2.3.1 完整的DQL语句语法](#2.3.1 完整的DQL语句语法)
- [2.3.2 基本查询](#2.3.2 基本查询)
- [2.3.3 条件查询](#2.3.3 条件查询)
- [2.3.4 分组查询](#2.3.4 分组查询)
-
- [2.3.4.1 聚合函数](#2.3.4.1 聚合函数)
- [2.3.4.2 分组查询语法](#2.3.4.2 分组查询语法)
- [2.3.5 排序查询](#2.3.5 排序查询)
- [2.3.6 分页查询](#2.3.6 分页查询)
一、MySql概述
1.1安装
1.1.1 版本
MySQL官方提供了两个版本:
商业版(MySQL Enterprise Edition):该版本是收费的,我们可以使用30天,官方会提供对应的技术支持
社区版本(MySQL Community Server):该版本是免费的,但是MySQL不回提供任何技术支持
1.1.2 连接
MySQL服务启动完毕后,然后在使用如下指令来连接MySQL服务器:
java
mysql -u用户名 -p密码 [-h数据库服务器的ip地址 -p端口号]
注意:
-h 参数不加,默认连接的是本地127.0.0.1的MySQL服务器
-p 参数不加,默认连接的端口号是3306
上述指令,可以有两种形式:
①密码直接在-p参数后直接指定(这种方式不安全,密码直接以明文形式出现在命令行)
②密码在-p回车之后,在命令行输入密码,然后回车
1.1.3 企业使用方式(了解)
通过MySQL客户端命令行,如何来连接服务器上部署的MySQL
java
mysql [-h数据库服务器的ip地址 -p端口号] -u用户名 -p密码
1.2 数据模型
1.2.1 关系型数据库
概念:建立在关系模型基础上,由多张相互连接的二维表
组成的数据库,所谓的二维表就是由行和列组成的
二维表的优点:
①使用表存储数据,格式统一,便于维护
②使用SQL语言操作,标准统一,使用方便,可用于复杂查询
1.2.2 数据模型
MySQL是关系型数据库,是基于二维表进行数据存储的,具体的结构图如下:
①通过MySQL客户端连接数据库管理系统DBMS,然后通过DBMS操作数据库
②使用MySQL客户端,向数据库管理系统发送一条SQL语句,由数据库管理系统根据SQL语句指令去操作数据库中的表结构及数据
③一个数据库服务器中可以创建多个数据库,一个数据库中也可以包含多张表,而一张表中又可以包含多行记录
在MySQL数据库服务器当中存储数据,你需要:
①先创建数据库(可以创建多个数据库,之间是相互独立的)
②在数据库下再创建数据表(一个数据库下可以创建多张表)
③再将数据存放再数据表中(一张表可以存储多行数据)
1.2 SQL简介
SQL:一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准
1.2.1 分类

1.2.2 通用语法
①SQL语句可以单行或者多行书写,以分号结尾
②SQL语句可以使用空格/缩进来增强语句的可读性
③MySQL数据库的SQL语句不区分大小写
④注释:
Ⅰ单行注释:--注释内容 或 # 注释内容(MySQL特有);
Ⅱ多行注释:/* 注释内容 */
二、SQL语句(DDL、DML、DQL)
2.1 DDL(数据定义语言)
相关语法:
java
-- 查询所有数据库
show databases;
-- 查询当前数据库
select database();
-- 使用/切换数据库
use 数据库名;
-- 创建数据库
create database [if exists] 数据库名 [default charset utf8mb4];
-- 删除数据库
drop database [if exists] 数据库名;
-- 数据库不存在,则创建该数据库;如果存在则不创建
create database if not extists 数据库名;
注意:
上述语法中的database,也可以替换成 schema。如create schema db01;MySQL版本中,默认字符集为utf8mb4
2.1.1 创建表的语法
java
create table 表名(
字段1 字段类型 [约束] [comment 字段1注释],
................................................
字段2 字段类型 [约束] [comment 字段1注释]
)[comment 标注释];
示例:
java
create table tb_user (
id int comment 'ID,唯一标识', # id是一行数据的唯一标识(不能重复)
username varchar(20) comment '用户名',
name varchar(10) comment '姓名',
age int comment '年龄',
gender char(1) comment '性别'
) comment '用户表';
约束:约束是作用于标种字段上的规则,用于限制存储在表中的数据
目的:保证数据库的正确性,有效性和完整性
java
create table tb_user (
id int primary key comment 'ID,唯一标识',
username varchar(20) not null unique comment '用户名',
name varchar(10) not null comment '姓名',
age int comment '年龄',
gender char(1) default '男' comment '性别'
) comment '用户表';
主键自增:auto_increment
每次插入新的行记录时,数据库自动生成id字段(主键)下的值
具有auto_increment的数据列是一个正数序列开始增长(从1开始自增)
2.1.2 数据类型
MySQL中的数据类型有很多种,主要分为三类:数值型、字符串类型、日期时间类型
①数值类型
示例:
java
年龄字段 ---不会出现负数, 而且人的年龄不会太大
age tinyint unsigned
分数 ---总分100分, 最多出现一位小数
score double(4,1)
问:数值类型在定义的时候,后面加了unsigned
关键字是什么意思?
Ⅰunsigned表示无符号类型,表示只能取0及正数
Ⅱ不加默认是signed,表示可以取负数
②字符串类型
注意:
char于varchar都可以描述字符串,char是定长字符串,指定长度多长,就占用多少个字符,和字段的长度无关。而varchar是边长字符串,指定的长度为最大占用长度,相对来说,char的性能会更好一些
示例:
java
用户名 username ---长度不定, 最长不会超过50
username varchar(50)
手机号 phone ---固定长度为11
phone char(11)
③日期时间类型
示例:
java
生日字段 birthday ---生日只需要年月日
birthday date
创建时间 createtime --- 需要精确到时分秒
createtime datetime
2.1.3 设计表的流程
①阅读页面原型及需求文档
②基于页面原型和需求文档,确定原型字段(类型、长度限制、,约束)
③再增加表设计所需要的业务基础字段(id、create_time、update_time)
2.1.4 查询
关于表结构的查询操作,一般都是直接基于图形化界面操作。
java
-- 查询当前数据库的所有表
show tables;
-- 查看指定表结构
desc 表名 ; #可以查看指定表的字段、字段的类型、是否可以为NULL、是否存在默认值等信息
-- 查询指定表的建表语句
show create table 表名 ;
2.1.5 修改
关于表结构的修改操作,一般都是直接基于图形化界面操作。
java
-- 添加字段
alter table 表名 add 字段名 类型(长度) [comment 注释] [约束];
示例:
alter table tb_emp add qq varchar(11) comment 'QQ号码';
-- 修改数据类型
alter table 表名 modify 字段名 新数据类型(长度);
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];
示例:
alter table tb_emp modify qq varchar(13) comment 'QQ号码';
-- 删除字段
alter table 表名 drop 字段名;
示例:
alter table tb_emp drop qq_num;
-- 修改表名
rename table 表名 to 新表名;
示例:
rename table emp to tb_emp;
-- 删除表语法
drop table [ if exists ] 表名;
-- if exists :只有表名存在时才会删除该表,表名不存在,则不执行删除操作(如果不加该参数项,删除一张不存在的表,执行将会报错)。
示例:
drop table if exists tb_emp; -- 在删除表时,表中的全部数据也会被删除。
2.2 DML(数据操作语言)
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中的记录进行增、删、改操作
2.2.1 insert(增)
java
-- 向指定字段添加数据
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.2.2 update(改)
java
update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [where 条件] ;
示例:
update emp set entry_date='2010-01-01', update_time=now();
注意:
①修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据
②在修改数据时,一般需要同时修改公共字段update_time,将其修改为当前操作时间。
2.2.3 delete(删)
java
delete from 表名 [where 条件] ;
示例:
delete from emp where id = 1;
注意:
①DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据
②DELETE语句不能删除某一个字段的值(可以使用UPDATE,将该字段设置为NULL即可)
③当进行删除全部数据操作时,会提示询问是否确认删除所有数据,直接点Execute即可。
2.3 DQL(数据查询语言)
2.3.1 完整的DQL语句语法
java
select
字段列表
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
order by
排序字段列表
limit
分页参数
①基本查询(select......from......)
②条件查询(where)
③分组查询(group by)
④排序查询(order by)
⑤分页查询(limit)
2.3.2 基本查询
java
-- 查询多个字段
select 字段1, 字段2, 字段3 from 表名;
-- 查询所有字段(通配符)
select * from 表名;
-- 为查询字段设置别名
select 字段1 [as 别名1], 字段2 [as 别名2] from 表名;
-- 去除重复记录
select distinct 字段列表 from 表名;
注意:
"*" 代表拆线呢所有字段,在实际开发中尽力少用(不直观、影响效率)
2.3.3 条件查询
java
select 字段列表 from 表名 where 条件列表;
①如何进行null值的判断:is null ; is not null
②模糊匹配中的通配符 %(任意个字符);_(一个字符)
③如何组装多个查询条件:and / or
2.3.4 分组查询
分组:就是按列进行分类(指定列下相同的数据归为一类),然后可以对分类的数据进行合并计算
分组拆线呢通常会使用聚合函数进行计算
2.3.4.1 聚合函数
聚合函数:将一列数据作为一个整体,进行纵向计算
①count :按照列去统计有多少行数据。在根据指定的列统计的时候,如果这一列中有null的行,该行不会被统计在其中。
②sum :计算指定列的数值和,如果不是数值类型,那么计算结果为0
③max :计算指定列的最大值
④min :计算指定列的最小值
⑤avg :计算指定列的平均值
注意:
①null值不参与计算所有的聚合函数
②统计数量可以使用:count(*);count(字段);count(常量);推荐使用count(*)
2.3.4.2 分组查询语法
java
-- 条件查询
select 字段列表 from 表名 [where 条件列表] group by 分组字段名 [having 分组后过滤条件];
where与having的区别:
①执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后会结果进行过滤
②判断调价不同:where不能对聚合函数进行判断,而having可以
注意:
①分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
②执行顺序:where > 聚合函数 > having
2.3.5 排序查询
java
select 字段列表 from 表名 [where 条件列表] [group by 分组字段名 having 分组后过滤条件] order by 排序字段 排序方法;
排序方法:升序(asc)降序(desc);默认为升序,是可以不写的
注意:
如果是多字段排序,当地一个字段值相同时,才会根据第二个字段进行排序
2.3.6 分页查询
java
select 字段 from 表名 [where 条件] [group by 分组字段 having 过滤条件] [order by 排序字段 排序函数] limit 起始索引, 查询记录数;
说明:
①起始索引从0开始 起始索引 = (查询页码 - 1)* 每页显示记录数
②分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT
③如果查询的是第一页的数据,起始索引可以省略,直接简写为 limit 10