一、了解mysql
1.1 mysl数据库的概念
数据库就是一个存储数据的仓库。为了方便数据的存储和管理。
1.2 mysql的安装
安装我这里不说了,自行百度查看安装。
1.3 环境变量的配置
1.3.1 变量名和变量值的填写
1、在高级系统设置中点击环境变量,点击系统变量下的新建按钮
变量名:MYSQL_HOME
变量值:C:\Program Files\MySQL\MySQL Server 8.0(此处变量名需要填写自己的mysql服务在本地安装的位置,以上地址仅供参考)
1.3.2 配置path路径
1.4 mysql服务器的常规操作
通过系统服务器和命令提示符(DOS)都可以启动、连接、断开、停止mysql,操作非常简单。
1.4.1 启动、停止(命令提示符最好以管理员的身份运行)
命令提示符下启动mysql服务器:net start mysql
命令提示符下停止mysql服务器:net stop mysql
1.4.2 连接和断开mysql服务器
命令提示符下启动mysql服务器:mysql -uroot -proot(mysql -u<用户名> -p<密码>)
命令提示符下断开mysql服务器:quit
二 、mysql的存储引擎
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。 存储引擎其实就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
mysql常用的存储引擎有:MyISAM、InnoDB
(注意:一个表只能使用一个存储引擎,一个库中不同的表可以使用不同的存储引擎)
2.1 InnoDB存储引擎
InnoDB 是 MySQL 上第一个提供外键约束的引擎,除了提供事务处理外,InnoDB 还支持行锁,提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量。
InnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最有效率的。
2.1.1 InnoDB的特点
1、InnoDB中不保存表的行数,如select count(*)from table;时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。需要注意的是当count(*)语句包含where条件时MyISAM也需要扫描整个表。
2、对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立组合索引。
3、delete清空整个表时,InnoDB 是一行一 行的删除,效率非常慢。MyISAM则会重建表。
2.1.2 InnoDB适用生产场景
业务需要事务的支持。
行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成。
业务数据更新较为频繁的场景。如:论坛,微博等。
业务数据一致性要求较高。如:银行业务。
硬件设备内存较大,利用InnoDB较好的缓存能力来提高内存利用率,减少磁盘IO的压力。
2.2 MyISAM存储引擎
MyISAM是MySql默认的存储引擎,不支持外键和事务,优势是访问速度快.以select和insert为主的应用以这个存储引擎创建表尤佳。
它在磁盘上包含三个文件,一个是存储表定义的.frm文件,存储数据的MYData后缀为.MYD文件和存储索引的MYIndex后缀为.MYI文件。
2.2.1 MyISAM表支持3种不同的存储格式
- 静态表:因为其字段的长度都是固定的,所以相对会占空间,会用空格,但是由于长度固定存储非常快。
- 动态表:变长字段的存储固然较少空间,但频繁的更新删除会产生空间碎片。
- 压缩表:每个记录都进行了单独压缩,占据非常小的空间。
2.2.2 MylSAM的特点
表级锁定形式,数据在更新时锁定整个表。
数据库在读写过程中相互阻塞:
- 会在数据写入的过程阻塞用户数据的读取
- 也会在数据读取的过程中阻塞用户的数据写入
数据单独写入或读取,速度过程较快且占用资源相对少。
2.2.3 MyISAM使用的生产场景
- 企业业务不需要事务的支持
- 单方面读取或写入数据比较多的业务
- MylSAM存储引擎数据读写都比较频繁场景不适合(因为读写是互相阻塞的)
- 使用读写并发访问相对较低的业务
- 数据修改相对较少的业务
- 对数据业务-致性要求不是非常高的业务
- 服务器硬件资源相对比较差(MyISAM占用资源相对少)
2.3 MyISAM和InnoDB的区别
MyISAM: 不支持事务和外键约束,占用空间较小,访问速度快,表级锁定,适用于不需要事务处理、单独写入或查询的应用场景。(写入和查询不一起使用的场景)
InnoDB: 支持事务处理、外键约束、占用空间比MyISAM 大,支持行级锁定,读写开发能力较好,适用于需要事务处理、读写频繁的应用场景。
2.4 查看和修改存储引擎
2.4.1 查询支持的所有的存储引擎
SHOW ENGINES;
show engines语句以“;”结束,也可以使用“\G”结束
show engines;
2.4.2 查看数据表使用的存储引擎
2.4.2.1 查看数据表使用的存储引擎方法一
show table status from 库名 where name='表名';
show table status from world where name='countrylanguage';
2.4.2.1 查看数据表使用的存储引擎方法二
use 库名;
show create table 表名;
use finance;
SHOW CREATE TABLE bank;
2.4.3 修改存储引擎
修改当前数据表使用的存储引擎。
use 库名;
alter table 表名 engine=存储引擎名称;
use finance;
alter table bank engine=MyISAM; #将bank表的存储引擎修改为MyISAM
三、数据库操作
数据库(database)是按照数据结构来组织、存储和管理数据的仓库,是存储在一起的相关数据的集合。优点如下:
- 减少数据的额冗余度,节省数据的存储空间
- 具有较高的数据独立性和易扩展性
- 实现数据资源的充分共享
数据的事务
3.1 数据库常用对象
在mysql的数据库总,表、视图、存储过程和索引等具体存储数据或对数据进行操作的实体都称之为数据库对象。
1、表
表是包含数据库中所有数据的数据库对象,由行和列组成,用于组织和存储数据
2、字段
表中的每一列称之为一个字段,字段具有自己的属性。如字段类型、字段大小。
3、索引
索引是一个单独的、物理的数据结构。是依赖于表建立的,在数据库中索引是数据库程序无序对一个表进行扫描,就可以在其中找到所需的数据
4、视图
视图是从一张表或多张表导出的表(也称虚拟表),是用户查看数据表中的一种方式。表中包括几个被定义的数据列和数据行,其结构和数据都是建立在对标的查询之上。
5、存储过程
存储过程是一组为了完成特定功能的sql语句集合(包括增删改查等操作),经编译之以名称的形式存储在mysql服务端的数据库中,由用户执行存储过程的名字来执行。当这个存储过程被调用时,这些操作也会被同事执行。
3.2 数据库操作语言
数据库在操作时,需要使用专门的数据库操作规则和语法,这个语法就是 SQL(Structured Query Language) 结构化查询语言。
SQL 的主要功能是和数据库建立连接,进行增删改查的操作。SQL是关系型数据库管理系统的标准语言。
SQL 语言的作用:
1. 数据定义语言 DDL(Data Definition Language) 。用于创建数据库,数据表。
2. 数据操作语言 DML(Data Manipulation Language) 。用于从数据表中插入、修改、删除数据。
3. 数据查询语言 DQL(Data Query Language) 。用于从数据表中查询数据。
4. 数据控制语言 DCL(Data Control Language) 。用来设置或修改数据库用户或角色的权限。
使用 SQL 操作数据库时,所有的 SQL 语句都以分号结束。(切换数据库时可以不用分号)
在 SQL 语句中,不区分大小写,编写 SQL 语句时可以根据情况用大小写的区别来增加可读性。
3.3 数据库创建与更新
3.3.1 查看当前的数据库
使用 show databases; 查看当前安装的 MySQL 中有哪些数据库。
show databases;
3.3.2 创建数据库
1、使用 create database 数据库名; 创建数据库。
create database class_test;
2、使用 create database 数据库名 character set utf8; 创建数据库并设置数据库的字符编码。
create database class_test_two character set utf8;
3、直接创建的数据库,数据库的编码方式是 MySQL 默认的编码方式 latin1 (单字节编码) ,通常我们会在数据库中存放中文数据,所以最好把数据库的编码方式设置成 utf-8 ,这样中文才能正常显示。character set 可以缩写成 charset ,效果是一样的。
create database class_test_three charset utf8;
4、查看和显示数据库的编码方式(使用 show create database 数据库名; 显示数据库的创建信息。)
show create database class_test; show create database class_test_two; show create database class_test_three;
3.3.3 修改数据库编码
1、使用 alter database 数据库名 character set utf8; 修改数据库编码
alter database class_test character set utf8;
2、进入或切换数据库(使用 use 数据库名 进入或切换数据库。)
use class_test;
3、 显示当前数据库 select database();
select database();
3.4 数据库事务
事务是在数据库中执行的一系列操作单元,这些操作要么全部成功提交,要么全部失败回滚。
3.4.1事务的特点
原子性(Atomicity):事务是一个不可分割的操作单元,要么全部执行成功,要么全部执行失败。如果事务中的任何一部分操作失败,将回滚到事务开始前的状态,保证数据的完整性。
一致性(Consistency):事务执行的结果,须使数据从一个一致性状态到另一个一致性状态;
隔离性(Isolation):事务的执行互不干扰,任何事务内部操作对其他事务都是隔离的。并发执行的多个事务之间应该互相隔离,以防止数据争用和不一致的问题。
持久性(Durability):一旦事务提交成功,它对数据库的改变应永久保存,即使系统发生故障也不会丢失。数据库系统通过将事务的操作记录写入持久存储介质(如磁盘)来保证数据的持久性。
3.4.1.1 举例说明事务
假设有一个银行系统,其中有两个账户:账户A和账户B。现在有一个转账操作需要将一定金额从账户A转移到账户B。
在这个转账操作中,可以将其作为一个事务来处理。事务包含以下步骤:
开始事务。
从账户A扣除一定金额。
向账户B添加同样的金额。
提交事务。
如果在整个过程中没有出现错误,即成功执行了步骤 2 和步骤 3,并且事务成功提交,那么账户A和账户B的余额将会根据转账操作进行更新,保持总额不变。然而,如果在执行过程中出现了错误,比如步骤 3 遇到了问题,无法向账户B添加金额,那么事务将会回滚(Rollback),取消之前的步骤,账户A的金额也不会被扣除。
3.4.2 事务的隔离性
- 五种常见的并发异常
- 第一类丢失更新(某一个事务的回滚,导致另一个事务已更新的数据丢失。)
- 第二类丢失更新(某一个事务的提交,导致另一个事务已更新的数据丢失。)
- 脏读(某一个事务,读取了另外一个事务未提交的数据。)
- 不可重复读(一个事务对同一个数据前后读取结果不一致。)
- 幻读(某一个事务,对同一个表前后查询到的行数不一致。)
- 常见的隔离级别
- Read Uncommitted: 读取未提交的数据
- Read Committed: 读取已提交的数据
- Repeatable Read: 可重复读
- Serializable: 串行化
四、表操作
4.1 表操作-查询创建
4.1.1 查询当前数据库所有表
show tables
4.1.2 查看指定表结构
desc 表名 ;
4.1.3创建表结构
CREATE TABLE 表名(
字段1 字段1类型 [ COMMENT 字段1注释 ],
字段2 字段2类型 [COMMENT 字段2注释 ],
字段3 字段3类型 [COMMENT 字段3注释 ],
......
字段n 字段n类型 [COMMENT 字段n注释 ]
) [ COMMENT 表注释 ] ;
#注意: [...] 内为可选参数,最后一个字段后面没有逗号
比如,我们创建一张表 ct_user ,对应的结构如下,那么建表语句为:
create table ct_user(
id int comment '编号',
name varchar(50) comment '姓名',
age int comment '年龄',
gender varchar(1) comment '性别'
) comment '用户表';
4.1.3.1 表操作-案例
设计一张员工信息表,要求如下:
1. 编号(纯数字)
2. 员工工号 ( 字符串类型,长度不超过 10 位 )
3. 员工姓名(字符串类型,长度不超过 10 位)
4. 性别(男 / 女,存储一个汉字)
5. 年龄(正常人年龄,不可能存储负数)
6. 身份证号(二代身份证号均为 18 位,身份证中有 X 这样的字符)
7. 入职时间(取值年月日即可)create table ct_emp( id int comment '编号', workno varchar(10) comment '工号', name varchar(10) comment '姓名', gender char(1) comment '性别', age tinyint unsigned comment '年龄', idcard char(18) comment '身份证号', entrydate date comment '入职时间' ) comment '员工表';
4.2 表操作-修改
4.2.1 添加字段
ALTER TABLE 表名 ADD 字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];
为 ct_emp 表增加一个新的字段 ” 昵称 ” 为 nickname ,类型为 varchar(20)
ALTER TABLE ct_emp ADD nickname varchar(20) COMMENT '昵称';
4.2.2 修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);
4.3.3 修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];
1、添加字段
ALTER TABLE 表名 ADD 字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];
为 ct_emp 表增加一个新的字段 ” 昵称 ” 为 nickname ,类型为 varchar(20)
ALTER TABLE ct_emp ADD nickname varchar(20) COMMENT '昵称';
2、修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);
3、修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];
举例:将ct_emp 表的 nickname 字段修改为 username ,类型为 varchar(30)
ALTER TABLE ct_emp CHANGE nickname username varchar(30) COMMENT '昵称';
4、删除字段
ALTER TABLE 表名 DROP 字段名;
举例:将 ct_emp 表的字段 username 删除
ALTER TABLE ct_emp DROP username;
5、修改表名
ALTER TABLE 表名 RENAME TO 新表名;
举例:将 ct_emp 表的表名修改为 employee
ALTER TABLE ct_emp RENAME TO employee;
4.3 表操作-删除
1、删除表
DROP TABLE [ IF EXISTS ] 表名;
可选项 IF EXISTS 代表,只有表名存在时才会删除该表,表名不存在,则不执行删除操作 ( 如果不加该参数项,删除一张不存在的表,执行将会报错 ) 。
案例 :
如果 tb_user 表存在,则删除 tb_user 表DROP TABLE IF EXISTS ct_user;
2、删除指定表, 并重新创建表。(理解为清空表中的所有数据,数据量多时,使用的是删除方法,数据量少使用delete)
TRUNCATE TABLE 表名;
注意 : 在删除表的时候,表中的全部数据也都会被删除。
4.4 mysql权限问题
-- ***********五、mysql权限问题**************** -- mysql数据库权限问题:root :拥有所有权限(可以干任何事情) -- 权限账户,只拥有部分权限(CURD)例如,只能操作某个数据库的某张表 -- 如何修改mysql的用户密码? -- password: md5加密函数(单向加密) SELECT PASSWORD('root'); -- *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B(32位无序字符串) -- mysql数据库,用户配置 : user表 USE mysql; SELECT * FROM USER; -- 修改密码 UPDATE USER SET PASSWORD=PASSWORD('123456') WHERE USER='root'; 权限 GRANT 权限 ON 数据库.表 TO '账户名'@'账户地址' IDENTIFIED BY '密码'; 举例: 权限: select insert delete update drop create/ 或,all -- 分配权限账户 GRANT SELECT ON java2005.tb_music TO 'jack'@'localhost' IDENTIFIED BY '123456'; GRANT DELETE ON jiaoshi4.dept TO 'jack'@'192.168.1.123' IDENTIFIED BY '123456';
4.5 备份
#备份 #mysqldump -u<用户名> -p<密码> 备份的数据库名称 > 磁盘路径/备份后的文件命名 mysqldump -uroot -p java2005 > d:/java2005.sql #恢复 #mysqldump -u<用户名> -p<密码> 需要回复的文件名 < 文件路径 mysql -uroot -p java2006 < d:/java2005.sql 注意 不需要登陆
4.6 触发器
触发器作用 当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成!! 例如: 当向员工表插入一条记录时,希望同时往日志表插入数据
首先创建日志表 -- 日志表 CREATE TABLE test_log( id INT PRIMARY KEY AUTO_INCREMENT, content VARCHAR(100) ) -- 需求: 当向员工表插入一条记录时,希望mysql自动同时往日志表插入数据 -- 创建触发器(添加) CREATE TRIGGER tri_empAdd AFTER INSERT ON employee FOR EACH ROW -- 当往员工表插入一条记录时 INSERT INTO test_log(content) VALUES('员工表插入了一条记录'); -- 插入数据 INSERT INTO employee(id,empName,deptId) VALUES(7,'兔斯基',1); INSERT INTO employee(id,empName,deptId) VALUES(8,'光头强',1); -- 查询数据 SELECT * FROM employee; SELECT * FROM test_log; -- 创建触发器(修改) CREATE TRIGGER tri_empUpd AFTER UPDATE ON employee FOR EACH ROW -- 当往员工表修改一条记录时 INSERT INTO test_log(content) VALUES('员工表修改了一条记录'); -- 修改 UPDATE employee SET empName='eric' WHERE id=7; -- 创建触发器(删除) CREATE TRIGGER tri_empDel AFTER DELETE ON employee FOR EACH ROW -- 当往员工表删除一条记录时 INSERT INTO test_log(content) VALUES('员工表删除了一条记录'); -- 删除 DELETE FROM employee WHERE id=7;
五、mysql基础
5.1 运算符
5.1.1 算数运算符
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
+ | 加 | 计算两个值或表达式的和 | SELECT A + B |
- | 减 | 计算两个值或表达式的差 | SELECT A - B |
* | 乘法 | 计算两个值或表达式的乘积 | SELECT A * B |
/或DIV | 除法 | 计算两个值或表达式的商 | SELECT A / B |
- 一个整数类型的值对整数进行加法和减法操作,结果还是一个整数;
- 一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数;
- 加法和减法的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的;
- 在Java中,+的左右两边如果有字符串,那么表示字符串的拼接。但是在MySQL中+只表示数值相加。如果遇到非数值类型,先尝试转成数值,如果转失败,就按0计算。(补充:MySQL 中字符串拼接要使用字符串函数CONCAT()实现)
- 一个数乘以整数1和除以整数1后仍得原数;
- 一个数乘以浮点数1和除以浮点数1后变成浮点数,数值与原数相等;
- 一个数除以整数后,不管是否能除尽,结果都为一个浮点数;
- 一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后4位;
- 乘法和除法的优先级相同,进行先乘后除操作与先除后乘操作,得出的结果相同。
- 在数学运算中,0不能用作除数,在MySQL中,一个数除以0为NULL。
SELECT 100, 100+0, 100-0, 100+50, 100+50-30, 100+35.5, 100-35.5
FROM dual;
>>>
+-----+---------+---------+----------+--------------+------------+------------+
| 100 | 100 + 0 |'100'-'0'| 100 + 50 | 100 + 50 -30 | 100 + 35.5 | 100 - 35.5 |
+-----+---------+---------+----------+--------------+------------+------------+
| 100 | 100 | 100 | 150 | 120 | 135.5 | 64.5 |
+-----+---------+---------+----------+--------------+------------+------------+
1 row in set (0.00 sec)
-- 在SQL中+没有连接作用,会将数字字符串转为数值(隐式转换)
SELECT 10 + '10'
FROM DUAL;
>>> 20
-- 此时将'a'看做0处理
SELECT 10 + 'a'
FROM DUAL;
>>> 10
SELECT 100, 100*1, 100*1.0, 100/1.0, 100/2, 100+2*5/2, 100 DIV 0
FROM DUAL;
>>> 100,100,100.0,100.0000,50.0000,105.0000,NULL
5.1.2 比较运算符
比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果为假则返回0,其他情况则返回NULL
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
= | 等于 | 判断两个值、字符串或表达式是否相等 | SELECT C FROM TABLE WHERE A=B |
!=(<>) | 不等于 | 判断两边是否不相等 | SELECT C FROM TABLE WHERE A!=B |
< | 小于 | 判断前面是否小于后面 | SELECT C FROM TABLE WHERE A<B |
<= | 小于等于 | 判断前面是否小于等于后面 | SELECT C FROM TABLE WHERE A<=B |
> | 大于 | 判断前面是否大于后面 | SELECT C FROM TABLE WHERE A>B |
>= | 大于等于 | 判断前面是否大于等于后面 | SELECT C FROM TABLE WHERE A>=B |
等号运算符(=)判断等号两边的值、字符串或表达式是否相等,如果相等则返回1,不相等则返回0。
在使用等号运算符时,遵循如下规则:
如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
如果等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
如果等号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
如果等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
SELECT 1=2, 1!=2, 1='1', 1='a'
FROM DUAL;
>>> 0,1,1,0
SELECT 0='a', 'ab'='bc'
FROM DUAL;
>>> 1,0
1、不等于运算符 !=
不等于运算符(<>和!=)用于判断两边的数字、字符串或者表达式的值是否不相等,如果不相等则返回1,相等则返回0。不等于运算符不能判断NULL值。如果两边的值有任意一个为NULL,或两边都为NULL,则结果为NULL。 SQL语句示例如下:
SELECT 1 <> 1, 1!=2, 'a'!='b', (3+4) <> (2+6), 'a'!=NULL, NULL<>NULL FROM DUAL; >>> 0,1,1,1,NULL,NULL
5.1.3 非符号类型的运算符
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
is null | 为空运算符 | 判断值、字符串或表达式是否为空 | SELECT b FROM table WHERE a IS NULL |
is not null | 不为空运算符 | 判断值、字符串或表达式是否不为空 | SELECT b FROM table WHERE a IS NOT NULL |
between and | 两值之间的运算符 | 判断一个值是否在两值之间 | SELECT d FROM table WHERE c BETWEEN a AND b |
isnull | 为空运算符 | 判断一个值是否为空 | SELECT b FROM table WHERE a ISNULL |
in | 属于运算符 | 判断一个是是否为列表中的任意一个值 | SELECT d FROM table WHERE c IN(a,b) |
not in | 不属于运算符 | 判断一个值是否不是一个列表中的任意一个值 | SELECT d FROM table WHERE c NOT IN(a,b) |
like | 模糊匹配运算符 | 判断一个值是否符合模糊匹配 | SELECT c FROM table WHERE a like b |
1、空运算 IS NULL、IS NOT NULL、ISNULL
-- commission_pct为null的数据 SELECT last_name, salary, commission_pct FROM employees WHERE commission_pct IS NULL; -- 或 SELECT last_name, salary, commission_pct FROM employees WHERE ISNULL(commission_pct); -- commission_pct不为null的数据 SELECT last_name, salary, commission_pct FROM employees WHERE commission_pct IS NOT NULL;
2、区间查询 BETWEEN
BETWEEN 条件下界1 AND 条件上界2(查询条件1和条件2范围内的数据,包含边界)
-- 查询工资在6000 到 8000的员工信息 SELECT employee_id, last_name,salary FROM employees WHERE salary BETWEEN 6000 AND 8000; -- WHERE salary >= 6000 AND salary <= 8000; -- 查询工资不在6000 到 8000的员工信息 SELECT employee_id, last_name,salary FROM employees WHERE salary NOT BETWEEN 6000 AND 8000; -- WHERE salary < 6000 or salary > 8000;
3、包含查询 IN、NOT IN
-- 查询部门为10,20,30部门的员工信息 SELECT last_name, salary, department_id FROM employees -- WHERE department_id = 10 OR department_id = 20 OR department_id = 30; WHERE department_id IN (10,20,30); -- 查询工资不是6000、7000、8000的员工信息 SELECT last_name, salary, department_id FROM employees WHERE salary NOT IN (6000,7000,8000);
4、模糊查询 LIKE
-- 查询last_name中包含字符'a'的员工信息 SELECT last_name FROM employees WHERE last_name LIKE '%a%'; -- 查询last_name中以字符'a'开头的员工信息 SELECT last_name FROM employees WHERE last_name LIKE 'a%'; -- 查询last_name中包含字符'a'且包含字符'e'的员工信息 SELECT last_name FROM employees -- WHERE last_name LIKE '%a%' AND last_name LIKE '%e%'; WHERE last_name LIKE '%a%e%' OR last_name LIKE '%e%a%'; -- 查询last_name中第二个字符是'a'的员工信息 SELECT last_name FROM employees WHERE last_name LIKE '_a%'; -- 查询第二个字符是'_'且第三个字符是'a'的员工信息 SELECT last_name FROM employees WHERE last_name LIKE '_\_a%';
5.1.4 逻辑运算符
逻辑运算符主要用来判断表达式的真假,在MySQL中,逻辑运算符的返回结果为1、0或者NULL。
MySQL中支持4中逻辑运算符如下:
运算符 | 作用 | 示例 |
---|---|---|
NOT 或 ! | 逻辑非 | SELECT NOT a |
AND 或 && | 逻辑与 | SELECT a AND b 或SELECT a && b |
OR 或 || | 逻辑或 | SELECT a OR b 或SELECT a || b |
1、AND(逻辑与)、OR(逻辑或)
逻辑与(AND或&&)运算符
当给定的所有值均为非0值,并且都不为NULL时,返回1;
当给定的一个值或者多个值为0时则返回0;否则返回NULL。
逻辑或(OR或||)运算符
当给定的值都不为NULL,并且任何一个值为非0值时,则返回1,否则返回0;
当一个值为NULL,并且另一个值为非0值时,返回1,否则返回NULL;
当两个值都为NULL时,返回NULL。-- AND、OR SELECT last_name,salary,department_id FROM employees -- WHERE department_id = 10 or department_id = 20; -- WHERE department_id = 10 || department_id = 20; -- WHERE department_id = 50 AND salary > 6000; WHERE department_id = 50 && salary > 6000;
注意:
OR可以和AND一起使用,但是在使用时要注意两者的优先级,由于AND的优先级高于OR,因此先
对AND两边的操作数进行操作,再与OR中的操作数结合。
2、NOT(逻辑非)
逻辑非(NOT或!)运算符表示当给定的值为0时返回1;
- 当给定的值为非0值时返回0;
- 当给定的值为NULL时,返回NULL
-- NOT SELECT last_name,salary,department_id FROM employees WHERE salary NOT BETWEEN 6000 AND 8000; -- WHERE commission_pct IS NOT NULL; -- WHERE commission_pct <=> NULL;
六、数据表的增、删、改操作
6.1 增
语法格式如下:
INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ... value_list: value, [, value] ...
使用这个这个命令之前,我们需要先创建好一个数据库,选中数据库后再在这个数据库中创建一个表,之后我们才可以用上述命令将数据填入到表中了。
--创建的的表结构 +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | math | int(11) | YES | | NULL | | | english | int(11) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
1、单行数据,全列插入
insert into student values(1,'张三',90,87); insert into student values(1,'李四',89,87);
单行输入时,关键字values可以不加s,这里大家应该都可以理解。在实际应用中,很少使用到添加单行数据,就像我们网购,在一家网店买的东西,都是通过一个快递邮递到站,不然太费资源,单行输入也是如此。因此下方开始展示多行输入。
2、多行数据,指定列插入
-- 插入两条记录,value_list 数量必须和指定列数量及顺序一致 insert into student (id,name,math,english) values (3,'钟馗',12,45), (4,'卢布',null,null);
通过上方代码我们可以看出在数据中,我们可以将数据赋值为空,什么时候置为空能,就拿现在这个例子,卢布同学因为出去约会了,没参加考试,那么我们就把他所有的成绩全都置为null,相当于卢布同学缺考了。
3、多行数据插入
-- 创建考试成绩表 DROP TABLE IF EXISTS exam_result; CREATE TABLE exam_result ( id INT, name VARCHAR(20), chinese DECIMAL(3,1), math DECIMAL(3,1), english DECIMAL(3,1) ); -- 插入测试数据 INSERT INTO exam_result VALUES (1,'唐三藏', 67, 98, 56), (2,'孙悟空', 87.5, 78, 77), (3,'猪悟能', 88, 98.5, 90), (4,'曹孟德', 82, 84, 67), (5,'刘玄德', 55.5, 85, 45), (6,'孙权', 70, 73, 78.5), (7,'宋公明', 75, 65, 30);
6.2 改
语法格式如下:
UPDATE table_name SET column = expr [, column = expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...]
-- 将大鹏同学的数学成绩变更为 80 分 UPDATE student SET math = 80 WHERE name = '大鹏'; -- 将张三同学的数学成绩变更为 60 分,语文成绩变更为 70 分 UPDATE student SET math = 60, english = 70 WHERE name = '张三'; -- 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分 UPDATE student SET math = math + 30 ORDER BY math + english LIMIT 3; -- 将所有同学的语文成绩更新为原来的 2 倍 UPDATE studentt SET math = math * 2;
备注:修改可以联合上方提到的语句(ORDER BY;WHERE等)进行修改,这样在使用方面对数据的操作就全面了许多。
6.3 删
语法格式如下:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
--删除张三的成绩 DELETE FROM student WHERE name = '张三';
--创建一个测试表 create table test_table( id int, name varchar(20) ); --删除测试表 delete from test_table;