本系列文章将重点整理MySQL的基本操作,所有的操作都基于以下的数据库进行:myemployees与girls数据库。数据库 myemployees 包括员工表employees、部门表departments、地理位置表locations、工种表jobs以及工资等级表job_grades。数据库 girls 包括管理员表admin、女神表beauty与男神表boys。
建表的SQL脚本网盘可取:https://pan.baidu.com/s/12Z4iJ1Bc6WyopBawnqt41w 提取码:qijf
数据库相关概念
一、数据库的好处
- 可以持久化数据到本地
- 结构化查询
二、数据库的常见概念 ★
- DB:数据库,存储数据的容器
- DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
- SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言
三、数据库存储数据的特点
- 数据存放到表中,然后表再放到库中
- 一个库中可以有多张表,每张表具有唯一的表名用来标识自己
- 表中有一个或多个列,列又称为“字段”,相当于java中“属性”
- 表中的每一行数据,相当于java中“对象”
四、常见的数据库管理系统
- mysql、oracle、db2、sqlserver
MySQL介绍
一、MySQL的背景
- 前身属于瑞典的一家公司,MySQL AB
- 08年被sun公司收购
- 09年sun被oracle收购
二、MySQL的优点 ★
- 开源、免费、成本低
- 性能高、移植性也好
- 体积小,便于安装
三、MySQL的安装
- MySQL属于c/s架构的软件,一般来讲安装服务端
- 分为企业版、社区版,我们安装的都是社区版;共有5.5,5.6,5.7,8.0等版本。
常用命令
1.将MySQL添加到Windows服务,启/停MySQL服务:
net start mysql; (net stop mysql)
2. 登录mysql
mysql -h localhost -P 3306 -u root -p123456
该语句注意事项:
- 这里的端口号参数-P必须用大写,小写的会报错
- 用户名-u root这里的空格有没有都是可以的
- 密码-p123456 这里要么就是不用空格,要么就是-p之后换行,改用隐藏密码的方式,不能在-p和密码之间加空格
- 本地简单登录:mysql -uroot -p
3. 在一个数据库中查看另一个数据库中的所有表
show tables from 【数据库名】;
4. 查看当前的数据库
select databases();
5. 查看数据库的版本
select version();(登录到mysql服务端)
mysql --version;(没有登录到mysql服务端)
mysql -V;(没有登录到mysql服务端)
6. 删除某条记录
delete from 【表名】 where 【+条件,如:where id = 1】;
MySQL的语法规范
- 不区分大小写,但建议关键字大写,表名、列名小写
- 每条命令最好用分号结尾(DOS命令行必须,可视化工具最好加分号)
- 每条命令根据需要,可以进行缩进或换行
- 注释:单行注释:#注释文字,或者–注释文字
多行注释和java中相同:/* 注释文字*/
查询
基础查询
MySQL的可视化工具有很多,个人常用的有Navicat和MySQL Workbench,其实还有一个工具SQLyog
,该工具对于以上规范的支持比较友好,自动将关键字大写,并且在查询某字段时,可以直接通过“哪里不会点哪里”的方式进行查询,避免了手动输入。如下图,字段的输入,可以直接通过双击字段的方式。
上图中,字段的着重号为自动添加,也可以去掉,没有影响。
- 查询常量(查询常量类似于打印)
select 【+常量值】,如:
select 100;
select ‘Jack’; - 查询表达式
select 100*3;
select 100%98; - 查询函数
select version();
select database(); - 起别名(要查询的字段有重名的情况,可以用别名来区分)
方式一:使用as
select last_name as 姓, first_name as 名 from employees;
方式二:使用空格
select last_name 姓, first_name 名 from employees;
方式三:可加双引号或单引号,推荐双引号
select salary as “out put” from employees; - 去重
select distinct ‘department_id’ from employees; - 连接符
select concat (‘a’,‘b’,‘c’) as 结果;
select concat (last_name, first_name) as 姓名 from employees; - 是否为空
select ifnull(commission_pct, 0) as 奖金率, commission_pct from employees; #若奖金率为空,则将查询的奖金率置为0
加号“+”的作用
java中的+号
1)运算符:两个操作数都为数值型;
2)连接符:只要一个操作数为字符串。
mysql中的+号
仅仅只有一个功能:运算符
select 100+99; #两个操作数都为数值型,则做加法运算
select ‘123’+90; #其中一方为字符型,试图将字符型数值转换为数值型;如果转换成功,则继续做加法运算
select ‘jack’+12; #如果转换失败,则将字符型数值转换成0
select null+10; #只要其中一方为null,则结果肯定为null
条件查询
语法:
select 查询列表 from 表名 where 筛选条件;
分类:
一、按条件表达式筛选
简单条件运算符:>, < , =, !=, <>, >=, <=
二、按逻辑表达式筛选
逻辑运算符: && || !
and or not (推荐)
三、模糊查询
复杂一点的条件运算符:like, between and, in, is null, is not null
like的通配符:
%,匹配0个或多个字符;
_,匹配单个字符;
\,转义符,或者使用escape关键字
between and:判断某字段的值是否落在某个范围内,包含边界值;两个值不能颠倒
in:判断某字段的值是否属于in列表中的某一项,使用in提高了语句简洁度;in列表的值类型必须是一致或兼容,如‘123’与123;in列表中的值不能使用通配符,因为查询条件相当于“=”,而不是“like”
is null:用于判断某字段值是否为null,我们不能使用“= null”或者“<> null”来进行查询,后者查询不出结果。
<=>:安全等于,既可以用来判断null值,也可以用来判断是否等于普通数值,缺点是:可读性比较差,推荐使用is null。
案例1(逻辑运算符与between and):查询部门编号不是在90到110之间,或者工资高于15000的员工信息
SELECT
*
FROM
employees
WHERE
NOT (department_id >= 90 AND department_id <= 110)
OR salary > 15000;
SELECT
*
FROM
employees
WHERE
NOT (department_id BETWEEN 90 AND 110)
OR salary > 15000;
案例2(通配符%与_):查询员工中第三个字符为n,第五个字符为l的员工名和工资(别忘了最后用%通配符)
#案例2
SELECT
last_name,
salary
FROM
employees
WHERE
last_name LIKE '__n_l%';
案例3(转义符\与escape):查询员工名中第二个字符为_的员工名
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_\_%';#\转义
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_$_%' ESCAPE '$';#将$作为转义符(推荐)
案例4(in条件运算符):查询员工的工种编号是IT_PROT, AD_VP, AD_PRES中的一种的员工名和工种编号
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id = 'IT_PROT' OR job_id = 'AD_VP' OR job_id = 'AD_PRES';
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id IN ('IT_PROT','AD_VP','AD_PRES');
案例5(is null):查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NULL;
案例6(ifnull):查询员工号为176的员工的姓名和部门和年薪
SELECT
last_name,
department_id,
salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
employees;
经典面试题
试问一下语句的结果是否一样,并说明原因?
SELECT * FROM employees;
SELECT * FROM employees WHERE commission_pct LIKE '%%' AND last_name LIKE '%%';
答:不一样,因为第二条语句判断的字段有null值,两者求得的交集;
若改为,以下语句则结果一样,因为求的是并集,有不是null的字段。
SELECT * FROM employees WHERE commission_pct LIKE '%%' OR last_name LIKE '%%' OR employee_id LIKE '%%';
基础查询总结
一、语法
select 查询列表 from 表名;
二、特点
- 查询列表可以是
字段、常量、表达式、函数
,也可以是多个 - 查询结果是一个虚拟表
三、示例
-
查询单个字段
select 字段名 from 表名; -
查询多个字段
select 字段名, 字段名 from 表名; -
查询所有字段
select * from 表名 -
查询常量
select 常量值;
注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要 -
查询函数
select 函数名(实参列表); -
查询表达式
select 100/1234; -
起别名
①as 查询多个时可读性好
②空格 查询单个时简洁 -
去重
select distinct 字段名 from 表名; -
加号 +
作用:做加法运算
select 数值+数值; 直接运算
select 字符+数值;先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算
select null+值;结果都为null -
【补充】concat函数
功能:拼接字符
select concat(字符1,字符2,字符3,…); -
【补充】ifnull函数
功能:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值
select ifnull(commission_pct,0) from employees; -
【补充】isnull函数
功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0
条件查询总结
一、语法
select 查询列表 from 表名 where 筛选条件
二、筛选条件的分类
- 简单条件运算符
> < = <> != >= <= <=>安全等于 - 逻辑运算符
&& and
|| or
! not - 模糊查询
like:一般搭配通配符使用,可以判断字符型或数值型
通配符:%任意多个字符,_任意单个字符
between and
in
is null /is not null:用于判断null值 - 两者的比较 is null PK <=>安全等于
普通类型的数值 | null值 | 可读性 | |
---|---|---|---|
is null | × | √ | √ |
<=> | √ | √ | × |