MySQL 基础

  • 一、MySQL数据库介绍
  • 什么是数据库
  • 作用
  • 常见的数据库
  • 认识mysql数据库
  • 二、MySQL 基本命令
  • 三、MySQL 基础操作
  • 1、数据库语法特点
  • 2、数据库操作
  • 3、数据表操作
  • 4、数据操作,增删改查
  • 5、退出MySQL
  • 四、MySQL 数据类型
  • 1、字符串数据类型
  • 2、数值类型
  • 3、日期和事件类型
  • 4、二进制数值类型
  • 五、表的字段约束
  • 六、MySQL 运算符
  • 七、主键
  • 八、数据库和数据表操作
  • 数据库的操作
  • 1.数据库的创建
  • 2.查看所有库
  • 3.打开库、进入库、选择库
  • 4.删除库
  • 数据表操作
  • 1.创建表
  • 2.查看表结构
  • 3.查看建表语句
  • 4.修改表结构
  • 5.修改表名
  • 6.更改表中的自增的值
  • 7.修改表引擎
  • 8.删除表
  • 九、DQL-MySQL数据查询SQL
  • 1、基础查询
  • 2、where 条件查询
  • 3、and和or 使用时注意
  • 4、like子句
  • 5、MySQL 中的统计函数(聚合函数)
  • 6、Group BY 分组
  • 7、Order BY排序
  • 8、Limit 数据分页
  • 总结
  • 十、Mysql数据库导入导出和授权
  • 数据导出
  • 1、数据库数据导出
  • 2、将数据库中的表导出
  • 数据导入
  • 权限管理


一、MySQL数据库介绍

什么是数据库

数据库(Database)就是按照数据结构来组织,存储和管理数据的仓库
专业的数据库是专门对数据进行创建,访问,管理,搜索等操作的软件,比起我们自己用文件读写的方 式对象数据进行管理更加的方便,快速,安全

作用

  • 对数据进行持久化的保存
  • 方便数据的存储和查询,速度快,安全,方便
  • 可以处理并发访问
  • 更加安全的权限管理访问机制

常见的数据库

数据库分两大类:一类是关系型数据库,另一类叫做非关系型数据库

  • 关系型数据库: MySQL,Oracle,PostgreSQL,SQLserver。。。。
  • 非关系型数据库:Redis内存数据库,MongoDB文档数据库。。

认识mysql数据库

MySQL数据库时最流行的关系型数据库管理系统
关于数据库的一些概念

  • 数据库 Database
  • 数据表 Tables
  • 数据字段
  • 行 row

二、MySQL 基本命令

登录mysql,在终端输入以下命令

mysql -u root -p

查看mysql中所有库

show databases;

选择需要操作的库

use mysql

查看当前库中所有数据表

show tables;

查看表中的数据

select * from user;

库和表的概念关系

库就像一个文件夹,库中可以有很多表
表就像excel表格文件一样
每一个表都可以存储很多数据

mysql中可以有很多不同的库,库中可以有很多不同的表
表中可以定义不同的列(字段),
表中可以根据结构去存储很多的数据

如何创建自己的库

create database 库名 default charset=utf8;

创建表的用法

create table user(
	id int primary key not null,
	name varchar(5),
	age varchar(3)
)engine=innodb default charset=utf8;

添加数据

insert into user(id,name,age) value(01,"张三",23),(02,"李四",32);

三、MySQL 基础操作

使用方法:

方式一: 通过在命令行敲命令来操作 ( 有助于命令的掌握)

方式二: 通过图型界面工具,如 Navicat 等(在熟练掌握后再使用)

方式三:通过编程语言(python,php,java,go…)执行mysql命令

SQL ( Structure query language ) 结构化查询语言

SQL 语言分为四个部分:

  • DDL(定义)
  • DML(操作)
  • DQL(查询)
  • DCL(控制)

SQL语句中的快捷键

\G 格式化输出(文本式,竖立显示)

\s 查看服务器端信息

\c 结束命令输入操作

\q 退出当前sql命令行模式

\h 查看帮助

1、数据库语法特点

  • SQL语句可以换行,要以分号结尾
  • 命令不区分大小,关键字和函数建议用大写
  • 如果命令提示符为"->",那么需要回车
  • 命令打错了换行后不能修改, 可以用 \c 取消

