MySQL学习笔记

154 阅读11分钟

MySQL的启动

  • 系统服务找到MySQL80 右键启动

  • cmd黑窗口输入

    • net start mysql80 (mysql80为默认值) ==>启动

    • net stop mysql80 ==> 停止

      MySQL连接客户端

  • MySQL命令行输入密码后启动

  • 系统环境变量配置MySQL路径之后,cmd黑窗口输入

    • mysql [-h 120.0.0.1] [-p 3306] -u root -p

      • 此格式为 mysql [-h ip地址] [-p 端口号] -u 用户名 -p 密码

MySQL 数据库

关系型数据库(RDBMS) // 了解

概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库

特点

  • 使用表存储数据,格式统一,便于维护
  • 使用 sql 语言操作,标准统一,使用方便

SQL通用语法

  • SQL 语句可以单行或多行书写,以分号结尾

  • SQL 语句可以使用 空格 / 缩进 来增强语句的可读性

  • MySQL 数据库的 SQL语句不区分大小写,关键字建议使用大写

  • 注释:

    • 单行注释: -- 注释内容 或者 # 注释内容(MySQL特有#注释)

    • 多行注释: /*注释内容*/

SQL分类

  • DDL : Data Definition Language : 数据定义语音,用来定义数据库对象(数据库,表,字段)
  • DML : Data Manipulation Language : 数据操作语言,用来对数据库表中的数据进行增删改
  • DQL : Data Query Language : 数据查询语言,用来查询数据库中表的记录
  • DCL : Data Control Language : 数据控制语言,用来创建数据库用户,控制数据库的访问权限

DDL-数据库操作

  • 查询

    • 查询所有数据库

      SHOW DATABASES;

    • 查询当前数据库

      SELECT DATABASE();

  • 创建

    CREATE DATABASE [IF NOT EXISTS] 数据库名[DEFAULT CHARSET 字符集] [COLLATE 排序规则];

    • [IF NOT EXISTS] 表示 如果这个数据不存在则创建新的数据库, 如果这个数据库存在则不进行任何操作 (可省略)
    • [DEFAULT CHARSET 字符集] 指定当前数据库的字符集 ,如 utf8mb4 ... (可省略)
    • [COLLATE 排序规则] 指定对应排序规则 (可省略)
  • 删除

    DROP DATABASE [IF EXISTS] 数据库名;

  • 使用

    USE 数据库名;

DDL-表操作-查询

  • 查询当前数据库所有表

    SHOW TABLES;

  • 查询表结构

    DESC 表名;

  • 查询指定表的建表语句

    SHOW CREATE TABLE 表名;

DDL-表操作-创建-CREATE TABLE

CREATE TABLE 表名(
  字段1 字段1的类型[COMMENT 字段1的注释],
  字段2 字段2的类型[COMMENT 字段2的注释],
  ......
  字段3 字段3的类型[COMMENT 字段3的注释]
)[COMMENT 表注释];

DDL-表操作-插入-INSERT INTO

insert into 表名 values(值1,值2,值3);
> 直接在values中增加值
insert into 表名(列名1,列名2,列名3) values(值1,值2,值3);
> 先在表名后列出所有的表名,然后在values中列出所有的值,这种写法最为工整
insert into 表名(列名1,列名2) values(值1,值2);
> 在表名后只列出部分列名,在values中只列出部分值,而未列出的列,其值为空

DDL-表操作-查询-SELECT

SELECT * from 表名;
> 查询整张表
SELECT 字段名,字段名,字段名,字段名 from 表名;
> 查询所有的字段
SELECT 需要的字段名,需要的字段名 from 表名;
> 查询部分字段
SELECT 整数或者浮点数字段名 * 需要的倍数 from 表名;
> 对字段进行计算
SELECT 整数或者浮点数字段名 * 需要的倍数 as 计算过后的值的名称 from 表名; 
> 对字段进行计算后还可以为计算出的新值赋予列名,建议此处名称使用双引号包裹---去除名称包含空格或者名称包含保留字的影响

DDL-表操作-去重-DISTINCT

SELECT DISTINCT 字段名 from 表名;
> 查询时在字段名前增加distinct关键词,可做到查询去重

DDL-表操作-条件过滤-WHERE

SELECT 字段名,字段名 from 表名 WHERE 需要过滤的字段名 > 过滤条件;
> 使用where关键词对查询做出条件限制,字段名和过滤条件之间的比较符可以为>,<,>=,<=,=,!=,<>等等
SELECT 字段名,字段名 from 表名 WHERE 需要过滤的字段名 > 过滤条件 AND 需要过滤的字段名 > 过滤条件;
> 当有多个条件查询时可以使用AND,OR和()来组合条件
SELECT 字段名 from 表名 WHERE NOT 字段名 = 查询条件 and NOT 字段名 = 查询条件;
> 使用NOTwhere查询关键字时表明查询非当前条件的值

DDL-表操作-条件过滤-IN

