目录
一、MySQL简介
MySQL是一种关系型数据库管理系统,由于其体积小、速度快、总体拥有成本低,一般应用在中小型和大型网站。
特点:1.用c和c++编写有较高的可移植性。2.支持多线程,可充分利用cpu资源。3.为多种编程语言提供API。包括C、Java、PHP、Python等。4.Mysql优化了SQL算法,有效提高了查询速度。
二、MySQL安装
2.1 windows系统下安装MySQL
选择社区版zip格式的包
mysql下载地址:https://downloads.mysql.com/
步骤1:安装完解压后,在根目录添加配置文件my.ini
文件添加内容:
[mysqld]
#设置3306端口
port=3306
#创建新表时将使用默认存储引擎
default-storage-engine=INNODB
[mysql]
#设置mysql客户端默认字符集
default-character-set=utf8
[client]
#设置mysql客户端连接服务端默认使用的端口
port=3306
default-character-set=utf8
步骤2:配置环境变量
操作步骤: 环境变量 -> 新建 -> 变量名和mysql的根目录 -> 配置path的环境变量
步骤3:
1.初始化数据库
mysqld --initialize --user=mysql --console
2.安装mysql服务
mysqld --install (mysqld --remove卸载mysql)
3.启动MySQL服务
net start mysql (stop是停止服务)
4.登入mysql,这里需要使用到初始化数据库的初始密码
mysql -uroot -p
5.修改root用户密码
alter user 'root'@'localhost' identified with mysql_native_password by '123456';
2.1.1 windows系统下卸载MySQL
1.停止服务,打开DOS命令窗口
net stop mysql
2.删除根目录文件夹
进入到mysql安装位置,删除mysql的解压文件
3.删除C盘隐藏文件夹
显示隐藏文件后删除c盘下的“C:\ProgramData\MySQL” 的所有文件
4.在DOS命令窗口下输入 regedit,清空关于mysql的注册表
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\EventLog\Application\MySQLD Service
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\MySQL
5.删除环境配置
6.删除mysql服务名称,以管理员权限打开DOS命令窗口
sc delete mysql
2.2 Linux系统下安装MySQL
三、MySQL图形化管理工具
3.1 Navicat安装
Navicat Premium 是一套可创建多个连接的数据库开发工具,让你从单一应用程序中同时连接 MySQL、Redis、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 。
下载官网:Navicat | 产品
3.1.1. Navicat的使用
3.2 SQLyog安装
SQLyogsqlyog是一款专业的图形管理软件,SQLyog操作简单,功能强大,能够帮助用户轻松管理自己的MYSQL数据库,SQLyog中文版支持多种数据格式导出,可以快速帮助用户备份和恢复数据,还能够快速地运行SQL脚本文件,为用户的使用提供便捷。
下载地址:https://en.softonic.com/download/sqlyog/windows/post-download
3.2.1 sqlyog的使用
3.3 Datagrip
四、SQL语言
常见sql语句类型包括有一下几种类型
-DDL数据定义语言:用来定义数据库对象(数据库,表,字段,表结构)
-DML数据操作语言:用来对数据库表中的数据进行增删改
-DQL数据查询语言:用来查询数据库表中的记录
-DCL数据控制语言: 用来创建数据库用户,控制数据访问权限
4.1 DDL-库操作
-- 查询所有数据库
show databases ;
-- 查询当前数据库
select database() ;
-- 创建库
create database [if not exists] 数据库名 [default charset]
-- 删除数据库
drop database 库名
-- 使用库
use 库名
4.2 DDL-表操作
-- 查询所有表
show tables;
-- 查询表结构
desc 表名
-- 表结构创建
create table 库名.表名(字段名1 字段类型(宽度) 约束条件....[comment '注解'])
mysql> create table tb_users(
-> id int(10) comment '编号',
-> name varchar(50) comment '姓名',
-> age int unsigned comment '年龄',
-> gender varchar(1) comment '性别'
-> );
Query OK, 0 rows affected, 1 warning (0.02 sec)
-- 查询详细表结构
show table tb_user ;
--修改表
-添加字段add
alter table 表名 执行动作(add,modify,change,drop,rename) 字段 字段类型(长度)
在表tb_users中id字段后面添加nickname字段
alter table tb_users add nickname int(20) comment '呢称' after id ;
-add 字段名 类型 约束条件 //添加新字段
可加after 字段名; //添加到xx之后
或者first 字段名; //添加到第一列
-修改字段(modify/change)
将表tb_users中nickname字段修改为username ,类型varchar(30)
修改数据类型用 modify
修改字段名和字段类型用change
alter table tb_users change nickname username varchar(30) comment '用户呢称';
-删除字段drop
alter table 表名 drop 字段名
alter table tb_users drop username;
-修改表名rename
alter table 表名 rename 新表名
-删除表
drop table [if exists] 表名;
-删除表数据,删除后会重新创建该表
truncate table 表名字
4.2.1 数据类型
整数型int:
默认使用有符号类型,加unsigned使用无符号类型
浮点型float:
定义格式:float(总宽度,小数位数),当字段值与类型不匹配时,字段值作为0处理。数值不在范围,仅保存最大/最小值
4.2.2 字符串类型
字符类型定长char:最大长度255字符不够指定字符数时在右边用空格补齐,字符数段超出时,无法写入数据
变长:varchar(字符数)按数据实际大小分配存储空间,字符数段超出时,无法写入数据
大文本类型:text/blob,字符数大于65535存储时使用
4.3 DML-数据操作
4.3.1 添加数据(insert)
-给指定字段添加记录
语法1: insert into 表名(字段名列表) values(字段值列表);
insert into tb_users(id, name, age, gender) values(1, "zhangsan", 20, "男");
-给所有字段添加记录
语法2: insert into 表名 values(字段值列表);
insert into tb_users values(2, "lisi", 30, "女");
-批量添加记录
语法3: insert into 表名(字段名列表) values(字段值列表),(),(),...;
insert into tb_users values(3, "wangwu", 20, "男"),(3, "zhaoliu", 38, "女");
注意事项:
-字段值要与字段类型相匹配
-对于字符类型的字段或者日期类型,要用双或单引号括起来
-只给一部分字段赋值时,必须明确写出对应的字段名称
4.3.2 修改数据(update)
-- 更新表内字段所有记录
语法1:update 表名 set 字段1=字段1值,.....;
update tb_users set gender = '男';
-- 更新表内指定记录
语法2:update 表名 set 字段1=字段1值,.... where 条件表达式;
update tb_users set name = 'xixi',gender = '女' where id = 3;
注意事项:
-字段值要与字段类型相匹配
-对于字符类型的字段,要用双或单引号括起来
-若不使用where限定条件,会更新所有记录
-限定条件时,只更新匹配条件的记录
4.删除记录
格式1,仅删除符合条件的记录
delete from 表名 where 条件表达式;
格式2,删除所有记录
delete from 表名;
4.3.3 删除数据(delete)
--仅删除符合条件的记录
语法1: delete from 表名 where 条件表达式;
delete from tb_users where id = 3;
--删除所有记录
语法2:delete from 表名;
delete from tb_users ;
4.4 DQL-数据查询
4.4.1 基本查询
--查询多个字段
语法1:select 字段1,字段2,字段3... from 表名
语法2: select * from 表名
语法3: 去重查询 select distinct 字段列表 from 表明
4.4.2 条件查询
语法1:select 字段列表 from 表名 where 条件列表
比较运算符 | 功能 | 逻辑运算符 | 功能 |
> >= < <= <> 或者 != | 大于 大于等于 小于 小于等于 不等于 | and 或者 && | 并且 |
between .... and | 在那些范围内 | or 或者 || | 或者 |
in (...) | 在()里面的值 | not 或者 ! | 非,不是 |
like 占位符 | 模糊匹配 _ 匹配单个字符 % 匹配任意字符 | ||
is null | 时null |
4.4.3 聚合查询
语法: select 聚合函数(字段列表) from 表名
null值聚合函数不参与计算
函数名 | 功能 |
count() | 统计字段值个数 |
max() | 统计字段最大值 |
min() | 统计字段最小值 |
avg() | 统计字段平均值 |
sun() | 统计字段之和 |
4.4.4 分组查询
语法: select 字段列表 from 表名 [where 条件] group by 分组字段名 [ having 分组后的过滤条件]
4.4.5 排序查询
语法:select 字段列表 from 表名 order by 字段1 排序方式, 字段2 排序方式
排序方式 asc 升序(默认) desc 降序
多字段的排序 是先对字段1排序,如果字段1相同再按照字段2排序
4.4.6 分页查询
语法:select 字段列表 from 表名 limit 起始索引,查询记录数
-SQL查询 limit N; //显示查询结果前N条记录
-SQL查询 limit N,M; //显示指定范围内的查询记录,从N开始显示M行
-SQL查询 where 条件查询 limit 3; //显示查询结果前3条记录
-SQL查询 where 条件查询 limit 3,3; //从第四条开始,共显示3条
sql语句执行顺序 from > where > group by > select > order by > limit
4.5 DCL-数据控制语言
4.5.1 用户管理
---查询用户
use mysql
select * from users;
---创建用户
语法: create user '用户名'@'localhost' identified by '密码'
指定任意用户都可以登入数据库
create user 'cceng'@'%' identified by '密码' ;
---修改用户密码
alter user 'user'@localhost identified by '新密码' ;
--删除用户
drop user 'user'@'localhost' ;
4.5.2 权限控制
--查询权限
show grants for '用户名'@'主机名'
--授予权限
语法格式:grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'
grant all on *.* to 'cceng'@'%' ;
--撤销权限
语法格式:revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'
4.6 约束
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确、有效性和完整性。
4.6.1 非空约束
关键字:not null 解释:限制该字段数据不能是null
4.6.2 唯一约束
关键字:unique 解释:保证该字段说有数据不重复都是唯一的
4.6.3 默认约束
关键字:default 解释:未指定该字段值时,赋予默认值
4.6.4 检查约束
关键字:check 解释:保证该字段满足某个要求,(8.016版本后的特性)
4.6.5 主键约束
一个表中只能有一个primary key字段,对应的字段值不允许重复,且不能赋NULL值
主建字段KEY标志PRI,通常与auto_increment连用(此时可以赋null,会自增)
经常把表中的唯一标识记录的字段设置为主键字段[记录编号字段]
---建表的时候指定主建,通常与auto_increment连用
create table test1 ( id int primary key auto_increment, name varchar(5) not null );
---删除表中primary key(若有自增属性,必须先去掉)
alter table test1 modify id int ; --去auto_increment
alter table test1 drop primary key;
---在已有的表中设置primary key
alter table test2 add primary key(id);
4.6.6 外键约束
关键字:foreign key
作用用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性
使用外键的条件
-表存储引擎必须是innodb(mysql8.0默认引擎)
-字段类型要一致
-被参照字段必须是索引类型的一种(一般是primary key)
基本用法
foreign key(表A的字段名) references 表B(字段名)
on update cascade on delete cascade
实例:
create table t1(
id int primary key auto_increment,
name char(5)
)engine=innodb;
create table t2(
id int,
pay float(7,2),
foreign key(id) references t1(id) on update cascade on delete cascade
)engine=innodb;
----删除外键,第一步先查出外键名,在删除外键
show create table t2; //查看外键名
CREATE TABLE `t2` (
`id` int DEFAULT NULL,
`pay` float(7,2) DEFAULT NULL,
KEY `id` (`id`),
CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
alter table t2 drop foreign key 外键名
alter table t2 drop foreign key t2_ibfk_1
----在已有表中添加外键
alter table t2 add foreign key(id) references t1(id) on update cascade on delete cascade;
----外键的删除更新行为
默认行为NO ACTION / RESTRICT
CASCADE
五、函数
5.1 字符串函数
--字符串拼接 concat('str1','str2')
--转小写 lower(str)
--转大写 upper(str)
--左填充lpad(str,n,pad)
--右填充rpad(str,n,pad)
str:被操作的字符串 n:字符串长度 pad填充的内容
--去头尾空格 trim('')
--截取子字符串substring(str,start,len)
5.2 数值函数
函数 | 功能 |
ceil(x) | 向上取整 |
floor(x) | 向下取整 |
mod(x,y) | 返回x/y的模 |
rand() | 返回0~1内的随机数 |
round(x,y) | 求参数x的四舍五入的值,保留y位小数 |
案例:生成一个六位数的随机验证码
SELECT LPAD(ROUND(RAND()*1000000,0),6,0);
5.3 日期函数
函数 | 功能 |
curdate() | 返回当前日期yyyy-MM-dd |
curtime() | 返回当前时间 hh:mm:ss |
now() | 返回当前日期和时间 |
year(date) | 获取指定date的年份 |
month(date) | 获取指定date的月份 |
day(date) | 获取指定date的日期 |
date_add(date, interval expr type) | 返回一个日期/时间值加上一个时间间隔expr后的 时间值 |
datediff(date1,date2) | 返回起始时间date1 和 结束时间date2之间的天 数 |
5.4 流程函数
函数 | 功能 |
IF(value , t , f) | 如果value为true,则返回t,否则返回 f |
IFNULL(value1 , value2) | 如果value1不为空,返回value1,否则 返回value2 |
CASE WHEN [ val1 ] THEN [res1] ... ELSE [ default ] END | 如果val1为true,返回res1,... 否 则返回default默认值 |
CASE [ expr ] WHEN [ val1 ] THEN [res1] ... ELSE [ default ] END | 如果expr的值等于val1,返回 res1,... 否则返回default默认值 |