MySQL DQL 语言
DQL(Data Query Language) :数据查询语言
重新整理笔记
基础查询
语法:
SELECT 查询列表
FROM 表名;
特点:
- 查询列表可以是:表中的字段(后面必须跟着
FROM 表名
),常量值,表达式,函数。 - 查询的结果时一个虚拟的表格。
查询表中的单个字段:
SELECT last_name
FROM employees;
必须有 From …
查询表中多个字段:
SELECT last_name, salary, email
FROM employees;
查询列表使用
,
隔开,并且顺序随意。
查询表中所有字段:
SELECT *
FROM employees;
- 把所有字段罗列出来。
- 使用
*
(*
代表所有字段)。但是,使用*
会使查询出的数据的顺序和表中的顺序一样,不够灵活。
注:
- 在做相关操作之前要先打开相应的库,所以每次执行操作直线应先写上
use 要操作的数据库;
,如:use myem;
注意加分号;
。- 如
`em`
,使用着重号`
将字段标识一下,用于区分字段还是关键字,如:关键字NAME
和字段name
。
查询常量值:
SELECT 100;
SELECT 'john';
100 |
---|
100 |
john |
---|
john |
SQL 中不区分字符和字符串,都看作是字符型,使用单引号
'
。
字符型和日期型的常量值必须使用单引号引起来,数值型不需要。
有什么作用?
查询表达式:
SELECT 100 % 98;
100 % 9 |
---|
2 |
查询函数:
SELECT VERSION();
VERSION() |
---|
5.5.62 |
调用该方法
VERSION()
获得返回值,然后显示。
必须使用SELECT
调用函数,必须有返回值。
对字段起 别名:
优点:
- 便于理解。如
SELECT 100 % 98;
执行后,列名就是100 % 98
不方便理解。 这时,就可以起一个别名: - 如果要查询的字段有重名的情况,使用别名可以区分开来。
方法一:使用 AS
关键字:
SELECT 100 % 98 AS 结果;
结果 |
---|
2 |
方法二:省略 AS
关键字,用空格:
SELECT last_name 姓,first_name 名
FROM employees;
姓 | 名 |
---|---|
K_ing | Steven |
特殊情况:
案例:查询 salary
,显示结果为:out put
。
如果别名中有特殊符号,如:空格
,
#
,这时,建议将别名加上双引号"
,单引号'
也可以。
去重
案例:查询员工表中涉及到的所有的部门编号:
SELECT department_id
FROM employees;
但这样会把表中所有的编号都打印出来,会出现很多重复编号。
使用关键字 DISTINCT
去重:
SELECT DISTINCT department_id
FROM employees;
不允许 SELECT DISTINCT a, b FROM ...;
这样,a
b
重复的数量不同。
+
的作用
案例:查询员工名和姓并连接成一个字段后显示为姓名:
SELECT last_name + first_name #wrong
AS 姓名
FROM employees;
姓名 |
---|
0 |
0 |
MySQL 中 +
仅有一个功能:运算符:
代码 | |
---|---|
SELECT 100 + 90; | 两个操作数都为数值型,则做加法运算。 |
SELECT '123' + 90; | 其中一方为字符型,则试图将字符型值转换成数值型,如果转换成功,则继续做加法运算。 |
SELECT 'joh' + 90; | 其中一方为字符型,则试图将字符型值转换成数值型,如果转换失败,则将字符型值转换成 0 。 |
SELECT null + 10; | 只要其中一方为 null ,则结果肯定为 null 。 |
拼接
CONCAT(字段名, 字段名, ...)
上题:
SELECT
CONCAT(last_name, first_name)
AS 姓名
FROM employees;
CONCAT
所拼接的字段中,如果有值为null
的,结果也会为null
。
所以要对可能为null
的字段进行特殊判断。
IFNULL(expr1, expr2);
expr1 | 要判断是否为 null 的字段名 |
expr2 | 如果 expr1 为 null 则返回 expr2 |
条件查询
SELECT 查询列表
FROM 表名
WHERE 筛选条件;
执行顺序:1.
FROM
2.WHERE
3.SELECT
分类:
- 按条件表达式(使用条件运算符)筛选:
条件运算符:>
<
=
!=
<>
<=
>=
- 按逻辑表达式筛选:
逻辑运算符:&&
||
!
或and
or
not
- 模糊查询:
like
between and
in
is null
按条件表达式筛选
案例1:查询工资 >12000 的 员工信息:
SELECT *
FROM employees
WHERE salary > 12000;
案例2:查询部门编号不等于 90 号的员工名和部门编号:
SELECT last_name, department_id
FROM employees
WHERE department_id <> 90;
支持
!=
但建议使用<>
。
按逻辑表达式筛选
逻辑运算符的作用:连接条件表达式。
&& 和 and | 两个条件都为 true ,结果为 true ,否则为 false |
|| 和 or | 只要有一个条件为 true ,结果为 true ,否则为 false |
! 和 not | 如果连接的条件本身为 false ,结果为 true ,反之为 false |
案例1:查询工资再 10000 - 20000 之间的员工名,工资,奖金:
SELECT last_name, salary, commission_pct
FROM employees
WHERE salary >= 10000 AND salary <= 20000;
案例2:查询部门编号不是在 90 - 110 之间,或者工资高于 15000 的员工信息。
SELECT *
FROM employees
WHERE department_id < 90 OR department_id > 110 OR salary > 15000
WHERE NOT(department_id >= 90 AND department_id <= 110) OR salary > 15000
模糊查询
LIKE
- 一般和通配符搭配使用,可以判断字符型数值或数值型。
- 要注意
LIKE
要匹配的字段值有没有NULL
值。如:salary LIKE '%%'
如果salary
字段有NULL
值,会读取不出来。(有问题)
字段 LIKE 要匹配的要求
字段为数值型,匹配三位的:sele LIKE '___';
通配符:
% | 任意多个字符,包括 0 个 |
_ | 任意一个字符 |
案例1:查询员工名中包含字符 a 的员工信息:
SELECT *
FROM employees
WHERE last_name LIKE '%a%';
注:
- 字符一定要加
''
。
案例2:查询员工名中第三个字符为 e
,第五个字符为 a
的员工名和工资:
SELECT last_name, salary
FROM employees
WHERE last_name LIKE '__e_a%';
案例3:查询员工名中第二个字符为下划线 _
的员工名:
这里的
_
是一个普通的符号,而不是通配符了,所以需要进行一下转义:
\_
:如:’__%’- 使用
ESCAPE
表明这是一个转义,如ESCAPE '$'
表明$
后的字符将是一个普通字符,所以使用的时侯要注意,将一个字符定义为转义字符后,这个字符将不能作为普通字符出现在当前语句中(需要$$
表明是一个$
),其他语句中可以。
SELECT last_name, salary
FROM employees
WHERE last_name LIKE '_aab%' ESCAPE 'a';
last_name | salary |
---|---|
Cabrio | 3000.00 |
BETWEEN AND
salary BETWEEN 100 AND 200
等价于salary >= 100 AND salary <= 200
,所以,注:
- 包含所有临界值。
- 两个临界值有顺序关系,不能随意调换:
NOT BETWEEN AND
案例1:查询工资再 10000 - 20000 之间的员工信息:
SELECT *
FROM employees
WHERE salary BETWEEN 10000 AND 20000;
IN
判断某字段的值是否属于
IN
列表中的某一项。
IN
列表的值类型必须一致或兼容(可以隐性转换,如:'123'
和123
)IN
列表中不支持通配符,如:WHERE job_id IN( 'IT_%');
因为此语句 等价于WHERE job_id = 'IT_%'
IN
是=
关系,所以不行。(LIKE
没有LIKE( 'IT_%')
这种用法。)
案例1:查询员工的工种编号是 IT_PROG,AD_VP,AD_PRES 中的一个员工名和工种编号:
SELECT last_name, job_id
FROM employees
WHERE job_id IN ('IT_PROG', 'AD_VP', 'AD_PRES');
IS NULL
IS NOT NULL
案例1:查询没有奖金的员工名和奖金率:
SELECT last_name, commission_pct (错的)
FROM employees
WHERE commission_pct = NULL;
结果是空的,因为不能使用
=
判断一个值是否为NULL
,要使用IS NULL
。
SELECT last_name, commission_pct
FROM employees
WHERE commission_pct IS NULL;
#WHERE commission_pct IS NOT NULL;
- 安全等于
<=>
<=>
判断是否等于,等于返回true
。
既可以判断NULL
也可以判断普通数值。
SELECT last_name, commission_pct
FROM employees
WHERE commission_pct <=> NULL;
#WHERE salary <=> 12000;
MySQL DML 语言
DML(Data Manipulation Language): 数据操纵语言
MySQL DDL 语言
DDL(Data Definition Language):数据定义语言
关于库和表的定义,如:如何创建表,删除表,如何创建库,删除库。
MySQL TCL 语言
TCL(Transaction Control Language):事务控制语言