蓝旭后端第六次培训课 MySQL(二)

蓝旭后端第六次培训课 MySQL(二)

  • 命令行操作MySQL
    • 登录
    • 访问
    • 使用
      • 切换至你想操作的数据库
      • 显示当前数据库的所有数据库表
      • 退出数据库
    • 最后补充
  • SQL语句终于来咯
    • SQL简介
    • SQL语句分类
      • 数据查询语句 DQL
      • 数据操作语句 DML
      • 数据定义语句 DDL
      • 数据控制语句 DCL
      • 事务控制语句 TCL
  • 创建数据表
    • 认识数据表
    • 创建数据表 tb_student
      • 1)新建自己的库
      • 2)新建查询
    • 数据表列类型
    • 添加数据
    • 修改数据
    • 删除数据
    • 修改数据表
    • 说明
  • 表的完整性约束
    • 非外键约束
      • 主键约束
      • 非空约束
      • 唯一约束
      • 检查约束
      • 默认值约束
      • 字段值自动增加约束
      • 约束从作用上的分类
      • 用navicat去添加约束
    • 外键约束
    • 外键策略
      • 策略1 NO ACTION / RESTRICT
      • 策略2 CASCADE
      • 策略3 SET NULL
      • 应用场合小举例
  • DQL查询操作 详讲
    • 简单的select查询
    • WHERE子句
    • 使用函数
      • 单行函数
      • 多行函数
    • group by
    • having
    • 单表查询总结
      • select语句总结
      • select语句的执行顺序
  • 后记

命令行操作MySQL

登录

登录的命令:

mysql  -hlocalhost -uroot –p

参数说明:

  • -h:host主机名。后面跟要访问的数据库服务器的地址;如果是登录本机,可以省略
  • -u:user 用户名。后面跟登录数据的用户名,第一次安装后以root用户来登录,是MySQL的管理员用户
  • -p: password 密码。一般不直接输入,而是回车后以保密方式输入。

访问

显示MySQL中的数据库列表:

show databases; 

默认有四个自带的数据库,每个数据库中可以有多个数据库表、视图等对象。

注意!!!这四个默认自带的数据库一定不要去动它!!!
如果有想了解这四个默认的库都是什么作用的,自己去网上查一查,也不再做详细讲解了。

蓝旭后端第六次培训课 MySQL(二)_第1张图片

使用

切换至你想操作的数据库

命令行:

use mysql;

MySQL下可以有多个数据库,如果要访问哪个数据库,需要将其置为当前数据库。

该命令的作用就是将数据库mysql(默认提供的四个数据库之一的名字)置为当前数据库

显示当前数据库的所有数据库表

命令行:

show tables;

通过这个命令,可以查看mysql数据库下的所有数据表。

退出数据库

exit;

Bye!!!
在这里插入图片描述

最后补充

  1. MySQL 层次:不同项目对应不同的数据库组成 - 每个数据库中有很多表 - 每个表中有很多数据
  2. SQL语句的结尾最好加上 ;

SQL语句终于来咯

SQL简介

SQL(Structured Query Language)是结构化查询语言的简称,它是一种数据库查询和程序设计语言,同时也是目前使用最广泛的关系型数据库操作语言。在数据库管理系统中,使用SQL语言来实现数据的存取、查询、更新等功能。SQL是一种非过程化语言,只需提出“做什么”,而不需要指明“怎么做”。

SQL语句分类

数据查询语句 DQL

数据查询语言(Data Query Language,DQL):

  • DQL主要用于数据的查询,其基本结构是使用SELECT子句,FROM子句和WHERE子句的组合来查询一条或多条数据

数据操作语句 DML

  • 数据操作语言(Data Manipulation Language,DML):DML主要用于对数据库中的数据进行增加、修改和删除的操作,其主要包括:(1) INSERT:增加数据 (2) UPDATE:修改数据 (3) DELETE:删除数据

数据定义语句 DDL

  • 数据定义语言(Data Definition Language,DDL):DDL主要用针对是数据库对象(数据库、表、索引、视图、触发器、存储过程、函数)进行创建、修改和删除操作。其主要包括:(1) CREATE:创建数据库对象 (2) ALTER:修改数据库对象 (3) DROP:删除数据库对象