SELECT 字段名 from 表名 WHERE 字段名 = 查询条件 or 字段名 = 查询条件 or 字段名 = 查询条件 from 表名;
> 等价于
SELECT 字段名 from 表名 WHERE 字段名 IN (查询条件,查询条件,查询条件)

DDL-表操作-指定范围-BETWEEN

SELECT 字段名 from 表名 WHERE 字段名 BETWEEN 查询条件 AND 查询条件;
> 定义查询条件在某两个值之间
SELECT 字段名 from 表名 WHERE 字段名 NOT BETWEEN 查询条件 AND 查询条件;
> 定义查询条件不在某两个值之间

DDL-表操作-搜索匹配的字符串-LIKE

SELECT 字段名 from 表名 WHERE 字段名 LIKE 查询条件;
> LIKE'%' '_' 配合使用
> 百分号(%) 匹配零个、一个或多个字符
> 下划线(_) 匹配单个字符
> 'A%' 匹配以 A 开头的字符串
> '%A%' 匹配包含 A 的字符串
> '___A' 匹配第四个字母为 A 的字符串 --- 百分号前放置了三个下划线

DDL-表操作-字段排序-ORDER BY

SELECT 字段名 from 表名 order by 字段名;
> 字段正序
SELECT 字段名 from 表名 order by 字段名 desc;
> 字段倒序
SELECT 字段名,字段名 from 表名 order by 字段名 desc ,字段名 asc;
> desc 后缀表示字段倒序,asc后缀表示字段正序

DDL-表操作-更新操作-UPDATE

UPDATE 表名 SET 字段名 = 更新的值 WHERE 字段名=查询条件;
> UPDATE 表示更新操作 set 表示存储操作 WHERE 表示查询操作
UPDATE 表名 SET 字段名 = 字段名 + 要更新的值 WHERE 字段名=查询条件
> UPDATESET 操作还可以进行运算,例如:+ - * /
UPDATE 表名 SET 字段名=更新的值,字段名=更新的值 WHERE 字段名=查询条件
> 当需要多个字段更新时,用逗号隔开
UPDATE 表名 SET 字段名=更新的值 WHERE 字段名=(SELECT 字段名 FROM 表名2 WHERE 字段名=查询条件);
> 使用括号 () 与 UPDATE 组合可以使用 UPDATE 子查询,将需要多次查询的步骤整合到一次查询中并完成更新

DDL-表操作-删除操作-DELETE

DELETE FROM 表名 WHERE 字段名=查询条件;
> 删除符合条件的一条信息
DELETE FROM 表名;
> 删除表中的所有记录并保留表结构,这条语句执行的时常会跟表中的记录条数有关

DDL-表操作-删除操作-TRUNCATE

TRUNCATE TABLE 表名;
> 删除表中所有记录并保留表结构,这条语句的执行时常不会被表的记录条数影响

表的主键(Primary Key)

  • 表的主键由表中的一个字段或多个字段组成,主键代表表中唯一的一条记录

内连接(inner join)

> 查询A,B两表交集部分数据
> 应用场景:表一:字段一,字段二,字段三
          表二:字段三,字段四,字段五
> > 此时表一和表二中有字段三是相同的字段,现在希望查询出结果为:表一中的字段一,表二中的字段四
sql语句为:
* SELECT 字段一,字段四 FROM 表一,表二 WHERE 表一字段三=表二字段三;
等价于
* SELECT 字段一,字段四 FROM 表一 INNER JOIN 表二 ON 表一字段三=表二字段三;
> 连接有多种方式,内连接是默认的连接方式,所以 INNER 可以被省略


自连接(SELF JOIN)

> 自连接是对同一个表的不同别名进行连接
> 应用场景:查询在同一个部门共事的两个员工
设定:部门表 depTable 员工名称 staffName 员工部门号 depNo 个人工号 empNo
sql语句:
SELECT D1.staffName,D1.depNO from depTable D1 JOIN deptable D2 on D1.depNo = D2.depNo and D1.empNo <> D2.empNo;
将表depTable的两个别名 D1 D2 进行内连接(INNER JOIN),然后查询部门号相同(D1.depNo = D2.depNo )但个人工号不同的(D1.empNo <> D2.empNo)员工名称和员工部门号(D1.staffName,D1.depNO);
> 应用场景2:查询在同一个部门共事的三个员工 --- 对depTable 使用三个别名进行连接
设定:部门表 depTable 员工名称 staffName 员工部门号 depNo 个人工号 empNo
sql语句:
SELECT DISTINCT D1.staffName,D1.depNO from depTable D1 JOIN deptable D2 on D1.depNo = D2.depNo and D1.empNo <> D2.empNo;
加个去重(DISTINCT)就好了

外连接(OUTER JOIN)