2、数据库操作

查看数据库
show databases;

创建数据库
create database 库名 default charset=utf8;

删除数据库
drop database 库名;

打开数据库
use 库名;

3、数据表操作

查看表:
show tables;创建表:
create table 表名(字段名1 类型,字段名2 类型)engine=innodb default charset=utf8;

创建表: 如果表不存在,则创建, 如果存在就不执行这条命令

create table if not exists 表名(字段1 类型,字段2 类型);

删除表:
drop table 表名;

表结构:
desc 表名;

查看建标语句:
show create table users;

4、数据操作,增删改查

插入

insert into 表名(字段1,字段2,字段3) values(值1,值2,值3);

insert into 表名(字段1,字段2,字段3) values(a值1,a值2,a值3),(b值1,b值2,b值3);

查询

select * from 表名; 

select 字段1,字段2,字段3 from 表名;

select * from 表名 where 字段=某个值;

修改

update 表名 set 字段=某个值 where 条件; 

update 表名 set 字段1=值1,字段2=值2 where 条件; 

update 表名 set 字段=字段+值 where 条件;

删除

delete from 表名 where 字段=某个值;

5、退出MySQL

exit;
quit;

四、MySQL 数据类型

1、字符串数据类型

mysql 列空不拼接非空拼接_sql

有两种基本的串类型,分别为定长串和变长串

定长串:char

  1. 接受长度固定的字符串,其长度是在创建表时指定的。 定长列不允许存储多于指定长度字符的数据。
  2. 指定长度后,就会分配固定的存储空间用于存放数据
    char(7) 不管实际插入多少字符,它都会占用7个字符位置

变长串:varchar

存储可变长度的字符串 varchar(7) 如果实际插入4个字符, 那么它只占4个字符位置,当然插入的数据长度不能超过7 个字符。

注意:

既然变长数据类型这样灵活,为什么还要使用定长数据类型?
回答:因为性能,MySQL处理定长列远比处理变长列快得多。

Text:变长文本类型存储

2、数值类型

mysql 列空不拼接非空拼接_mysql 列空不拼接非空拼接_02

数值数据类型存储数值。

MySQL支持多种数值数据类型,每种存储的数值具有不同的取值范围。

支持的取值范围越大,所需存储空间越多

有符号或无符号

所有数值数据类型(除BIT和BOOLEAN外)都可以有符号或无符号

  • 有符号数值可以存储正或负的数值
  • 无符号数值列只能存储正数
  • 默认情况为有符号,但如果你知道自己不需要存储负值,可以使用UNSIGNED关键字

3、日期和事件类型

mysql 列空不拼接非空拼接_mysql_03

MySQL使用专门的数据类型来存储日期和时间值

datetime 8字节1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

4、二进制数值类型

mysql 列空不拼接非空拼接_mysql 列空不拼接非空拼接_04

二进制数据类型可存储任何数据(甚至包括二进制信息),如图像、多媒体、字处理文档等

五、表的字段约束

  • unsigned 无符号(给数值类型使用,表示为正数,不写可以表示正负数都可以)
  • 字段类型后面加括号限制宽度 char(5). varchar(7)
  • 在字符类型后面加限制 表示 字符串的长度
  • int(4) 没有意义,默认无符号的int为int(11),有符号的int(10)
  • int(4) unsigned zerofill只有当给int类型设置有前导零时,设置int的宽度才有意义。
  • not null 不能为空,在操作数据库时如果输入该字段的数据为NULL ,就会报错
  • default 设置默认值
  • primary key 主键不能为空,且唯一.一般和自动递增一起配合使用。
  • auto_increment 定义列为自增属性,一般用于主键,数值会自动加1
  • unique 唯一索引(数据不能重复:用户名)可以增加查询速度,但是会降低插入和更新速度

六、MySQL 运算符

  • 算术运算符: +、 -、 *、 /、 %
  • 比较运算符: =、 >、 <、 >=、 <=、!=
  • 数据库特有的比较: in、not in、is null、is not null、like、between、and
  • 逻辑运算符: and、or、not
  • like: 支持特殊符号%和_ ;
    其中%表示任意数量的任意字符,_表示任意一位字符

七、主键