数据控制语句 DCL

  • 数据控制语言(Data Control Language,DCL):DCL用来授予或回收访问 数据库的权限,其主要包括:(1) GRANT:授予用户某种权限 (2) REVOKE:回收授予的某种权限

事务控制语句 TCL

  • 事务控制语言(Transaction Control Language,TCL):TCL用于数据库的事务管理。其主要包括:(1) START TRANSACTION:开启事务 (2) COMMIT:提交事务 (3) ROLLBACK:回滚事务 (4) SET TRANSACTION:设置事务的属性

蓝旭后端第六次培训课 MySQL(二)_第2张图片

创建数据表

认识数据表

表(Table)是数据库中数据存储最常见和最简单的一种形式,数据库可以将复杂的数据结构用较为简单的二维表来表示。二维表是由行和列组成的,分别都包含着数据,如表所示。
蓝旭后端第六次培训课 MySQL(二)_第3张图片
每个表都是由若干行和列组成的,在数据库中表中的行被称为记录,表中的列被称为是这些记录的字段。

记录也被称为一行数据,是表里的一行。在关系型数据库的表里,一行数据是指一条完整的记录。

字段是表里的一列,用于保存每条记录的特定信息。如上表所示的学生信息表中的字段包括“学号”、“姓名”、“性别”和“年龄”。数据表的一列包含了某个特定字段的全部信息。

创建数据表 tb_student

1)新建自己的库

蓝旭后端第六次培训课 MySQL(二)_第4张图片
字符集:
常用utf8mb4,没有特殊要求的话,直接用默认的就好
留个小彩蛋,可以查查utf8和utf8mb4的区别,感兴趣的去多了解了解

排序规则:
自行查看参考博客

2)新建查询

##这是一个单行注释
--这也是一个单行注释

/*
多行注释
多行注释
多行注释
*/

/*
建立一张用来存储学生信息的表
字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息
*/

-- 创建数据库表:
create table tb_student(
        sno int(6), -- 6 代表显示长度 
        sname varchar(5), -- 5 个字符
        sex char(1),
        age int(3),
        enterdate date,
        classname varchar(10),
        email varchar(15)
);
-- 查看表的结构:展示表的字段详细信息
desc tb_student;
-- 查看表中数据:
select * from tb_student;
-- 查看建表语句:
show create table tb_student;
/*
CREATE TABLE `tb_student` (
  `sno` int DEFAULT NULL,
  `sname` varchar(5) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `enterdate` date DEFAULT NULL,
  `classname` varchar(10) DEFAULT NULL,
  `email` varchar(15) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
*/

数据表列类型

有能力的可以直接读相关版本的MySQL文档,该链接为5.7版本的官方文档

  1. 整形 INT
  2. 浮点数类型 FLOAT / DOUBLE
  3. 字符串类型 CHAR / VARCHAR
  4. 日期和时间类型 DATE / DATETIME / TIMESTAMP

这里不过多赘述,仅列举了几个,平时用到啥还是去查一下比较好(比如处理金钱的,涉及到精度等问题;处理时间的,涉及到存储格式和转换等问题;处理长文本的,等等)参考博客,网上一堆的,自己找的也OK
熟练掌握常用的数据类型即可

添加数据

-- 查看表记录:
select * from tb_student;
-- 在t_student数据库表中插入数据:
insert into tb_student values (1,'张三','男',18,'2022-5-8','软件1班','[email protected]');
insert into tb_student values (10010010,'张三','男',18,'2022-5-8','软件1班','[email protected]');
insert into tb_student values (2,'张三','男',18,'2022.5.8','软件1班','[email protected]');
insert into tb_student values (2,"张三",'男',18,'2022.5.8','软件1班','[email protected]');
insert into tb_student values (7,"张三",'男',18,now(),'软件1班','[email protected]');
insert into tb_student values (9,"易烊千玺",'男',18,now(),'软件1班','[email protected]');
insert into tb_student (sno,sname,enterdate) values (10,'李四','2023-7-5');

注意事项
int 宽度是显示宽度,如果超过,可以自动增大宽度 int底层都是4个字节
时间的方式多样 ‘1256-12-23’ “1256/12/23” “1256.12.23”
字符串不区分单引号和双引号
如何写入当前的时间 now() , sysdate() , CURRENT_DATE()
char varchar 是字符的个数,不是字节的个数,可以使用binary,varbinary表示定长和不定长的字节个数。
如果不是全字段插入数据的话,需要加入字段的名字

