mysql基础

mysql基础

  • 1.数据库基本概念
    • 1.1数据(Data)
    • 1.2数据库(DataBase,DB)
      • 1.2.1数据库类型
      • 1.2.2MYSQL简述
    • 1.3数据库管理系统(DataBase Management System,DBMS)
    • 1.4数据库系统(DataBase System,DBS)
  • 2.命令行操作MYSQL
    • 2.1登录
    • 2.2访问
  • 3.SQL语句
    • 3.1SQL语句分类
    • 3.2创建数据表
      • 3.2.1建库
      • 3.2.2新建查询
    • 3.3添加数据
    • 3.4修改数据
    • 3.5删除数据
    • 3.6修改数据表
    • 3.7表的完整性约束
      • 3.7.1非外键约束
      • 3.7.2外键约束
    • 3.8DQL查询详讲
      • 3.8.1简单的select查询
      • 3.8.2where子句
      • 3.8.3函数
      • 3.8.4group by(用于分组)
      • 3.8.5having(分组以后进行二次筛选)

1.数据库基本概念

1.1数据(Data)

数据(Data)是数据库中存储的基本对象。定义为描述事务的符号记录。数据的含义称为语义,数据与其语义是不可分的。其包含有多种表现形式:字母、文字、文本、图形、音频、视频等。

1.2数据库(DataBase,DB)

长期存储在计算机内,有组织的,可共享的大量数据的集合。
数据库基本特征:1.永久存储 2.有组织 3.可共享 4.冗余度小 5.易扩展
mysql基础_第1张图片

1.2.1数据库类型

  1. 关系型数据库(例如:MySQL,SQL Server)
    关系型数据库将复杂的数据结构用较为简单的二元关系(二维表)来表示,例如下图。对数据的操作基本上都建立在一个或多个表格上,我们可以采用结构化查询语言(SQL)对数据库进行操作。mysql基础_第2张图片
  2. 非关系型数据库(例如:MongoDB、Redis)
    NOSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

而今天我们要学的就是关系型数据库里的MYSQL

1.2.2MYSQL简述

MySQL数据库最初是由瑞典MySQL AB公司开发,2008年1月16号被Sun公司收购。2009年,SUN又被Oracle收购。MySQL是目前IT行业最流行的开放源代码的数据库管理系统,同时它也是一个支持多线程高并发多用户的关系型数据库管理系统。MySQL之所以受到业界人士的青睐,主要是因为其具有以下几方面优点:

  1. 开放源代码
    MySQL最强大的优势之一在于它是一个开放源代码的数据库管理系统。开源的特点是给予了用户根据自己需要修改DBMS的自由。MySQL采用了General Public License,这意味着授予用户阅读、修改和优化源代码的权利,这样即使是免费版的MySQL的功能也足够强大,这也是为什么MySQL越来越受欢迎的主要原因。

  2. 跨平台
    MySQL可以在不同的操作系统下运行,简单地说,MySQL可以支持Windows系统、UNIX系统、Linux系统等多种操作系统平台。这意味着在一个操作系统中实现的应用程序可以很方便地移植到其他的操作系统下。

  3. 轻量级
    MySQL的核心程序完全采用多线程编程,这些线程都是轻量级的进程,它在灵活地为用户提供服务的同时,又不会占用过多的系统资源。因此MySQL能够更快速、高效的处理数据。

  4. 成本低
    MySQL分为社区版和企业版,社区版是完全免费的,而企业版是收费的。即使在开发中需要用到一些付费的附加功能,价格相对于昂贵的Oracle、DB2等也是有很大优势的。其实免费的社区版也支持多种数据类型和正规的SQL查询语言,能够对数据进行各种查询、增加、删除、修改等操作,所以一般情况下社区版就可以满足开发需求了,而对数据库可靠性要求比较高的企业可以选择企业版。

另外,PHP中提供了一整套的MySQL函数,对MySQL进行了全方位的强力支持。总体来说,MySQL是一款开源的、免费的、轻量级的关系型数据库,其具有体积小、速度快、成本低、开放源码等优点,其发展前景是无可限量的。

1.3数据库管理系统(DataBase Management System,DBMS)

  • 位于用户与操作系统之间的一层数据管理软件。

  • 数据库管理系统DataBase Management System,DBMS)和操作系统一样是计算机的基础软件。

  • 主要功能:提供数据定义语言(DDL)、数据操纵语言(DML)等。

  • 目前,比较流行的数据库管理系统有:Oracle、MySQL、SQL Server、DB2等。

1.4数据库系统(DataBase System,DBS)

数据库系统(DataBase System,DBS)由数据库(DB),数据库管理系统(DBMS),应用程序和数据库管理员(DBA)组成的存储、管理、处理和维护数据的系统。

2.命令行操作MYSQL

2.1登录

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

2.2访问

  1. 创建数据库:
命令:
create database 数据库名字;
例如:
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
  1. 查看数据库
命令:
show databases;
例如:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

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

  1. 选中数据库
    MySQL下可以有多个数据库,如果要访问哪个数据库,需要将其置为当前数据库。
命令:
use 数据库名字;
例如:
mysql> use test;
Database changed
  1. 查看数据库里全部数据表
命令:
show tables;
例如:
mysql> show tables;
Empty set (0.00 sec)
  1. 退出数据库
命令:
exit;
例如:
mysql> exit;
Bye

3.SQL语句