1、表中每一行都应该有可以唯一标识自己的一列,用于记录两条记录不能重复,任意两行都不具有相同的主键值
2、应该总是定义主键 虽然并不总是都需要主键,但大多数数据库设计人员都应保证他们创建的每个表具有一个主 键,以便于以后的数据操纵和管理。

要求:

  • 记录一旦插入到表中,主键最好不要再修改
  • 不允许NULL
  • 不在主键列中使用可能会更改的值。
  • 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键 重复,也不用自己预先生成主键
  • 可以使用多个列作为联合主键,但联合主键并不常用。使用多列作为主键时,所有列值的组合必须是唯一的

八、数据库和数据表操作

  • 数据库的操作
  • 数据库创建
  • 数据库删除
  • 数据表的操作
  • 数据表的创建
  • 数据表的修改 (表结构)
  • 数据表的删除

数据库的操作

1.数据库的创建

#  链接mysql数据库后,进入mysql后可以操作数据

# 1. 创建库
create database if not exists tlxy default charset=utf8;
-- 1. 数据库 tlxy 如果不存在则创建数据库,存在则不创建
-- 2. 创建 tlxy 数据库,并设置字符集为utf8
-- 3. 无特殊情况都要求字符集为utf8或者utf8mb4的字符编码

2.查看所有库

show databases;

3.打开库、进入库、选择库

use tlxy;

4.删除库

#  删除库,那么库中的所有数据都将在磁盘中删除。
drop database 库名

数据表操作

1.创建表

语法格式:

create table 表名(字段名,类型,【字段约束】,。。。);
# 以下创建一个  users 的表
create table users(
-- 创建ID字段,为正整数,不允许为空 主键,自动递增
id int unsigned not null primary key auto_increment,
-- 创建 存储 名字的字段,为字符串类型,最大长度 5个字符,不允许为空 username varchar(5) not null,
-- 创建存储 密码 的字段,固定长度 32位字符,  不允许为空
password char(32) not null,
-- 创建 年龄 字段,不允许为空,默认值为 20 age tinyint not null default 20
)engine=innodb default charset=utf8;

2.查看表结构

desc users;

3.查看建表语句

show create table users;

创建表的基本原则:

  • 表明和字段名 尽可能的符合命名规范,并且最好能够‘见名之意’ 表中数据必须有唯一标示,即主键定义。
  • 无特殊情况,主键都为数字并自增即可 表中字段所对应的类型设置合理,并限制合理长度
  • 表引擎推荐使用innodb,并无特殊情况都要求为utf8或者utf8mb4的字符编码

4.修改表结构

语法格式:

alter table 表名 action (更改的选项)

添加字段

# 语法:alter table 表名 add 添加的字段信息
-- 在 users 表中 追加 一个 num  字段
alter table users add num int not null;

-- 在指定字段后面追加字段 在 users 表中 age字段后面 添加一个 email  字段
alter table users add email varchar(50) after age;

-- 在指定字段后面追加字段,在 users 表中 age字段后面 添加一个 phone alter table users add phone char(11) not null after age;

-- 在表的最前面添加一个字段
alter table users add aa int first;

删除字段

# 删除字段 alter table 表名 drop 被删除的字段名
alter table users drop aa;

修改字段

--语法格式: 
alter table 表名 change|modify 被修改的字段信息
--change: 可以修改字段名,
--modify: 不能修改字段名。

# 修改表中的 num 字段 类型,使用 modify 不修改表名
alter table users modify num tinyint not null default 12;

# 修改表中的 num 字段 为 int并且字段名为 nn alter table users change num mm int;

#  注意:一般情况下,无特殊要求,不要轻易修改表结构

5.修改表名

# 语法:alter table 原表名 rename as 新表名

6.更改表中的自增的值

# 在常规情况下,auto_increment 默认从1开始继续递增
alter table users auto_increment = 1000;

7.修改表引擎