修改数据

-- 修改表中数据
update tb_student set sex = '女' ;
update tb_student set sex = '男' where sno = 10 ;
UPDATE Tb_STUDENT SET AGE = 21 WHERE SNO = 10;
update tb_student set CLASSNAME = 'java01' where sno = 10 ;
update tb_student set CLASSNAME = 'JAVA01' where sno = 9 ;
update tb_student set age = 29 where classname = 'java01';

注意事项
1.关键字,表名,字段名不区分大小写
2.默认情况下,内容不区分大小写
3.删除操作from关键字不可缺少
4.修改,删除数据别忘记加限制条件

删除数据

delete from tb_student where sno = 2;

不要乱删随意删,记得备份备份备份!除非你要删库跑路了QWQ

修改数据表

-- 查看数据:
select * from tb_student;
-- 修改表的结构:
-- 增加一列:
alter table tb_student add score double(5,2) ; -- 5:总位数  2:小数位数 
update tb_student set score = 123.5678 where sno = 1 ; -- 结果:123.57
-- 增加一列(放在最前面)
alter table tb_student add score double(5,2) first;
-- 增加一列(放在sex列的后面)
alter table tb_student add score double(5,2) after sex;
-- 删除一列:
alter table tb_student drop score;
-- 修改一列:
alter table tb_student modify score float(4,1); -- modify修改是列的类型的定义,但是不会改变列的名字
alter table tb_student change score score1 double(5,1); -- change修改列名和列的类型的定义
-- 删除表:
drop table tb_student;

说明

SQL语句真的太多了,我搁着列肯定列不完。。。上述仅列举部分的SQL语句。。。也不用死记硬背,记住常用的就好,如果想学习了解更多的,建议百度 / CDSN
MySQL中文文档链接地址

表的完整性约束

为防止不符合规范的数据存入数据库,在用户对数据进行插入、修改、删除等操作时,MySQL提供了一种机制来检查数据库中的数据是否满足规定的条件,以保证数据库中数据的准确性和一致性,这种机制就是完整性约束。

MySQL中主要支持以下几种种完整性约束,如表所示。 其中Check约束是MySQL8中提供的支持。蓝旭后端第六次培训课 MySQL(二)_第5张图片

非外键约束

主键约束

主键约束(PRIMARY KEY,缩写PK),是数据库中最重要的一种约束,其作用是约束表中的某个字段可以唯一标识一条记录。因此,使用主键约束可以快速查找表中的记录。就像人的身份证、学生的学号等等,设置为主键的字段取值不能重复(唯一),也不能为空(非空),否则无法唯一标识一条记录。

主键可以是单个字段,也可以是多个字段组合。对于单字段主键的添加可使用表级约束,也可以使用列级约束;而对于多字段主键的添加只能使用表级约束。

非空约束

非空约束(NOT NULL,缩写NK)规定了一张表中指定的某个字段的值不能为空(NULL)。设置了非空约束的字段,在插入的数据为NULL时,数据库会提示错误,导致数据无法插入。

无论是单个字段还是多个字段非空约束的添加只能使用列级约束(非空约束无表级约束)

唯一约束

唯一约束(UNIQUE,缩写UK)比较简单,它规定了一张表中指定的某个字段的值不能重复,即这一字段的每个值都是唯一的。如果想要某个字段的值不重复,那么就可以为该字段添加为唯一约束。

无论单个字段还是多个字段唯一约束的添加均可使用列级约束和表级约束

检查约束

检查约束(CHECK)用来限制某个字段的取值范围,可以定义为列级约束,也可以定义为表级约束。MySQL8开始支持检查约束。

默认值约束

默认值约束(DEFAULT)用来规定字段的默认值。如果某个被设置为DEFAULT约束的字段没插入具体值,那么该字段的值将会被默认值填充。 默认值约束的设置与非空约束一样,也只能使用列级约束。

字段值自动增加约束

自增约束(AUTO_INCREMENT)可以使表中某个字段的值自动增加。一张表中只能有一个自增长字段,并且该字段必须定义了约束(该约束可以是主键约束、唯一约束以及外键约束),如果自增字段没有定义约束,数据库则会提示“Incorrect table definition; there can be only one auto column and it must be defined as a key”错误。