SQL (Structured Query Language) 是具有数据操纵和数据定义等多种功能的数据库语言。在数据库管理系统中,使用SQL语言来实现数据的存取、查询、更新等功能。SQL是一种非过程化语言,只需提出“做什么”,而不需要指明“怎么做”。

3.1SQL语句分类

  1. 数据定义语句 DDL
    DDL(数据库定义语言),定义的是数据库对象有:表、视图、数据库、用户、角色、函数。它主要用于在数据库中的创建或删除数据库对象等操作,如create创建数据库对象、drop删除数据库对象、alter修改数据库对象等语句。
  2. 数据查询语句 DQL
    DQL(数据库查询语言),它主要用来对数据库中的数据进行查询,指select语句,结合fromwhere子句来查询一条或者多条数据。
  3. 数据操作语句 DML
    DML(数据库操作语言),它主要用于插入、修改和删除表中的数据,如insert增加数据、update修改数据、delete删除数据等。
  4. 数据控制语句 DCL
    DCL(数据库控制语言),它主要用于控制数据库组件的存取许可、存取权限等,如revoke回收授予的某种权限、grant授予用户某种权限等。
  5. 事务控制语句 TCL
    TCL(事务控制语句),它主要用于数据库的事务管理。如 START TRANSACTION开启事务 、COMMIT提交事务、 ROLLBACK回滚事务 、SET TRANSACTION设置事务的属性

3.2创建数据表

3.2.1建库

mysql基础_第3张图片

3.2.2新建查询

数据表列类型

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

char和varchar的区别?
char是一种固定长度的类型,无论储存的数据有多少都会固定长度,如果插入的长度小于定义长度,则可以用空格进行填充。而varchar是一种可变长度的类型,当插入的长度小于定义长度时,插入多长就存多长。

Date,DateTime,TimeStamp的区别?

这里简单举几个,其他的即用即查就行参考博客
直接举个栗子
建立一张用来存储学生信息的表。字段包含学号、姓名、性别,年龄、入学日期、班级,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;

3.3添加数据

-- 查看表记录:
select * from tb_student;
-- 在tb_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 是字符的个数,不是字节的个数。
  • 如果不是全字段插入数据的话,需要加入字段的名字

3.4修改数据

-- 修改表中数据
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. 修改,删除数据别忘记加限制条件

3.5删除数据

delete from tb_student where sno = 2;

删除前谨慎谨慎再谨慎!!!

3.6修改数据表

-- 查看数据:
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;

3.7表的完整性约束

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

MySQL中主要支持以下几种种完整性约束,如表所示。 其中Check约束是MySQL8中提供的支持。
mysql基础_第4张图片

3.7.1非外键约束

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

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

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

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

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

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

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

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

  3. 字段值自动增加约束
    自增约束(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 tb_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
);
-- 添加数据:
insert into tb_student values (1,'张三','男',21,'2023-9-1','java01班','[email protected]');
insert into tb_student values (1,'王五','男',21,'2023-9-1','java01班','[email protected]');
-- 1062 - Duplicate entry '1' for key 'tb_student.PRIMARY' 主键重复
insert into tb_student values (2,'王五','男',21,'2023-9-1','java01班','[email protected]');
-- > 1062 - Duplicate entry '[email protected]' for key 'tb_student.email' 违反唯一约束
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]');
-- 如果主键没有设定值,或者用null.default都可以完成主键自增的效果
insert into tb_student values (default,'小刚','男',21,'2023-9-1','java01班','[email protected]');
-- 如果sql报错,可能主键就浪费了,后续插入的主键是不连号的,我们主键也不要求连号的

-- 查看数据:
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)
);

-- 在创建表以后添加约束:
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;

约束从作用上的分类

  • 表级约束:可以约束表中任意一个或多个字段。与列定义相互独立,不包含在列定义中;与定义用‘,’分隔;必须指出要约束的列的名称。
  • 列级约束:包含在列定义中,直接跟在该列的其它定义之后 ,用空格分隔;不必指定列名。

3.7.2外键约束

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

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

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

-- 先创建父表:班级表:
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;

外键策略

  • NO ACTION / RESTRICT
    NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同
    RESTRICT:拒绝对父表的删除或更新操作,不允许操作
    也是默认的策略。
  • CASCADE
    CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行。
    操作主表的时候影响从表的外键信息
  • SET NULL
    SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL
    直接举个栗子
    1)朋友圈删除,点赞。留言都删除 – CASCADE
    2)解散班级,对应的学生置为班级为null就可以了,-- SET NULL

3.8DQL查询详讲

首先准备四张表: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;

3.8.1简单的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;  -- ???出现了问题,后面再说  NULL0 还有不同区分 

-- 去重操作:
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按照降序排列

3.8.2where子句

指定查询条件使用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;

3.8.3函数

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):多条数据,最终展示一个结果  -- 多行函数

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

常用的单行函数主要包括字符串函数、数值函数、日期与时间函数、流程函数以及其他函数。 建议随用随查。
mysql基础_第6张图片
mysql基础_第7张图片
mysql基础_第8张图片
mysql基础_第9张图片
在这里插入图片描述

-- 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基础_第10张图片

-- 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基础_第11张图片
-- 多行函数:
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;

3.8.4group 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;

3.8.5having(分组以后进行二次筛选)

-- 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语句的执行顺序
from–where – group by– select - having- order by

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