MySQL 基础

159 阅读9分钟

1. 数据库的好处

1.持久化数据到本地
2.可以实现结构化查询,方便管理

2. 数据库相关概念

1、DB:数据库,保存一组有组织的数据的容器
2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据
3、SQL:结构化查询语言,用于和DBMS通信的语言

3. 数据库存储数据的特点

1、将数据放到表中,表再放到库中
2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。
3、表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。
4、表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性”
5、表中的数据是按行存储的,每一行类似于java中的“对象”。

4. MySQL产品的介绍和安装

MySQL数据模型.png

4.1 MySQL服务的启动/停止

net start 服务名(启动服务)
net stop 服务名(停止服务)

4.2 MySQL服务的登录/退出

// 登录:
mysql -h主机名 -P端口号 -u用户名 -p密码   //(如果连接的是本机的话-h,-P可省略)
// 退出:
exit 或 ctrl+C

4.3 MySQL的常见命令

// 1.查看当前所有的数据库
show databases;
-- 查看创建某个数据库的定义信息
-- 说明: 在创建数据库,表的时候,为了规避关键字,可以使用反引号解决
SHOW CREATE DATABASE `数据库名`;

-- 创建一个使用utf8字符集的数据库
CREATE DATABASE db02 CHARACTER SET utf8;

-- 创建一个使用utf8字符集的,并且带校验规则的数据库
-- 校验规则 utf8_bin 区分大小 
-- 默认utf8_general_ci 不区分大小
CREATE DATABASE db03 CHARACTER set utf8 COLLATE utf8_bin;

-- 备份恢复数据库(DOS命令)
-- mysqldump -u 用户名 -p -B 数据库1 数据库2 数据库n >文件名.sql

-- 恢复数据库(注意:进入 Mysql 命令行再执行)
source 文件名.sql
-- 第二个恢复方法, 直接将 bak.sql 的内容放到查询编辑器中,执行

// 2.打开指定的库
use 库名;

// 3.查看当前库的所有表
show tables;

// 4.查看其它库的所有表
show tables from 库名;

// 5.创建表
create table 表名(
	列名 列类型,
	列名 列类型,
	...
);

// 6.查看表结构
desc 表名;

// 7.查看服务器的版本
方式一:登录到mysql服务端
select version();
方式二:没有登录到mysql服务端
mysql --version
或
mysql --V

4.4 MySQL的语法规范

1.不区分大小写,但建议关键字大写,表名、列名小写 
2.每条命令最好用分号结尾 
3.每条命令根据需要,可以进行缩进 或换行 
4.注释 
单行注释:#注释文字 
单行注释:-- 注释文字 
多行注释:/* 注释文字 */

5. SQL语言

SQL 语言分类:

DQL(Data Query Language):数据查询语言
select
DML(Data Manipulate Language):数据操作语言(对表中的数据进行增删改
insert 、update、delete
DDL(Data Define Languge):数据定义语言(操作数据库,表等
create、drop、alter
TCL(Transaction Control Language):事务控制语言
commit、rollback

SQL 数据类型:

image.png

5.1 DDL(Data Define Languge)

DDL --操作数据库

1.查询
show databases;

2.创建
# 创建数据库
create database 数据库名称;
# 创建数据库(判断,如果不存在则创建)
create database if not exists 数据库名称;

3.删除数据库
# 删除数据库
drop database 数据库名称;
# 删除数据库(判断,如果存在则删除)
drop database if exists 数据库名称;

4.使用数据库
# 查看当前使用的数据库
select database();
# 使用数据库
use 数据库名称;

DDL --操作表

1. 查询表:
# 查询当前数据库下所有的表名称
show tables;

# 查询表结构(是表结构,不是数据)
desc 表名称;
-----------------------------------------------------

2. 创建表:
create table 表名 (
        字段名1 数据类型1,
        字段名2 数据类型2,
        ....
        字段名n 数据类型n
)
CHARACTER SET 字符集 COLLATE 校对规则 ENGINE 存储引擎;
# 注意: 字段部分最后一行末尾,不能加逗号
#        如果不指定字符集和校对规则就按数据库的字符集和校对规则  
-----------------------------------------------------

3. 删除表:
# 删除表
drop table 表名;
# 删除表时判断表是否存在
drop table if exists 表名;
-----------------------------------------------------

4. 修改表:
# 修改表名
alter table 表名 rename to 新的表名;
# 添加一列
alter table 表名 add 列名 数据类型;
# 修改数据类型
alter table 表名 modify 列名 新数据类型;
# 修改列名和数据类型
alter table 表名 change 列名 新列名 新数据类型;
# 删除列
alter table 表名 drop 列名;

5.2 DML(Data Manipulate Languge)

1. 添加数据 
# 给指定列添加数据
insert into 表名(列名1,列名2,...) values(值1,值2,...);
# 给全部列添加数据
insert into 表名 values(值1,值2,...);
# 批量添加数据
insert into 表名(列名1,列名2,...) values(值1,值2,...),(值1,值2,...),(值1,值2,...)...;
insert into 表名 values(值1,值2,...),(值1,值2,...),(值1,值2,...)...;
# 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错 
-- 如果某个列 没有指定 not null ,那么当添加数据时,没有给定值,则会默认给 null 
-- 如果我们希望指定某个列的默认值,可以在创建表时指定
CREATE TABLE 表名(
    字段名 字段类型 NOT NULL DEFAULT  默认值
) CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB;

2. 修改数据
# 修改表数据
update 表名 set 列名1 =1,列名2 =2,... where 条件;
# 注意:修改语句中如果不加条件,则将所有数据都修改!

3. 删除数据
delete from 表名 where 条件;
# 注意:删除语句中如果不加条件,则将所有数据都删除!

5.2 DQL(Data Query Language)

5.2.1 基础查询

# 查询表中的多个字段
SELECT 字段1,字段2,... FROM 表名;
SELECT * FROM 表名;

# 去重
SELECT DISTINCT 字段1,字段2,... FROM 表名;

# 起别名
-- 方式一:使用as
SELECT 字段1 AS 别名1,字段2 AS 别名2,.. FROM 表名;
-- 方式二:使用空格
SELECT 字段1 别名1,字段2 别名2,.. FROM 表名;

5.2.2 条件查询(where)

# 语法: 
    select 要查询的字段|表达式|常量值|函数 fromwhere 条件 ;

# 分类:
一、条件表达式
条件运算符:
        >  <  >=  <=  =  !=  <>
	示例:salary>10000
二、逻辑表达式
逻辑运算符:
	and&&):两个条件如果同时成立,结果为true,否则为false
	or(||):两个条件只要有一个成立,结果为true,否则为false
	not(!):如果条件成立,则not后为false,否则为true
        between  and : 选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
        in: 允许我们在 WHERE 子句中规定多个值。
        is null: 是 null
        is not null: 不 是 null
        
        示例:
        where salary between 10000 and 20000;
        where age in(20,30,40);  --年龄等于20 或 30 或 40
三、模糊查询
        like 占位符:模糊查询 _单个任意字符, %多个任意字符
        
        示例:
        SELECT * FROM stu WHERE `name` LIKE '马%';   --找出姓‘马’的学员
        SELECT * FROM stu WHERE `name` LIKE '_花%';  --找出姓第二个字为‘花’的学员
        SELECT * FROM stu WHERE `name` LIKE '%德%';  --找出包含‘德’的学员        

5.2.3 排序查询(order by)

select 字段列表 from 表名 order by 排序字段名1 排序方式1 , 排序字段名2 排序方式2,...;

# 排序方式:
asc: 升序排列 (默认值)
desc: 降序排列
--注意:如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序

示例:
SELECT * FROM stu ORDER BY age; 	--默认按照 age 升序排列
SELECT * FROM stu ORDER BY age ASC; 	--按照 age 升序排列
SELECT * FROM stu ORDER BY age DESC; 	--按照 age 降序排列
SELECT * FROM stu ORDER BY math DESC , english ASC; 	--按照数学成绩降序排列,如果数学成绩一样,再按英语成绩升序排列

5.2.5 分组查询(group by)

# 聚合函数
1.概念:
将一列数据作为一个整体,进行纵向计算。

2.聚合函数分类:
    函数名               功能
count(列名)           统计数量(一般不为null的列)      
max(列名)             最大值
min(列名)             最小值
sum(列名)             求和
avg(列名)             平均值

3.聚合函数语法:
select 聚合函数名(列名) from 表;
-- 注意null值不参与所有聚合函数运算
# 分组查询
select 字段列表 from 表名 [where 分组前条件限定] group by 分组字段名 [having 分组后条件过滤]
-- 注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义;

# wherehaving 区别:
1.执行时机不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤。
2.可判断的条件不一样:where不能对聚合函数进行判断,having可以。

# 执行顺序: where > 聚合函数 >having 

示例:
-- 1.查询男同学和女同学各自的数学平均分;
SELECT sex, AVG(math) FROM stu GROUP BY sex;

-- 2.查询男同学和女同学各自的数学平均分,以及各自的人数;
SELECT sex, AVG(math),COUNT(*) FROM stu GROUP BY sex;

-- 3.查询男同学和女同学各自的数学平均分,以及各自的人数,要求:低于70分的不参与分组;
SELECT sex,AVG(math),COUNT(*) FROM stu WHERE math>=70 GROUP BY sex;

-- 4.查询男同学和女同学各自的数学平均分,以及各自的人数,要求:低于70分的不参与分组,分组后人数大于2;
SELECT sex,AVG(math),COUNT(*) FROM stu WHERE math>=70 GROUP BY sex HAVING COUNT(*)>2;

5.2.6 分页查询(limit)

1.分页查询语法
select 字段列表 from 表名 limit 起始索引,查询条目数;
-- 起始索引:从0开始
-- 计算公式:起始索引=(当前页码-1)*每页显示的条数

-- tip:
    -- Oracle 分页查询使用 rownumber
    -- SQL Server 分页查询使用 top

示例:
-- 1.从0开始查询,查询3条数据
SELECT * FROM stu LIMIT 0 , 3;

-- 2.每页显示3条数据,查询第1页数据
SELECT * FROM stu LIMIT 0 , 3;

-- 3.每页显示3条数据,查询第2页数据
SELECT * FROM stu LIMIT 3 , 3;

-- 4.每页显示3条数据,查询第3页数据
SELECT * FROM stu LIMIT 6 , 3;