由于自增约束会自动生成唯一的ID,所以自增约束通常会配合主键使用,并且只适用于整数类型。一般情况下,设置为自增约束字段的值会从1开始,每增加一条记录,该字段的值加1。

/*
一、常用约束
建立一张用来存储学生信息的表
字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息
约束:
建立一张用来存储学生信息的表
字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息
【1】学号是主键 = 不能为空 +  唯一 ,主键的作用:可以通过主键查到唯一的一条记录【2】如果主键是整数类型,那么需要自增
【3】姓名不能为空
【4】Email唯一
【5】性别默认值是男
【6】性别只能是男女
【7】年龄只能在18-50之间
*/
-- 创建数据库表:
create table t_student(
        sno int(6) primary key auto_increment, 
        sname varchar(5) not null, 
        sex char(1) default '男' check(sex='男' || sex='女'),
        age int(3) check(age>=18 and age<=50),
        enterdate date,
        classname varchar(10),
        email varchar(15) unique
);
-- 添加数据:
--  1048 - Column 'sname' cannot be null 不能为null
-- 3819 - Check constraint 'tb_student_chk_1' is violated. 违反检查约束
insert into tb_student values (1,'张三','男',21,'2023-9-1','java01班','[email protected]');
-- 1062 - Duplicate entry '1' for key 'tb_student.PRIMARY' 主键重复
-- > 1062 - Duplicate entry '[email protected]' for key 'tb_student.email' 违反唯一约束
insert into tb_student values (2,'李四','男',21,'2023-9-1','java01班','[email protected]');
insert into tb_student values (3,'露露','男',21,'2023-9-1','java01班','[email protected]');
-- 如果主键没有设定值,或者用null.default都可以完成主键自增的效果
insert into tb_student (sname,enterdate) values ('菲菲','2029-4-5');
insert into tb_student values (null,'小明','男',21,'2023-9-1','java01班','[email protected]');
insert into tb_student values (default,'小刚','男',21,'2023-9-1','java01班','[email protected]');
-- 如果sql报错,可能主键就浪费了,后续插入的主键是不连号的,我们主键也不要求连号的
insert into tb_student values (null,'小明','男',21,'2023-9-1','java01班','[email protected]');
-- 查看数据:
select * from tb_student;