> 外连接分为左外连接和右外连接
> > 左外连接:查询左表所有数据,以及两张表交集部分的数据
SELECT 字段列表 FROM1 LEFT[OUTER] JOIN2 ON 条件
> > 右外连接:查询右表所有数据,以及两张表交集部分的数据
SELECT 字段列表 FROM1 RIGHT[OUTER] JOIN2 ON 条件
应用场景:查询两个表中不满足内连接筛选条件时
设定:部门表 depTable 部门号 depNo 部门名称 depName  
	 员工表 empTable 员工名称 staffName 员工部门号depNo 个人工号 empNo
	 部门表中部分部门没有员工,员工表中部分员工所属部门不在部门表中
	 查出 员工名称 员工部门在部门表中的部门名称 员工的部门号 部门表中的部门号
左查询: SELECT E.staffName,D.depName,E.depNo,D.depNo FROM empTable E left join depTable D on E.depNo = D.depNo;
右查询: SELECT E.staffName,D.depName,E.depNo,D.depNo FROM empTable E right join depTable D on E.depNo = D.depNo;

UNION 和 INTERCEPT 集合操作

intercept: 取两条查询语句结果的 **交集**
union:取两条查询语句结果的 **并集** 并去除两个合集中的重复值

常见分组函数

-- 函数 ---- 作用 --
MAX()最大值
MIN()最小值
AVG()平均值
SUM()汇总值
COUNT()计数值
使用: select 分组函数(字段名) from 表名
select max(money) as '最多',min(money) as '最少',avg(money) as '平均的',sum(money) as '总的',count(*) as '数据总数' from moneyTable;

Group By 子句

  • 按字段的值对结果集进行分组

应用场景:表A中数据字段为 depNo(部门号) | money(奖金)

现需要查询出按depNo分组的排序奖金序列

select depNo '部门号',MAX(money) as '最高奖金',MIN(money) as '最低奖金',AVG(money) as '平均奖金' from A group by depNo;

Having 过滤子句

  • 对分组后的计算结果进行过滤的子句

查询一个表格中满足过滤条件的值

select depno,avg(money) from mpneyTable group by depno having avg(money) >1000

子查询

  • 合并两个查询

当第二条查询的查询条件时第一条查询的查询结果时

select money from A where name = '张三'; ==> 设结果为1000
select name from A where money > 1000; --- 查询出钱比张三的钱多的人的姓名
==> 合并为
select name from A where money > (select money from where name = '张三');
  • 子查询也可以作为字段进行查询
select name,(select money from A where name = '张三') '张三的钱' from A ;

ALL 关键字

  • ALL 关键词可以查询表中所有的数据
在表1中查询比表2所有数都大的数 设字段名为 IDNO
SELECT IDNO FROM TABLE1 IDNO > (SELECT MAX(IDNO) FROM TABLE2 );
==> 等价于
SELECT IDNO FROM TABLE1 IDNO > ALL (SELECT IDNO FROM TABLE2);

空值-NULL

概念解释:NULL ≠ 0 , NULL≠空字符串 , NULL 是独特的值

1+NULL = NULL ,1-NULL = NULL,NULL+NULL = NULL,NULL-NULL = NULL,NULL是独特的值并且不被运算影响

当字段值为NULL时,MySQL 和 SQLServer 会输出关键词NULL,但是Oracle和PostgreSQL 不会输出任何值

NULL 不能只使用 WHERE 与 NULL 比较 , 会出现条件不成立

NULL 可以同时使用 WHERE 和 IS 来进行条件判断

SELECT 1 WHERE NULL = NULL;--成立
SELECT 1 WHERE 0 IS NOT NULL; -- 成立
SELECT 1 WHERE "" IS NOT NULL; -- 成立 

NULL 可以被赋值,也可以向表中增加值为NULL的字段

UPDATE 表名 SET 字段名=NULL WHERE 字段名=查询条件;
> 对已有字段进行赋值为NULL
INSERT INTO 表名 VALUES(字段值,字段值,NULL)
> 向表中插入值为 NULL 的记录
> 使用INSERT INTO 增加数据时,未被明确录入的字段会默认为NULL

表的别名/定义变量

以下面这段代码为例:
mysql>select deptno,dname from dept d
    ->where d.deptno not in (select e.deptno from emp e);
> 在第一行的 from 后面 dept d , 'd' 是表 dept 的别名,后续查询中可以直接使用 'd' 来对dept 做出操作
> 在第二行的 from 中 emp e , 'e' 是对 emp 的别名,由于 sql 语言的特性,代码读取顺序是先读取 from 后的代码,再读取 select 后的代码,所以 可以在 定义别名之前使用别名,即 e.deptno 在 emp e 的前面。 

注释

单行注释:-- 单行注释,使用"--"
多行注释:/* 第一行 
            第二行
            结束行
        */

表数据的类型

类型代码说明
INT整数
VARCHAR()字符串 使用时用括号限定字符个数
Date时间 输入格式为 年-月-日
numeric(a,b)数字类型,总位数a,小数点后位数b
char(n)字符/字符串,固定长度n
varchar(n)字符/字符串,长度可变,最大长度n(当字符串的长度不足n时 数据库只保存实际长度 )

WHERE 子句运算符

运算符说明
=等于
<>或!=不等于
>大于
<小于
>=大于等于
<=小于等于