
在 Ubuntu 20.04安装 MySQL



sudo apt update
sudo apt install mysql-server



安装完成后,MySQL 服务将会自动启动。
想要验证 MySQL 服务器正在运行,输入:


sudo systemctl status mysql



输出应该显示服务已经被启用,并且正在运行。

本地登录数据库

在MySQL 8.0上,root 用户默认通过auth_socket插件授权,auth_socket插件通过 Unix socket 文件来验证所有连接到localhost的用户。
这意味着你不需要提供密码即可以root登录到数据库。
命令为:


sudo mysql



设置root用户密码:
在 mysql 8.0 中新增了三个变量,用于对密码的管理
password_history 修改密码不允许与最近几次使用或的密码重复,默认是0,即不限制
password_reuse_interval 修改密码不允许与最近多少天的使用过的密码重复,默认是0,即不限制
password_require_current 修改密码是否需要提供当前的登录密码,默认是OFF,即不需要;如果需要,则设置成ON
设置密码的命令:


ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';



注意新修改的密码要符合安全规范,否则密码不会更改。

使用Navicate远程连接数据库

由于在阿里云服务器中运行数据库,因此使用ssh先连接云服务器,再连接数据库。
其实重要的是要理解,ssh通道的目的是连接到服务器的,而常规则是要连接到服务器端数据库
1.ssh通道的目的是连接到服务器的。需要服务器的账号密码!服务器的账号密码!
2.常规则是要连接到数据库。需要数据库的账号密码,数据库的账号密码

SQL语句概述

SQL语句分为DDL 语句,DML 语句,DQL 语句,DCL 语句
DDL 数据定义语言
操作数据库以及表的 create, drop, alter,定义数据库对象:数据库,表,列。关键字:create, drop, alter
DML 语句 数据操作语言
用来对数据库中表的数据进行增删改查。关键字:insert, delete, update
DQL 语句 数据查询语言
用来查询数据库中表的记录(数据)。关键字:select, where
DCL 语句 数据控制语言
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE
通用语法
SQL语句可以单行或多行,以分号结尾,可以使用空格和缩进来增强语句的可读性,SQL语句不区分大小写,关键字建议使用大写

DDL 语句

创建数据库
-- 直接创建数据库


CREATE DATABASE 数据库名;



-- 判断是否存在并创建数据库


CREATE DATABASE IF NOT EXISTS 数据库名;



-- 创建数据库并指定字符集(编码类型)


CREATE DATABASE 数据库名 CHARACTER SET 字符集;



-- 查看某个数据库定义信息


SHOW CREATE DATABASE 数据库名;



修改数据库
-- 修改数据库字符集格式


ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;



删除数据库
-- 删除数据库


DROP DATABASE 数据库名;



使用数据库
-- 查看正在使用的数据库


SELECT DATABASE();



-- 切换数据库


USE 数据库名;



创建表


CREATE TABLE 表名 (字段名1,字段类型1,字段名2,字段类型2......);



-- 建议写成如下格式


CREATE TABLE 表名 (
字段名1,字段类型1,
字段名2,字段类型2,
......
);



mysql 数据库常用数据类型
int 整型
double 浮点型
varchar 字符串型
data 日期类型:yyyy-mm-dd

详细的数据类型
整数
tinylnt 很小的整数
smallint 小的整数
mediumint中等大小的整数
int(integer) 普通大小的整数
小数类型 float 单精度浮点数
double 双精度浮点数
decimal (m,d) 压缩严格的定点数
日期类型
year YYYY 1901-2155
time HH:MM:SS
data YYYY-MM-DD
datatime YYYY-MM-DD HH:MM:SS
timestamp
文本,二进制类型
CHAR(M) M 为 0~255 之间的整数
VARCHAR(M) M 为 0~65535 之间的整数
TINYBLOB 允许长度 0~255 字节
BLOB 允许长度 0~65535 字节
MEDIUMBLOB 允许长度 0~167772150 字节
LONGBLOB 允许长度 0~4294967295 字节
TINYTEXT 允许长度 0~255 字节
TEXT 允许长度 0~65535 字节
MEDIUMTEXT 允许长度 0~167772150 字节
LONGTEXT 允许长度 0~4294967295 字节
VARBINAPY(M) 允许长度 0~M 个字节的变长字节字符串
BINARY(M) 允许长度 0~M 个字节的变长字节字符串

查看表
-- 查看某个数据库中的所有表


SHOW TABLES;



-- 查看表结构


DESC 表名;



-- 查看创建表的sql语句


SHOW CREATE TABLE 表名;



快速创建一个表结构相同的表


CREATE TABLE 新表名 LIKE 旧表名;



删除表
-- 直接删除表


DROP TABLE 表名;



-- 判断表是否存在并删除表


DROP TABLE IF EXISTS 表名;



修改表结构
-- 添加表列


ALTER TABLE 表名 ADD 列名 类型;



-- 修改列类型


ALTER TABLE 表名 MODIFY 列名 新的类型;



-- 修改列名


ALTER TABLE 表名 CHANGE 旧列名 行列名 类型;



-- 删除列


ALTER TABLE 表名 DROP 列名;



-- 修改表名


RENAME TABLE 表名 TO 新表名;



-- 修改字符集


ALTER TABLE 表名 character set 字符集;




DML 语句

插入记录
关键字说明
INSERT INTO 表名 - 表示往那张表添加数据
(字段名1, 字段名2, ...); -- 要给哪些字段设置值
VALUES (值1, 值2, ...); -- 设置的具体的值
值与字段必须对应,个数相同,类型相同
数据值大小必须在字段的长度范围之内
除了数组类型外,其他字段类型的值必须使用引号引起。(建议使用单引号)
如果要插入空值,可以不写字段,或者插入 null
插入全部字段
-- 所有的字段名都写出来


INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);



-- 不写字段名


INSERT INTO 表名 VALUES (值1, 值2, ...);



插入部分数据
-- 没有添加数据的字段会使用null


INSERT INTO 表名 (字段名1, 字段名3, ...) VALUES (值1, 值3, ...);



复制表
在已有的数据基础上,将原来的数据进行复制,插入到对应的表中
-- 语法格式


INSERT INTO 表名1 SELECT * FROM 表名2;



(*可替换为某些选定的属性,实现只复制一部分数据)
更新表记录
-- 不带条件修改数据 全部修改


UPDATE 表名 SET 字段名=值;



-- 带条件修改数据 指定范围修改


UPDATE 表名 SET 字段名=值 WHERE 字段名=值;



-- 关键字
UPDATE: 修改数据
SET: 修改哪些字段
WHERE: 指定条件
删除表记录
-- 不带条件删除数据


DELETE FROM 表名;



-- 带条件删除数据


DELETE FROM 表名 WHERE 字段名=值;



truncate 删除表记录
delete 是将表中的数据一条一条删除,truncate 是将整个表摧毁,重新创建一个新的表,新的表结构和原来的表结构一模一样


TRUNCATE TABLE 表名;




DQL 语句

简单查询
查询表所有数据,*表示所有列


SELECT * FROM 表名;



查询指定列


SELECT 字段名1,字段名2,字段名3,... FROM 表名;



别名查询
-- 查询时给列、表指定别名需要使用as关键字
-- 使用别名的好处是方便观看和处理查询到的数据


SELECT 字段名1 AS 别名, 字段名2 AS 别名,... FROM 表名;



(AS可以省略)
清除重复值
-- 查询指定列 并且结果不出现重复数据


SELECT DISTINCT 字段名 FROM 表名;



查询结果参与运算
参与运算的必须是数值类型,查询显示新列,不会改动原数据
-- 某列数据和固定值运算


SELECT 列名1 + 固定值 FROM 表名;



-- 某列数据和其他列数据参与运算


SELECT 列名1 + 列名2 FROM 表名;



条件查询
-- 语法格式


SELECT 字段名 FROM 表名 WHERE 条件;



比较运算符
-- > 大于 < 小于 <= 小于等于 >= 大于等于 <> != 不等于


SELECT 字段名 FROM 表名 where 条件(字段 运算符 筛选条件);



逻辑运算符
-- and 多个条件同时满足
-- or 多个条件其中一个满足
-- not 不满足
in 关键字
in里面的每个数据都会作为一次条件
范围
-- BETWEEN 值1 AND 值2 表示从值1到值2的范围,包头包尾
like 模糊查询
-- LIKE 表示模糊查询


SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';



-- MySQL 通配符有两个
%: 表示0个或多个字符
_: 表示一个字符
排序
-- ORDER BY 子句 可以将查询的结果进行排序 (排序只是显示方式, 不会改变数据库中数据的顺序)


SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];



-- ASC 升序,默认的 DESC 降序
-- 单列排序 使用一个字段进行排序
-- 组合排序 先使用第一个字段进行排序 如果第一个字段相同,才使用第二个字段进行排序。以此类推


SELECT 字段名 FROM FROM 表名 WHERE字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];



聚合函数
查询是横向查询,根据条件一行一行进行判断,而聚合函数是纵向查询,对一列的值进行计算,返回结果值。聚合函数会忽略空值
count: 统计指定列的记录数(行数),值为NULL的不统计
sum: 计算指定列的数值和,如果不是数值,计算结果为0
max: 计算指定列的最大值
min: 计算指定列的最小值
avg: 计算指定列的平均值,如果不是数值,计算结果为0
-- 聚合函数写在SQL语句SELECT后字段名的地方


SELECT 字段名... FROM 表名;
SELECT COUNT(age) FROM 表名;



分组查询
-- 分组查询是使用 GROUP BY语句对查询信息进行分组 [HAVING 条件] 分组后的筛选


SELECT 字段1,字段2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];



SELECT * FROM hero FROUP BY sex;
-- 这句SQL语句会将sex相同的数据作为一组,但是会返回每组的第一条,没有任何意义
-- 分组的目的就是为了统计,一般分组会和聚合函数一起使用
-- 分组后聚合函数不操作所有数据,而是操作一组数据
limit语句 分页
limit语句是限制的意思,限制查询记录的条数。limit语句要放在最后面
-- LIMIT语法格式


LIMIT offset,length; LIMIT length;



-- offset是指偏移量,调过的记录数量,默认为0 length是指需要显示的总记录数
-- 查询表,从第三条开始显示,显示6条
SELECT * FROM 表 LIMIT 2,6;

查询应用举例

-- 查询年龄小于30的,按性别进行分组,统计每组的人数
-- 1.先过滤年龄小于30的 2.分组 3.最后统计人数


SELECT sex,COUNT(*) FROM hero WHERE age<30 GROUP BY sex;



-- 查询年龄大于25的 按性别分组,统计每组人数, 并只显示性别人数大于2的数据
-- 错误


SELECT sex,conut(*) ROM hero WHERE age<30 GROUP BY sex WHERE COUNT(*)>2;



-- 正确


SELECT sex,conut(*) FROM hero WHERE age<30 GROUP BY sex HAVING COUNT(*)>2;