-- 查看建表语句:
show create table t_student;
-- 二、表级约束
CREATE TABLE `t_student` (
  `sno` int NOT NULL AUTO_INCREMENT,
  `sname` varchar(5) NOT NULL,
  `sex` char(1) DEFAULT '男',
  `age` int DEFAULT NULL,
  `enterdate` date DEFAULT NULL,
  `classname` varchar(10) DEFAULT NULL,
  `email` varchar(15) DEFAULT NULL,
  PRIMARY KEY (`sno`),
  UNIQUE KEY `email` (`email`),
  CONSTRAINT `t_student_chk_1` CHECK (((`sex` = _utf8mb4'男') or (`sex` = _utf8mb4'女'))),
  CONSTRAINT `t_student_chk_2` CHECK (((`age` >= 18) and (`age` <= 50)))
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci


-- 三、在创建表以后添加约束:
-- 删除表:
drop table t_student;
-- 创建数据库表:
create table t_student(
        sno int(6), 
        sname varchar(5) not null, 
        sex char(1) default '男',
        age int(3),
        enterdate date,
        classname varchar(10),
        email varchar(15)
);
-- > 1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key
-- 错误的解决办法:就是auto_increment去掉
-- 在创建表以后添加约束:
alter table t_student add constraint pk_stu primary key (sno) ; -- 主键约束
alter table t_student modify sno int(6) auto_increment; -- 修改自增条件
alter table t_student add constraint ck_stu_sex check (sex = '男' || sex = '女');
alter table t_student add constraint ck_stu_age check (age >= 18 and age <= 50);
alter table t_student add constraint uq_stu_email unique (email);
-- 查看表结构:
desc t_student;

约束从作用上的分类

(1) 表级约束:可以约束表中任意一个或多个字段。与列定义相互独立,不包含在列定义中;与定义用‘,’分隔;必须指出要约束的列的名称;

(2) 列级约束:包含在列定义中,直接跟在该列的其它定义之后 ,用空格分隔;不必指定列名;

用navicat去添加约束

外键约束

外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的。外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。

外键是指表中某个字段的值依赖于另一张表中某个字段的值,而被依赖的字段必须具有主键约束或者唯一约束。被依赖的表我们通常称之为父表或者主表,设置外键约束的表称为子表或者从表。

举个例子:如果想要表示学生和班级的关系,首先要有学生表和班级表两张表,然后学生表中有个字段为stu_clazz(该字段表示学生所在的班级),而该字段的取值范围由班级表中的主键cla_no字段(该字段表示班级编号)的取值决定。那么班级表为主表,学生表为从表,且stu_clazz字段是学生表的外键。通过stu_clazz字段就建立了学生表和班级表的关系。
蓝旭后端第六次培训课 MySQL(二)_第6张图片
主表(父表):班级表 - 班级编号 - 主键
从表(子表):学生表 - 班级编号 - 外键

-- 先创建父表:班级表:
create table t_class(
        cno int(4) primary key auto_increment,
        cname varchar(10) not null,
        room char(4)
)
-- 添加班级数据:
insert into t_class values (null,'java001','r803');
insert into t_class values (null,'java002','r416');
insert into t_class values (null,'大数据001','r103');
-- 可以一次性添加多条记录:
insert into t_class values (null,'java001','r803'),(null,'java002','r416'),(null,'大数据001','r103');
-- 查询班级表:
select * from t_class;
-- 学生表删除:
drop table t_student;

-- 创建子表,学生表:
create table t_student(
        sno int(6) primary key auto_increment, 
        sname varchar(5) not null, 
        classno int(4)  -- 取值参考 t_class 表中的cno字段,不要求字段名字完全重复,但是类型长度定义 尽量要求相同
);
-- 添加学生信息:
insert into t_student values (null,'张三',1),(null,'李四',1),(null,'王五',2);
-- 查看学生表:
select * from t_student;

-- 出现问题:
-- 1.添加一个学生对应的班级编码为4:
insert into t_student values (null,'丽丽',4);
-- 2.删除班级2:
delete from t_class where cno = 2;

-- 解决办法,添加外键约束:
-- 注意:外键约束只有表级约束,没有列级约束:
create table t_student(
        sno int(6) primary key auto_increment, 
        sname varchar(5) not null, 
        classno int(4),-- 取值参考t_class表中的cno字段,不要求字段名字完全重复,但是类型长度定义 尽量要求相同
        constraint fk_stu_classno foreign key (classno) references t_class (cno)
);
create table t_student(
        sno int(6) primary key auto_increment, 
        sname varchar(5) not null, 
        classno int(4)
);
-- 在创建表以后添加外键约束:
alter table t_student add constraint fk_stu_classno foreign key (classno) references t_class (cno)
-- 上面的两个问题都解决了:
-- 添加学生信息:
-- > 1452 - Cannot add or update a child row: a foreign key constraint fails (`mytestdb`.`t_student`, CONSTRAINT `fk_stu_classno` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
insert into t_student values (null,'张三',1),(null,'李四',1),(null,'王五',2);
delete from t_class where cno = 3;

外键策略

策略1 NO ACTION / RESTRICT

NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同
RESTRICT:拒绝对父表的删除或更新操作,不允许操作
也是默认的策略。

策略2 CASCADE

CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行。
操作主表的时候影响从表的外键信息

策略3 SET NULL

SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL

应用场合小举例

1)朋友圈删除,点赞。留言都删除 – CASCADE
2)解散班级,对应的学生 置为班级为null就可以了,-- SET NULL

DQL查询操作 详讲

表的准备
准备四张表:dept(部门表),emp(员工表),salgrade(薪资等级表),bonus(奖金表)

create table DEPT(  
  DEPTNO int(2) not null,  
  DNAME  VARCHAR(14),  
  LOC    VARCHAR(13)  
);  
alter table DEPT add constraint PK_DEPT primary key (DEPTNO); 
        
create table EMP  
(  
  EMPNO    int(4) primary key,  
  ENAME    VARCHAR(10),  
  JOB      VARCHAR(9),  
  MGR      int(4),  
  HIREDATE DATE,  
  SAL      double(7,2),  
  COMM     double(7,2),  
  DEPTNO   int(2)  
);  
alter table EMP add constraint FK_DEPTNO foreign key (DEPTNO) references DEPT (DEPTNO);  
        
