MySQL学习
Posted 菜鸟-肥龙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL学习相关的知识,希望对你有一定的参考价值。
1.1、MySQL 阐述
-
MySQL 是一种 DBMS,而且是一种一个小型的开源的关系型数据管理系统。
-
轻量级、小型的数据库
-
开源免费(6版本之前免费)
-
所属于Oracle公司
-
1.2 、MySQL 安装
1、MySQL 下载地址
2、Windows 下安装 MySQL
-
将下载文件安装到电脑中,打开安装程序。按照提示依次执行下一步,注意一下信息:
1)Choosing a setup type:选择安装类型,安装类型共有5种,我们选择“Developer Default”即可。
2)Type and Networking:选择运行方式,共有2种,我们选择标准类型“Standalone…”即可,第二种是沙盒运行。
3)Type and Networking:选择服务器配置,“Developer Machine”选项代表典型个人桌面工作站,在3种类型中,占用最少的内存,一般选择此选项。
4)Accounts and Roles:设置账户,在这里设置root密码,不要忘记了哦。
5)一路Next,即可安装成功。
3、Linux 下安装 MySQL
-
通过secureCRT工具连接Linux系统
-
上传 mysql 的安装包
alt + p -------> put d:/setup/mysql-5.7.27-1.el7.x86_64.rpm-bundle.tar
-
解压 mysql 的安装包
mkdir mysql
tar -xvf mysql-5.7.27-1.el7.x86_64.rpm-bundle.tar -C mysql/
-
安装客户端
cd mysql/
rpm -ivh mysql-community-client-5.7.27-1.el7.x86_64.rpm --force --nodeps
-
安装服务端
rpm -ivh mysql-community-server-5.7.27-1.el7.x86_64.rpm --force --nodeps
-
修改mysql默认字符集
vi /etc/my.cnf
添加如下内容:
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
-- 需要在最下方填写
[client]
default-character-set=utf8
-
启动mysql服务
service mysqld start
-
登录mysql
mysql -u root -p 敲回车,输入密码
初始密码查看:cat /var/log/mysqld.log
在root@localhost: 后面的就是初始密码
-
修改mysql登录密码
set global validate_password_policy=0;
set global validate_password_length=1;
set password=password(\'密码\');
-
授予远程连接权限
//授权
grant all privileges on *.* to \'root\' @\'%\' identified by \'密码\';
//刷新
flush privileges;
-
关闭Linux系统防火墙
systemctl stop firewalld.service
MySQL 学习链接 :https://www.shulanxt.com/database/mysql/mysql-ms
1.3、MySQL 登录
1、Windows 下启动 MySQL
-
下载安装包,解压到指定目录
-
配置环境变量
-
配置文件
-
初始化:
-
以管理员身份打开 CMD ,切换到 MySQL 的 bin 路线下 输入mysqld initialize insecure
-
-
mysql服务添加到windows服务中
-
开启mysql客户端
-
window下mysql修改root密码
2、管理工具连接
-
sqlyog工具登录mysql
二、DCL 数据控制语言
2.1、概述
-
DCL(Data Control Language):数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。
-
常用关键字:GRANT, REVOKE 等
2.2、操作语句
详细操作语句请参考以下地址:https://www.cnblogs.com/Rohn/p/11722515.html
三、DDL 数据定义语言
3.1、概述
-
DDL (Data Definition Languages):数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。
-
常用关键字:create(创建)、drop(删除)、alter(修改)、retrieve(查询)等。
3.2、操作语句
1、Retrieve:查询
库 :操作
-
查询所有数据库:SHOW DATABASES
-
查询某个数据库的创建:SHOW CREATE DATABASES 数据 库名称
-
查询 mysql 数据库的创建格式:SHOW CREATE DATABASES mysql
表 :操作
-
查询某库下所有的表:SHOW TABLES
-
查询表结构:DESC 表名
-
查询某表字符集:SHOW TABLE STATUS FEOM 库名 like ‘ 表名 ’
2、Create:创建
库 :操作
-
创建数据库(判断,如果不存在则创建):CREATE DATABASE 【 IF NOT EXISTS】 数据库名称
-
创建数据库,并指定字符集:CREATE DATEBASE 数据库名称 CHARACTER SET 字符集名称
表 :操作
-
创建表:
-
CREATE TABLE 表名(
列名1 数据类型1 约束,
列名2 数据类型2 约束,
列名3 数据类型3 约束
);
-- 注意:最后一列,不需要加逗号 -
复制表:CREATE TABLE 表名 LIKE 被复制的表名 (只复制数据结构,不会复制内容)
3、Alter:修改
库 : 操作
-
不能直接修改 库 名称
-
修改数据库的字符集:ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称
表 : 操作
-
修改字段名:ALTER TABLE 表名 CHANGE COLUMN 旧字段 新字段 数据类型
-
修改表名:ALTER TABLE 表名 RENAME 【TO】 新的表名
-
修改字段类型和列级约束:ALTER TABLE 表名 MODIFY COLUMN 字段名 约束
-
添加字段: ALTER TABLE 表名 ADD COLUMN 字段名 数据类型
-
删除字段:ALTER TABlE 表名 DROP COLUMN 字段名
4、Deop:删除
库 : 操作
-
删除数据库:DROP DATABASE 数据库名称
-
删除数据库(判断,如果存在则删除):DROP DATABASE IF EXISTS 数据库名称
表 : 操作
-
删除表:DROP TABLE 【IF EXISTS】表名
四、DML 数据操作语言
4.1、概述
-
DML(Data Manipulation Language):数据操纵语言,主要用于实现对数据库中的数据进行操作。
-
常用关键字:INSERT 、UPDATE、DELETE
4.2、INSERT 语句
1、新增方法一:给指定列添加数据
-
标准语法:INSERT INTO 表名(列名1,列名2,.......) VALUES(值1,值2,......);
2、新增方式二:默认给全部列添加数据
-
标准语法:INSERT INTO 表名 VALUES(值1,值2,......);
3、新增方式三:批量添加数据
-
标准语法:INSERT INTO 表名【(列名1,列名2,......)】 VALUES(值1,值2,.......),(值1,值2,.......),(值1,值2,.......);
4、注意事项
-
列名和值得数量以及数据类型要对应
-
除了数字类型,其他数据类型的数据都需要加单引号(单引导和双引号都可以,推荐单引号)
4.3、UPDATE 语句
1、修改单表数据
-
标准语法:UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,......WHERE 条件
2、修改多表数据
-
标准语法:UPDATE 表名1 别名1,表名2 别名2 SET 列名1 = 值1,列名2 = 值2 WHERT 连接条件 AND 筛选条件
3、注意事项
-
修改语句必须添加条件,如果不加条件,则所有数据都会被修改。
4.4、DELETE 语法
1、删除方式一:DELETE 语句
-
单表删除标准语法:DELETE FROM 表名 【WHERE 条件】
-
多表删除标准语法:DELETE 表名1 别名1,表名2 别名2 FROM 列名1 = 值1,列名2 = 值2 WHERT 连接条件 AND 筛选条件
2、删除方式二:TRUNCATE 语句
-
标准语法:TRUNCATE TABLE 表名
3、DELETE 和 TRUNCATE 两种删除方式的区别
-
truncate 不能添加 where 条件,而 delete 可以添加 where 条件
-
truncate 的效率高一点点
-
truncate 删除带自增长的列表后,如果在插入数据,数据从1开始。而 delete 删除带自增长列的表后,如果在插入数据,数据从上一次的断点开始。
-
truncate 删除不能回滚,delete 删除可以回滚。
4、注意事项
-
删除语句中必须包含条件,如果不加条件,则会将所有数据删除。
五、DQL 数据查询语言
5.1、概述
-
DQL(Data Query Lanuage):数据库查询语言,主要用于数据库中数据的查询。
-
基本结构:SELECT<字段名>FROM<表或视图名>WHERE<查询条件>
5.2、基础查询
1、语法
-
标准语法:SELECT <arg> 【REOM 表名】
2、查询全部字段
-
标准语法:SELECT *(所有列名) FROM 表名;
3、查询部分字段
-
标准语法:SELECT 列名1,列名2,...... FROM 表名;
4、查询‘去重’
-
标准语法:SELECT DISTINCT 列名1,列名2,...... FROM 表名;
-
注意:只有全部重复的才能去除。
-
5、起别名
-
标准语法:SELECT 列名1 【AS】 别名,列名2 【AS】 别名2 FROM 表名;
6、" + " 号作用:只作为运算符
-
SELECT 列名 + 10 ;
-
两个操作数都为数值型,则做加法运算
-
其中一方为字符型,视图将字符型转数值转换成数值型。如果转换成功继续做加法运算,转换失败字符型数值转换成“ 0 ”。并且只要其中一方为 null,则结果肯定为 null 。
-
7、CONCAT 关键字拼接两个列
-
标准语法:SELECT CONCAT(\'列名1\',\'列名2\',......) FROM 表名;
8、计算列的值(四则运算)
-
标准语法:SELECT 列名1 运算符(+、-、*、/) 数值 FROM 表名
-
注意:如果某一列为 null ,可以通过 IFNULL(表达式1--想替换的列,表达式2--想替换的值)函数进行替换。
9、注意
-
<arg>:可以是常量、表达式、字段、函数
-
通过 select 查询的结果,是一个虚拟的表格,并不是真实存在的。
5.3、条件查询
1、条件运算符查询
-
条件运算符:>、<、>=、<=、=、<>/!=
2、逻辑运算符查询
-
逻辑运算符:
-
AND 或 && :并且
-
OR 或 ||:或者
-
NOT 或 !:非
-
3、模糊查询
-
模糊查询运算符:
-
Between......and......:在某个范围之内(都包含)
-
IN(......):多选一
-
LIKE:占位符:模糊查询,_ 单个任意字符, % 多个任意字符
-
IS NULL:是 null
-
IS NOT NULL:不是 null
-
4、条件查询语法 & 示例
-- 标准语法
SELECT 列名 FROM 表名 WHERE 条件;
-- 查询库存大于20的商品信息
SELECT * FROM product WHERE stock > 20;
-- 查询品牌为华为的商品信息
SELECT * FROM product WHERE brand=\'华为\';
-- 查询金额在4000 ~ 6000之间的商品信息
SELECT * FROM product WHERE price >= 4000 AND price <= 6000;
SELECT * FROM product WHERE price BETWEEN 4000 AND 6000;
-- 查询库存为14、30、23的商品信息
SELECT * FROM product WHERE stock=14 OR stock=30 OR stock=23;
SELECT * FROM product WHERE stock IN(14,30,23);
-- 查询库存为null的商品信息
SELECT * FROM product WHERE stock IS NULL;
-- 查询库存不为null的商品信息
SELECT * FROM product WHERE stock IS NOT NULL;
-- 查询名称以小米为开头的商品信息
SELECT * FROM product WHERE NAME LIKE \'小米%\';
-- 查询名称第二个字是为的商品信息
SELECT * FROM product WHERE NAME LIKE \'_为%\';
-- 查询名称为四个字符的商品信息
SELECT * FROM product WHERE NAME LIKE \'____\';
-- 查询名称中包含电脑的商品信息
SELECT * FROM product WHERE NAME LIKE \'%电脑%\';
5.4、排序查询
1、排序查询语法 & 示例
-- 标准语法
SELECT 列名 FROM 表名 [WHERE 条件] ORDER BY 排序的字段|表达式|函数|别名 排序方式1,列名2 排序方式2;
-- 按照库存升序排序
SELECT * FROM product ORDER BY stock ASC;
-- 查询名称中包含手机的商品信息。按照金额降序排序
SELECT * FROM product WHERE NAME LIKE \'%手机%\' ORDER BY price DESC;
-- 按照金额升序排序,如果金额相同,按照库存降序排列
SELECT * FROM product ORDER BY price ASC,stock DESC;
2、注意事项
-
关键字:ORDER BY
-
ASC 升序(默认),DESC 降序
-
多个排序条件时,只有当前边的条件值一样时,才会判断第二条件
-
order by :一般在最后才会执行,limit除外!
5.5 、常见函数
5.5.1、函数概述
-
类似于 java 中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名。
-
好处:隐藏了实现细节,提高代码的重用性
-
调用:select 函数名(实参列表) 【from 表名】
5.5.2、单行函数
1、字符函数
-
concat():拼接
-
substr():截取子串
-
upper():转换成大写
-
lower():转换成小写
-
trim():去除前后指定的空格和字符
-
ltrim():去除左边空格
-
rtrim():去除右边空格
-
replace():替换
-
lpad():左填充
-
rpad():右填充
-
length():获取字节个数
-
instr():返回子串第一次出现的索引
2、数学函数
-
round():四舍五入
-
rand():随机数
-
floor():向下取整
-
ceil():向上取整
-
mod():取余
-
truncate():截断
3、日期函数
-
now():当前系统日期 + 时间
-
curdate():当前系统日期
-
curtime():当前系统时间
-
str_to_date():将字符转换成日期
-
date_format():将日期转换成字符
4、流程控制函数
-
if():处理双分支
-
case():处理多个分支
5、其他函数
-
version():获取版本信息
-
database():获取当前库信息
-
user():获取当前连接用户
5.5.3、分组 / 聚合函数
1、函数名
-
count(列名):统计数量(一般选用不为 null 的列)
-
max(列名):最大值
-
min(列名):最小值
-
sum(列名):求和
-
avg(列名):平均值
2、聚合函数语法
-- 标准语法
SELECT 函数名(列名) FROM 表名 【WHERE 条件】;
-- 计算product表中总记录条数
SELECT COUNT(*) FROM product;
-- 获取最高价格
SELECT MAX(price) FROM product;
-- 获取最高价格的商品名称
SELECT NAME,price FROM product WHERE price = (SELECT MAX(price) FROM product);
-- 获取最低库存
SELECT MIN(stock) FROM product;
-- 获取最低库存的商品名称
SELECT NAME,stock FROM product WHERE stock = (SELECT MIN(stock) FROM product);
-- 获取总库存数量
SELECT SUM(stock) FROM product;
-- 获取品牌为苹果的总库存数量
SELECT SUM(stock) FROM product WHERE brand=\'苹果\';
-- 获取品牌为小米的平均商品价格
SELECT AVG(price) FROM product WHERE brand=\'小米\';
3、注意事项
-
以上五个聚合函数都忽略 null 值,出了 count(*)
-
sum 和 avg 一般用于处理数值型,max、min、count 可以处理任何数据类型
-
都可以搭配 distinct 使用,用于统计去重后的结果
-
count()的参数可以为字段、、常量值(一般为 1 ),建议使用 count(*)
5.6、分组查询
1、分组查询语法
-- 标准语法
SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式];
-- 按照品牌分组,获取每组商品的总金额
SELECT brand,SUM(price) FROM product GROUP BY brand;
-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额
SELECT brand,SUM(price) FROM product WHERE price > 4000 GROUP BY brand;
-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的
SELECT brand,SUM(price) AS getSum FROM product WHERE price > 4000 GROUP BY brand HAVING getSum > 7000;
-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的、并按照总金额的降序排列
SELECT brand,SUM(price) AS getSum FROM product WHERE price > 4000 GROUP BY brand HAVING getSum > 7000 ORDER BY getSum DESC;
2、注意事项
-
可以按多个字段分组,字段之间用逗号隔开
-
having 后可以支持别名
-
可以支持排序
5.7、多表查询-笛卡尔积查询
1、笛卡尔积查询概述
-
如果有同时查询两张或两张以上的表,则会将获取这两 / 多 张表的所有组合情况。
-
要完成多表查询,需要消除这些无效数据的影响
2、笛卡尔积查询语法
-
标准语法:SELECT 列名 FROM 表名1,表名2......;
5.8、多表查询-内连接
1、查询原理
-
内连接查询的是两张表有交集那部分数据(有主外键关联的数据)
2、显示内连接
-
标准语法:SELEECT 列名 FROM 表名1 【INNER】 JOIN 表名2 ON 条件;
3、隐式内连接
-
标准语法:SELECT 列名 FROM 表名1,表名2 WHERE 条件;
5.9、多表查询-左外连接
1、查询原理
-
查询左表的全部数据,和左右两张表有交集部分的数据。
2、查询语法
-
标准语法:SELECT 列名 FROM 表名1 LEFT 【OUTER】 JOIN 表名2 ON 条件;
5.10、多表查询-右外连接
1、查询原理
-
查询右表的全部数据,和左右两张表有交集部分的数据
2、查询语法
-
标准语法:SELECT 列名 FROM 表名1 RIGHT 【OUTER】 JOIN 表名2 ON 条件;
5.11、多表查询-自连接
1、查询原理
-
同一张表中有数据关联,可以多次查询这同一个表
2、查询语法
-
SELECT
t1.name, -- 员工姓名
t1.mgr, -- 上级编号
t2.id, -- 员工编号
t2.name -- 员工姓名
FROM
employee t1 -- 员工表
LEFT OUTER JOIN
employee t2 -- 员工表
ON
t1.mgr = t2.id;
5.12、多表查询-全外连接
1、查询原理
-
查询左右两张表中的所有数据,包括相交和不相交的部分。
2、查询语法
-
标准语法:SELECT 列名 FROM 表名1 FULL OUTER JOIN 表名2 ON 条件;
-
注意:mysql 不支持全外连接查询,orcal 才会支持。
5.13、多表查询-子查询
1、子查询定义
-
子查询允许把一个查询嵌套在另一个查询当中。
-
子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询。
-
子查询可以包含普通 select 可以包含的任何子句,如:distinct 、group by、order by 、limit、join 和 union等;但是对应的外部查询必须是以下语句之一:select、insert、update、delete、set、do
-
子查询的位置:select 中、from 后、 where 后、having 后,放在 group by 和 order by 中无实际意义。
2、子查询分类
标量子查询
-
返回单一值得标量,最简单形式。可以作为条件,使用运算符进行判断!
-
基本演示
-- 标准语法
SELECT 列名 FROM 表名 WHERE 列名=(SELECT 聚合函数(列名) FROM 表名 [WHERE 条件]);
-- 查询年龄最高的用户姓名
SELECT MAX(age) FROM USER; -- 查询出最高年龄
SELECT NAME,age FROM USER WHERE age=26; -- 根据查询出来的最高年龄,查询姓名和年龄
SELECT NAME,age FROM USER WHERE age = (SELECT MAX(age) FROM USER);
列子查询
-
返回的结果集是 N 行一列,可以作为条件,使用运算符 in 或 not in 进行判断!
-
基本演示
-- 标准语法
SELECT 列名 FROM 表名 WHERE 列名 [NOT] IN (SELECT 列名 FROM 表名 [WHERE 条件]);
-- 查询张三和李四的订单信息
SELECT id FROM USER WHERE NAME=\'张三\' OR NAME=\'李四\'; -- 查询张三和李四用户的id
SELECT number,uid FROM orderlist WHERE uid=1 OR uid=2; -- 根据id查询订单
SELECT number,uid IOS开发-OC学习-常用功能代码片段整理
连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段