# 推荐在定义表时,表引擎为 innodb。
# 通过查看建表语句获取当前的表引擎
mysql> show create table users\G;
*************************** 1. row *************************** Table: users
Create Table: CREATE TABLE `users` (
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

# 直接查看当前表状态信息
mysql> show table status from tlxy where name = 'users'\G;
*************************** 1. row *************************** Name: users
Engine: InnoDB

# 修改表引擎语句
alter table users engine = 'myisam';

8.删除表

drop table 表名;

九、DQL-MySQL数据查询SQL

语法格式:

select 字段列表|* from 表名
[where 搜索条件]
[group by 分组字段 [having 分组条件]]
[order by 排序字段 排序规则]
[limit 分页参数]

1、基础查询

# 查询表中所有列 所有数据
select * from users;
# 指定字段列表进行查询
select id,name,phone from users;

2、where 条件查询

  • 可以在where子句中指定任何条件
  • 可以使用 and 或者 or 指定一个或多个条件
  • where条件也可以运用在update和delete语句的后面
  • where子句类似程序语言中if条件,根据mysql表中的字段值来进行数据的过滤
-- 查询users表中 age > 22的数据
select * from users where age > 22;

-- 查询 users 表中 name=某个条件值 的数据
select * from users where name = '王五';

-- 查询 users 表中 年龄在22到25之间的数据
select * from users where age >= 22 and age <= 25;
select * from users where age between 22 and 25;

-- 查询 users 表中 年龄不在22到25之间的数据
select * from users where age < 22 or age > 25;
select * from users where age not between 22 and 25;

-- 查询 users 表中 年龄在22到25之间的女生信息
select * from users where age >= 22 and age <= 25 and sex = '女';

3、and和or 使用时注意

假设要求 查询 users 表中 年龄为22或者25 的女生信息

select * from users where age=22 or age = 25 and sex = '女';

思考上面的语句能否返回符合条件的数据? 实际查询结果并不符合要求?

select * from users where age=22 or age = 25 and sex = '女';
-- 上面的查询结果并不符合 查询条件的要求。
-- 问题出在 sql 计算的顺序上,sql会优先处理and条件,所以上面的sql语句就变成了
-- 查询变成了为年龄22的不管性别,或者年龄为 25的女生
-- 如何改造sql符合我们的查询条件呢?
-- 使用小括号来关联相同的条件

select * from users where (age=22 or age = 25) and sex = '女';

4、like子句

我们可以在where条件中使用=,<,> 等符合进行条件的过滤,但是当想查询某个字段是否包含时如何过滤? 可以使用like语句进行某个字段的模糊搜索,

例如: 查询 name字段中包含五的数据

--like 语句 like某个确定的值 和。where name = '王五' 是一样
select * from users where name like '王五';

-- 查询name字段中包含五的
select * from users where name like '%五%';

-- 查询name字段中最后一个字符为五的
select * from users where name like '%五';

-- 查询name字段中第一个字符 为 王 的
select * from users where name like '王%';

-- 使用 _ 单个的下划线。表示一个任意字符,使用和%类似
-- 查询表中 name 字段为两个字符的数据
select * from users where name like '__';

-- 查询 name 字段最后为五,的两个字符的数据
select * from users where name like '_五';

注意:where子句中的like在使用%或者_进行模糊搜索时,效率不高,使用时注意:

  • 尽可能的不去使用%或者_
  • 如果需要使用,也尽可能不要把通配符放在开头处

5、MySQL 中的统计函数(聚合函数)

max(),min(),count(),sum(),avg()

# 计算 users 表中 最大年龄,最小年龄,年龄和及平均年龄
select max(age),min(age),sum(age),avg(age) from users;
-- 上面数据中的列都是在查询时使用的函数名,不方便阅读和后期的调用,可以通过别名方式 美化
select max(age) as max_age,
min(age) min_age,sum(age) as sum_age,
avg(age) as avg_age
from users;

-- 统计 users 表中的数据量
select count(*) from users;

-- 上面的两个统计,分别使用了 count(*) 和 count(id),结果目前都一样,有什么区别?
-- count(*) 是按照 users表中所有的列进行数据的统计,只要其中一列上有数据,就可以计算
-- count(id) 是按照指定的 id 字段进行统计,也可以使用别的字段进行统计,
-- 但是注意,如果指定的列上出现了NULL值,那么为NULL的这个数据不会被统计

-- 如果按照sex这一列进行统计,结果就是8个而不是9个,因为sex这一列中有NULL值存在
select count(sex) from users;

聚合函数除了以上简单的使用意外,通常情况下都是配合着分组进行数据的统计和计算

6、Group BY 分组

group by 语句根据一个或多个列对结果集进行分组

一般情况下,是用与数据的统计或计算,配合聚合函数使用

-- 统计 users 表中 男女生人数,
-- 很明显按照上面的需要,可以写出两个语句进行分别统计
select count(*) from users where sex = '女';
select count(*) from users where sex = '男';
-- 可以使用分组进行统计,更方便
select sex,count(*) from users group by sex;

-- 统计1班和2班的人数
select classid,count(*) from users group by classid;

-- 分别统计每个班级的男女生人数
select classid,sex,count(*) as num from users group by classid,sex;

# 注意,在使用。group by分组时,一般除了聚合函数,其它在select后面出现的字段列都需要出现在grouop by 后
面

Having 子句

having时在分组聚合计算后,对结果再一次进行过滤,类似于where,

where过滤的是行数据,having过滤的是分组数据

-- 要统计班级人数
select classid,count(*) from users group by classid;
-- 统计班级人数,并且要人数达到5人及以上
select classid,count(*) as num from users group by classid having num >=5;

7、Order BY排序

我们在mysql中使用select的语句查询的数据结果是根据数据在底层文件的结构来排序的,

首先不要依赖默认的排序,另外在需要排序时要使用orderby对返回的结果进行排序

Asc 升序,默认

desc降序

-- 按照年龄对结果进行排序,从大到小
select * from users order by age desc;
-- 从小到大排序 asc 默认就是。可以不写
select * from users order by age;
-- 也可以按照多个字段进行排序
select * from users order by age,id; # 先按照age进行排序,age相同情况下,按照id进行排序
select * from users order by age,id desc;

8、Limit 数据分页

  • limit n 提取n条数据
  • limit m,n 跳过m跳数据,提取n条数据
-- 查询users表中的数据,只要3条
select * from users limit 3;
-- 跳过前4条数据,再取3条数据
select * from users limit 4,3;
-- limit一般应用在数据分页上面
-- 例如每页显示10条数据,第三页的 limit应该怎么写? 思考
第一页 limit 0,10
第二页 limit 10,10
第三页 limit 20,10
第四页 limit 30,10
-- 提取 user表中 年龄最大的三个用户数据 怎么查询?
select * from users order by age desc limit 3;

总结

mysql中的查询语句比较灵活多样,所以需要多加练习

并且在使用查询语句时,一定要注意sql的正确性和顺序

子句

说明

是否必须

select

要返回的列或表达式,字段列表


from

查询的数据表

需要在表中查询时

Where

数据行的过滤


group by

分组

仅在分组聚合计算时

having

分组后的数据过滤


order by

输出排序


limit

要提取的结果行数


十、Mysql数据库导入导出和授权

数据导出

1、数据库数据导出

# 不要进入mysql,然后输入以下命令 导出某个库中的数据
mysqldump -u root -p tlxy > \Desktop\code\tlxy.sql

导出一个库中所有数据,会形成一个建表和添加语句组成的sql文件

之后可以用这个sql文件到别的库,或着本机中创建或回复这些数据

2、将数据库中的表导出

# 不要进入mysql,然后输入以下命令 导出某个库中指定的表的数据
mysqldump -u root -p tlxy tts > ~/Desktop/code/tlxy-tts.sql

数据导入

把导出的sql文件数据导入到mysql数据库中

# 在新的数据库中 导入备份的数据,导入导出的sql文件
mysql -u root -p ops < ./tlxy.sql
# 把导出的表sql 导入数据库
mysql -u root -p ops < ./tlxy-tts.sql

权限管理

mysql中的root用户是数据库中权限最高的用户,千万不要用在项目中。

可以给不同的用户,或者项目,创建不同的mysql用户,并适当的授权,完成数据库的相关操作
这样就一定程度上保证了数据库的安全。

创建用户的语法格式:

grant 授权的操作 on 授权的库.授权的表 to 账户@登录地址 identified by ‘密码’;

示例:

# 在mysql中 创建一个 zhangsan 用户,授权可以对tlxy这个库中的所有表 进行 添加和查询 的权限
grant select,insert on tlxy.* to zhangsan@'%' identified by '123456';
# 用户 lisi。密码 123456 可以对tlxy库中的所有表有 所有操作权限
grant all on tlxy.* to lisi@'%' identified by '123456';
# 删除用户
drop user 'lisi'@'%';