create table SALGRADE  
(  
  GRADE int primary key,  
  LOSAL double(7,2),  
  HISAL double(7,2)  
);  

create table BONUS  
(  
  ENAME VARCHAR(10),  
  JOB   VARCHAR(9),  
  SAL   double(7,2),  
  COMM  double(7,2)  
);  

insert into DEPT (DEPTNO, DNAME, LOC) values (10, 'ACCOUNTING', 'NEW YORK');  
insert into DEPT (DEPTNO, DNAME, LOC) values (20, 'RESEARCH', 'DALLAS');  
insert into DEPT (DEPTNO, DNAME, LOC) values (30, 'SALES', 'CHICAGO');  
insert into DEPT (DEPTNO, DNAME, LOC) values (40, 'OPERATIONS', 'BOSTON');  

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);  
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);  

insert into SALGRADE (GRADE, LOSAL, HISAL) values (1, 700, 1200);  
insert into SALGRADE (GRADE, LOSAL, HISAL) values (2, 1201, 1400);  
insert into SALGRADE (GRADE, LOSAL, HISAL) values (3, 1401, 2000);  
insert into SALGRADE (GRADE, LOSAL, HISAL) values (4, 2001, 3000);  
insert into SALGRADE (GRADE, LOSAL, HISAL) values (5, 3001, 9999);  
-- 查看表:
select * from dept; 
-- 部门表:dept:department 部门,loc - location 位置
select * from emp;
-- 员工表:emp:employee 员工, mgr :manager上级领导编号,hiredate 入职日期, comm :common补助
-- deptno 外键 参考  dept - deptno字段
-- mgr 外键 参考 自身表emp - empno  产生了自关联
select * from salgrade;
-- losal - lowsal
-- hisal - highsal
select * from bonus;
-- 查看表结构
desc emp;

简单的select查询

-- 对emp表查询:
select * from emp; -- * 通配符 代表所有数据

-- 显示部分列:
select empno,ename,sal from emp;

-- 显示部分行:where条件子句
select * from emp where sal > 2000;

-- 显示部分列,部分行:
select empno,ename,job,mgr from emp where sal > 2000;

-- 起别名:
select empno 员工编号,ename 姓名,sal 工资 from emp; -- as 省略,''或者""省略了
-- as alias 别名
select empno as 员工编号,ename as 姓名,sal as 工资 from emp;
select empno as '员工编号',ename as "姓名",sal as 工资 from emp;

-- > 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '编号,ename as "姓 名",sal as 工资 from emp' at line 1
-- 错误原因:在别名中有特殊符号的时候,''或者""不可以省略不写
select empno as 员工 编号,ename as "姓 名",sal as 工资 from emp;


-- 算术运算符:
select empno,ename,sal,sal+1000 as '涨薪后',deptno from emp where sal < 2500;
select empno,ename,sal,comm,sal+comm from emp;  -- ???出现了问题,后面再说  NULL 和 0 还有不同区分 

-- 去重操作:
select job from emp;
select distinct job from emp;
select job,deptno from emp;
select distinct job,deptno from emp; -- 对后面的所有列组合 去重,而不是单独的某一列去重

-- 排序:
select * from emp order by sal; -- 默认情况下是按照升序排列的
select * from emp order by sal asc; -- asc 升序,可以默认不写
select * from emp order by sal desc; -- desc 降序
select * from emp order by sal asc ,deptno desc; -- 在工资升序的情况下,deptno按照降序排列

WHERE子句

指定查询条件使用where子句,可以查询符合条件的部分记录

-- 查看emp表:
select * from emp;
-- where子句:将过滤条件放在where子句的后面,可以筛选/过滤出我们想要的符合条件的数据:
-- where 子句 + 关系运算符
select * from emp where deptno = 10;
select * from emp where deptno > 10;
select * from emp where deptno >= 10;
select * from emp where deptno < 10;
select * from emp where deptno <= 10;
select * from emp where deptno <> 10;	-- 两种不等于都对
select * from emp where deptno != 10;
select * from emp where job = 'CLERK'; 
select * from emp where job = 'clerk'; -- 默认情况下不区分大小写 
select * from emp where binary job = 'clerk'; -- binary区分大小写
select * from emp where hiredate < '1981-12-25';

