一、引言
MySQL是目前最流行的关系型数据库管理系统之一,被广泛应用于Web开发、数据分析等领域。为了更好地使用MySQL,我们需要先了解什么是数据库,以及如何使用SQL语句对数据库进行操作。本文将为您介绍MySQL数据库基础知识和部分常用的SQL语句,帮助您更好地使用MySQL。
二、数据库简述
(1)数据库的概念
数据库是用来组织、存储和管理数据的系统。对数据进行增删改查的操作。
- 使用文件存放数据的劣势:
- 没有数据类型。所有文件数据都是字符串
- 缺少对大数据集的优化,大文件的操作效率很慢
- 增删改查的效率很慢
- 缺少并发。多个用户无法操作同一文件
- 缺少权限校验机制
- 缺少容灾机制。
(2)数据库的分类
关系型数据库 | NoSql(Not Only Sql)数据库 | |
---|---|---|
数据结构 | 结构化的数据,以表为单位进行存储 | 半结构化(xml、json)、非结构化(文档、图片、视频等) |
事务 | 强事务 | 弱事务 |
性能 | 高并发下性能较差 | 高并发下性能较好 |
-
实战开发中,两种数据库相辅相成
- 关系型:对事务要求比较高的数据,如金融类、个人信息等
- SQLServer、MySQL(免费、开源、被Oracle收购)、Oracle等
- 非关系型:对事务要求比较低、对性能要求比较高的数据,如聊天记录、商品详情等
- Redis、MonggoDB等
- 关系型:对事务要求比较高的数据,如金融类、个人信息等
(3)数据库的工作模型
- 客户端+服务器的工作模型
- 一个软件可以同时为多个用户提供服务。
(4)导入测试数据
- 新建数据库
- 导入SQL文件
(5)数据库中的相关概念
- 库:数据库,内部存放着所有的表、视图、索引等内容
- 表:是数据库存储数据的基本单位,由行和列组成
- 列:又称为字段,是表的基本组成单位,相当于Java类中的属性
- 行:是表的基本组成单位,具体数据,每行信息是一个整体,由固定字段构成。相当于Java中由类实例化出来的一个又一个的对象
- 主键:是表中额外新增的字段,作用为方便检索数据
三、SQL语句(1)
(1)SQL简述
- SQL:结构化查询语言,提供了对数据库数据的增删改查操作对应的处理
SQL是一种规范,也是一种国际标准,所有的关系型数据库都支持SQL,不被MySQL独有
特点
- 不区分大小写
- 注释:
- 单行:-- (–空格)
- 多行:/* */
(2)简单查询
1.查询所有字段
-- 查询所有列:select * from 表名(*:是通配符,表示所有列)
select * from employees
2.查询部分字段
select 列名1,列名2,... from 表名
- 也可以通过列出所有字段名的方式查询所有字段
- 优点:
- 效率更快
- 可读性较好
- 可维护性较高
- 缺点:
- 书写繁琐
- 优点:
-- 查询所有字段
SELECT * from employees
-- 查询员工id、员工工资
select employee_id,salary from employees
-- 列出所有字段名查询所有字段
select employee_id,salary,first_name,last_name,email,phone_number,job_id,commission_pct,manager_id,department_id,hiredate from employees
3.结果运算
+、-、*、/、%
select 列名 运算符 值 from 表名
-- 查询员工id和工资,及对工资进行加减乘除的运算
select employee_id,salary,salary+100,salary-100,salary*100,salary/100,salary%100 from employees
结果运算与非数值类型进行运算时,会先将非数值类型数据进行转换(根据第一个字符来换算,如果是数字就换成该数字,如果不是就换成0),再进行运算。
4.别名
- 对查询之后的结果起别名(只针对此次查询,不会修改表)
select 列名 as 别名,列名 as 别名,列名,... from 表名
-
别名可以省略单引号
标准SQL中没有双引号,字符串通过单引号修饰
-
as关键字可省
-- 查看员工id和员工工资
select employee_id as 员工id,salary as 工资 from employees
-- as关键字可省
select employee_id 员工id,salary 工资 from employees
5.去重
select distinct 列名1,列名2,.. from 表名
- 当去重规则为多个字段时,只有当多个字段的值都相同时才会去重
-- 查询所有的职位id(根据job_id进行去重)
select distinct job_id from employees
-- 查询所有的职位和部门id(根据job_id和department_id去重)
select distinct job_id,department_id from employees
6.分支-case when
case
when 条件1 then 结果1
when 条件2 then 结果2
...
else 其他结果
end
-- 满足when中的条件,便执行对应then中的结果,如果when都不满足,则最终执行else,从上往下判断
-- 查询员工id、员工工资、工资等级(工资>=15000 高薪,工资>=10000 中薪,工资>=5000 一般,工资<5000 低薪)
select employee_id 员工id,salary 员工工资,
case
when salary>=15000 then '高薪'
when salary>=10000 then '中薪'
when salary>=5000 then '一般'
else '低薪'
end as 薪资等级
from employees
7.查看表详情
- 表详情:当前表的字段设计
describe 表名-- describe关键字可以简写为desc
-- 查看员工表详情
describe employees
desc employees
(3)条件查询
- 能够支持的关系运算符:> < >= <= != =
1.单条件查询
select 列名... from 表名 where 筛选条件
- MySQL中对比字符串时默认不区分大小写,若想区分,则在对应字段前添加binary关键字即可
-- 查询工资大于10000的员工信息
select * from employees where salary>10000
-- 查询部门id<50的员工信息
select * from employees where department_id<50
-- 查询起始名为Steven的员工信息-不区分大小写
select * from employees where first_name='steven'
-- 区分大小写
select * from employees where binary first_name='Steven'
2.多条件查询
where 条件1 连接符 条件2
连接符:
and:表示并且,意为同时满足,相当于Java中的&&
or:表示或者,意为满足任意一个即可,相当于Java中的||
-- 查询员工工资>10000并且部门id<50的员工信息
select * from employees where salary>10000 and department_id<50
-- 查询员工id<120或者部门id=80的员工信息
select * from employees where employee_id<120 or department_id=80
3.区间查询
where 列名 [not] between 起始值 and 结束值
- 中括号中的内容意为可省
- 加上not表示不在此区间之内
-- 查询工资大于10000并且小于12000的员工信息
select * from employees where salary>=10000 and salary<=12000
-- 区间查询(在范围内):between 起始值 and 结束值
select * from employees where salary between 10000 and 12000
-- 区间查询(不在范围内):not between 起始值 and 结束值
select * from employees where salary not between 10000 and 12000
4.枚举查询
where 列名 [not] in(值1,值2,...)
-- 查询部门id是10、20、30的员工信息
select * from employees where department_id=10 or department_id=20 or department_id=30
-- 枚举查询(列举字段所有满足条件的值):列名 in(值1,值2,...)
select * from employees where department_id in(10,20,30)
-- 不在范围内:列名 not in(值1,...)
select * from employees where department_id not in(10,20,30)
5.空值查询
where 列名 is [not] null
-- 查询没有绩效的员工信息
-- 为空:列名 is null
select * from employees where commission_pct is null
-- 不为空:列名 is not null
select * from employees where commission_pct is not null
6.模糊查询
where 列名 [not] like '通配模式'
可用占位符:
%:表示n个字符
_:表示1个字符
-- 查询起始名以p开头的员工信息
select * from employees where first_name like 'p%'
-- 查询起始名中包含p的员工信息
select * from employees where first_name like '%p%'
-- 查询起始名第二个字母是a的员工信息
select * from employees where first_name like '_a%'
-- 查询起始名由5个字母组成的员工信息
select * from employees where first_name like '_____'
(4)单行函数
- 一行数据得到一个结果
-
concat
- 将多个内容合并为一个内容,相当于字符串拼接
select concat(列名1,列名2,...) from 表名
-- 以“起始名-结束名"的方式查询员工姓名 select concat(first_name,'-',last_name) from employees
-
length
- 获取数据长度
select length(列名) from 表名
- 也可用于where子句作为筛选条件
-- 获取员工起始名长度 select first_name,length(first_name) from employees -- 查询起始名长度>5的员工信息 select * from employees where length(first_name)>5
-
sysdate、now
- 获取当前系统时间
select sysdate()|now()
- dual:虚拟表,作用为语法占位,特点是从该表查询只会得到一个结果
- from dual可省
-- 查看当前系统时间 select sysdate() from dual select now() -- from dual
-
mod(值1,值2):获取值1%值2的结果。标准SQL中没有%
-- 获取10%3的结果 select mod(10,3) -- 查询所有员工工资%10000的结果 select employee_id,salary,mod(salary,10000) from employees
-
date_format
- 将日期转换为固定格式的字符串
date_format(date,'format')
-
format日期格式:
标识符 含义 %Y 年(4位) %y 年(2位) %m 月(格式为01-12) %c 月(格式为1-12) %d 天(格式为01-30|31) %e 天(格式为1-30|31) %H 小时(格式为00-23) %k 小时(格式为0-23) %i 分钟(格式为00-59) %s 秒(格式为00-59)
-- 查询各个员工入职的年份 select employee_id,hiredate,date_format(hiredate,'%Y') from employees -- 查询各个员工入职的年份和月份 select employee_id,hiredate,date_format(hiredate,'%Y-%m') from employees
-
str_to_date
-
将日期格式的字符串转换为日期类型
str_to_date('日期格式的字符串','format')
~~~sql -- 将'2022-12-06 17:32:19'转换为对应的日期类型 select str_to_date('2022-12-06 17:32:19','%Y-%m-%d %H:%i:%s')
-
(5)排序
select 列名... from 表名
[where 条件]
order by 列名 排序规则
排序规则:asc(升序,默认值)|desc(降序)
where 先于 order by 运行
from -> where ->
1.单列排序
- 排序规则只有一列
-- 根据薪资进行从高到低的排序,查看结果
select * from employees order by salary desc
-- 查询工资大于10000的员工信息并对其按照薪资升序排列
select * from employees where salary>10000 order by salary
2.多列排序
order by 列名1 排序规则1,列名2 排序规则2,...
- 规则:先根据列1排,列1相同再根据列2排,以此类推
-- 根据员工工资进行降序排列,如果薪资相同,再根据员工id升序排序
select * from employees order by salary desc,employee_id asc
四、结语
MySQL是一种功能强大的关系型数据库管理系统,可以用于各种应用场景,如Web开发、数据分析等。通过学习MySQL基础知识和SQL语句,可以更加高效地管理和维护数据库,提升工作效率。