-- where 子句 + 逻辑运算符:and 
select * from emp where sal > 1500 and sal < 3000;  -- (1500,3000)
select * from emp where sal > 1500 && sal < 3000; 
select * from emp where sal > 1500 and sal < 3000 order by sal; 
select * from emp where sal between 1500 and 3000; -- [1500,3000]
-- where 子句 + 逻辑运算符:or
select * from emp where deptno = 10 or deptno = 20;
select * from emp where deptno = 10 || deptno = 20;
select * from emp where deptno in (10,20);		-- in 查询在这个集合里面的数据
select * from emp where job in ('MANAGER','CLERK','ANALYST'); 

-- where子句 + 简单模糊查询:
-- 查询名字中带A的员工  -- %代表任意多个字符 0,1,2,.....
select * from emp where ename like '%A%' ;
-- _代表任意一个字符
select * from emp where ename like '__A%' ;	-- A在第三位

-- 关于null的判断:
select * from emp where comm is null;
select * from emp where comm is not null;

-- 小括号的使用:因为不同的运算符的优先级别不同,加括号为了可读性
select * from emp where job = 'SALESMAN' or job = 'CLERK' and sal >=1500; -- 不加括号的时候 先and再or  and > or
select * from emp where job = 'SALESMAN' or (job = 'CLERK' and sal >=1500); 
select * from emp where (job = 'SALESMAN' or job = 'CLERK') and sal >=1500;

使用函数

MySQL中提供了大量函数来简化用户对数据库的操作,比如字符串的处理、日期的运算、数值的运算等等。使用函数可以大大提高SELECT语句操作数据库的能力,同时也给数据的转换和处理提供了方便。 (在SQL中使用函数)

1.函数的功能:封装了特定的一些功能,我们直接拿过来使用,可以实现对应的功能
2.函数作用:为了提高select的能力
3.注意:函数没有改变数据自身的值,而是在查询结果的真实数据上面进行加工处理,展示新的结果而已。

MySQL中的函数主要分为单行函数多行函数两大类,下面我们将详细讲解这两大类函数。
举例:

-- 函数举例:
select empno,ename,lower(ename),upper(ename),sal from emp;
-- 函数的功能:封装了特定的一些功能,我们直接拿过来使用,可以实现对应的功能
-- 函数作用:为了提高select的能力
-- 注意:函数没有改变数据自身的值,而是在真实数据的上面进行加工处理,展示新的结果而已。
select max(sal),min(sal),count(sal),sum(sal),avg(sal) from emp;
-- 函数的分类:
-- lower(ename),upper(ename) :改变每一条结果,每一条数据对应一条结果  -- 单行函数
-- max(sal),min(sal),count(sal),sum(sal),avg(sal):多条数据,最终展示一个结果  -- 多行函数

PS:除了多行函数(max,min,count,sum,avg),都是单行函数
多行函数比较少,好记啦~

单行函数

单行函数是指对每一条记录输入值进行计算,并得到相应的计算结果,然后返回给用户,也就是说,每条记录作为一个输入参数,经过函数计算得到每条记录的计算结果。

常用的单行函数主要包括字符串函数、数值函数、日期与时间函数、流程函数以及其他函数。 建议随用随查。

蓝旭后端第六次培训课 MySQL(二)_第7张图片蓝旭后端第六次培训课 MySQL(二)_第8张图片
蓝旭后端第六次培训课 MySQL(二)_第9张图片
蓝旭后端第六次培训课 MySQL(二)_第10张图片在这里插入图片描述

-- 1.字符串函数
select ename,length(ename),substring(ename,2,3) from emp;
-- substring字符串截取,2:从字符下标为2开始,3:截取长度3    (下标从1开始)
-- 2.数值函数
select abs(-5),ceil(5.3),floor(5.9),round(3.14) from dual; -- dual实际就是一个伪表 
select abs(-5) 绝对值,ceil(5.3) 向上取整,floor(5.9) 向下取整,round(3.14) 四舍五入;  -- 如果没有where条件的话,from dual可以省略不写
select ceil(sal) from emp;
select 10/3,10%3,mod(10,3) ;
-- 3.日期与时间函数 
select curdate(),curtime() ; -- curdate()年月日 curtime()时分秒
select now(),sysdate(),sleep(3),now(),sysdate() from dual; -- now(),sysdate() 年月日时分秒
-- 区别:now()返回当前日期和时间,sysdate()返回该函数执行时的日期和时间
insert into emp values (9999,'lili','SALASMAN',7698,now(),1000,null,30);
-- now()可以表示年月日时分秒,但是插入数据的时候还是要参照表的结构的


蓝旭后端第六次培训课 MySQL(二)_第11张图片

-- 4.流程函数
-- if相关
select empno,ename,sal,if(sal >= 2500,'高薪','底薪') as '薪资等级' from emp; -- if-else 双分支结构
-- 大于等于 2500 的 为高薪,否则为底薪
select empno,ename,sal,comm,sal+ifnull(comm,0) from emp;
 -- 如果comm是null,那么取值为0 -- 单分支
select nullif(1,1),nullif(1,2) from dual; --  如果value1等于value2,则返回null,否则返回value1  
-- case相关:
-- case等值判断
select empno,ename,job,
case job 
 when 'CLERK' then '店员'
 when 'SALESMAN'  then '销售'
 when 'MANAGER' then '经理'
 else '其他'
end '岗位',
sal from emp;
-- case区间判断:
select empno,ename,sal,
case 
 when sal<=1000 then 'A'
 when sal<=2000 then 'B'
 when sal<=3000 then 'C'
 else 'D'
end '工资等级',
deptno from emp;
from emp;
-- 5.JSON函数  
-- 6.其他函数
select database(),user(),version() from dual;

多行函数

多行函数是指对一组数据进行运算,针对这一组数据(多行记录)只返回一个结果,也称为分组函数。

蓝旭后端第六次培训课 MySQL(二)_第12张图片

-- 多行函数:
select max(sal),min(sal),count(sal),sum(sal),sum(sal)/count(sal),avg(sal) from emp;
select * from emp;
-- 多行函数自动忽略null值
select max(comm),min(comm),count(comm),sum(comm),sum(comm)/count(comm),avg(comm) from emp;
-- max(),min(),count()针对所有类型   sum(),avg() 只针对数值型类型有效
select max(ename),min(ename),count(ename),sum(ename),avg(ename) from emp;
-- count --计数   
-- 统计表的记录数:
select * from emp;
select count(ename) from emp;
select count(*) from emp;
select count(1) from emp;

group by

group by : 用来进行分组

-- GROUP BY
select * from emp;
-- 统计各个部门的平均工资 
select deptno,avg(sal) from emp; -- 字段和多行函数不可以同时使用
select deptno,avg(sal) from emp group by deptno; -- 字段和多行函数不可以同时使用,除非这个字段属于分组
select deptno,avg(sal) from emp group by deptno order by deptno desc;
-- 统计各个岗位的平均工资
select job,avg(sal) from emp group by job;
select job,lower(job),avg(sal) from emp group by job;

having

having:分组以后进行二次筛选

-- HAVING
-- 统计各个部门的平均工资 ,只显示平均工资2000以上的  - 分组以后进行二次筛选 having
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;
select deptno,avg(sal) 平均工资 from emp group by deptno having 平均工资 > 2000;
select deptno,avg(sal) 平均工资 from emp group by deptno having 平均工资 > 2000 order by deptno desc;
-- 统计各个岗位的平均工资,除了MANAGER
-- 方法1:
select job,avg(sal) from emp where job != 'MANAGER' group by job;
-- 方法2:
select job,avg(sal) from emp group by job having job != 'MANAGER' ;
-- where在分组前进行过滤的,having在分组后进行后滤。

单表查询总结

select语句总结

select column, group_function(column)
from table
[where condition]
[group by group_by_expression]
[having group_condition]
[order by column];

注意:顺序固定,不可以改变顺序

select语句的执行顺序

from–where – group by– select - having- order by

后记

暑期培训期间,我会再专门开一节MySQL,讲一些高级用法,例如:多表查询,子查询,事务等等相关知识。

现在学弟学妹一定要注重掌握基础的知识,能熟练运用Navicat可视化工具。

你可能感兴趣的:(MySQL,数据库,mysql)