MySQL语法规范
- 不区分大小写(但建议关键字大写,表名、列名小写)
- 每句话用;或\g结尾
- 各子句一般分行写
- 关键字不能缩写也不能分行
- 用缩进提高语句的可读性
- 注释
单行注释:#注释文字
单行注释:-- 注释文字
多行注释:/* 注释文字 */
SQL的语言分类
DQL(Data Query Language):数据查询语言
select
DML(Data Manipulate Language):数据操作语言
insert 、update、delete
DDL(Data Define Languge):数据定义语言
create、drop、alter
TCL(Transaction Control Language):事务控制语言
commit、rollback
数据处理之查询
基本SELECT 语句
-
SELECT 标识选择哪些列。
-
FROM 标识从哪个表中选择。
注意
-
SQL 语言大小写不敏感。
-
SQL 可以写在一行或者多行
-
关键字不能被缩写也不能分行
-
各子句一般要分行写。
-
使用缩进提高语句的可读性。
列的别名
-
重命名一个列。
-
便于计算。
-
紧跟列名,也可以在列名和别名之间加入关键字‘AS’,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。
字符串
-
字符串可以是SELECT 列表中的一个字符,数字,日期。
-
日期和字符只能在单引号中出现。
-
每当返回一行时,字符串被输出一次。
显示表结构
- 使用DESCRIBE 命令,表示表结构
#进阶1:基础查询
/*语法:
SELECT 要查询的东西
【FROM 表名】;
特点:
①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
②要查询的东西 可以是常量值、可以是表达式、可以是字段、可以是函数
*/
USE myemployees;
#1.查询表中的单个字段
SELECT
last_name
FROM
employees;
#2.查询表中的多个字段
SELECT
last_name,
salary,
email
FROM
employees;
#3.查询表中所有的字段
#方式一:
SELECT
`first_name`,
`last_name`,
`email`,
`phone_number`,
`job_id`,
`salary`,
`commission_pct`,
`manager_id`,
`department_id`,
`hiredate`
FROM
employees;
#方式二:
SELECT
*
FROM
employees;
#4.查询常量值
SELECT
100;
SELECT
'john';
#5.查询表达式
SELECT
100 % 98;
#6.查询函数
SELECT
VERSION ();
#7.起别名
/*
①便于理解
②如果要查询的字段有重名的情况,使用别名可以区分开来
*/
#方式一 使用as:
SELECT
100 % 98 AS 结果;
SELECT
last_name AS 姓,
first_name AS 名
FROM
employees;
#方式二 使用空格:
SELECT
last_name 姓,
first_name 名
FROM
employees;
#案例:查询salary,显示结果为out put
SELECT
salary "out put"
FROM
employees;
#8.去重
#案例:查询员工表中涉及到的所有的部门编号
SELECT DISTINCT
department_id
FROM
employees;
#9.+的作用
/*
仅仅只有一个功能:运算符
*/
#案例:查询员工名和姓连接成一个字段,并显示为 姓名
SELECT
CONCAT ('a', 'b', 'c') AS 结果;
SELECT
CONCAT (last_name, ' ', first_name) AS 姓名
FROM
employees;
/*
测 试
1. 下面的语句是否可以执行成功
select last_name , job_id , salary as sal
from employees;
2. 下面的语句是否可以执行成功
select * from employees;
3. 找出下面语句中的错误
select employee_id , last_name,
salary * 12 “ANNUAL SALARY”
from employees;
4. 显示表departments的结构,并查询其中的全部数据
5. 显示出表employees中的全部job_id(不能重复)
6. 显示出表employees的全部列,各个列之间用逗号连接,列头显示成OUT_PUT
*/
#3.
SELECT
employee_id,
last_name,
salary * 12 "ANNUAL SALARY"
FROM
employees;
#4.显示表departments的结构,并查询其中的全部数据
DESC departments;
SELECT
*
FROM
departments;
#5.显示出表employees中的全部job_id(不能重复)
SELECT DISTINCT
job_id
FROM
employees;
#6.显示出表employees的全部列,各个列之间用逗号连接,列头显示成OUT_PUT
SELECT
CONCAT (
`first_name`,
`last_name`,
`job_id`,
IFNULL (`commission_pct`, 0)
) AS OUT_PUT
FROM
employees;
条件查询
过滤
-
使用WHERE 子句,将不满足条件的行过滤掉。
-
WHERE 子句紧随FROM 子句。
BETWEEN
- BETWEEN 运算来显示在一个区间内的值
IN
使用IN运算显示列表中的值。
LIKE
-
使用LIKE 运算选择类似的值
-
选择条件可以包含字符或数字:
-
% 代表零个或多个字符(任意个字符)。
-
_ 代表一个字符。
-
‘%’和‘-’可以同时使用。
NULL
- 使用IS (NOT) NULL 判断空值。
AND
- AND要求并的关系为真。
OR
- OR 要求或关系为真。
#条件查询:根据条件过滤原始表的数据,查询到想要的数据
/*
语法:
select
要查询的字段|表达式|常量值|函数
from
表
where
条件 ;
分类:
一、条件表达式
示例:salary>10000
条件运算符:
> < >= <= = != <>
二、逻辑表达式
示例:salary>10000 && salary<20000
逻辑运算符:
and(&&):两个条件如果同时成立,结果为true,否则为false
or(||):两个条件只要有一个成立,结果为true,否则为false
not(!):如果条件成立,则not后为false,否则为true
三、模糊查询
示例:last_name like 'a%'
like
between
in
is null
*/
#一,按条件表达式筛选
#案例1:查询工资大于12000的员工信息
SELECT
*
FROM
employees
WHERE salary > 12000;
#案例2:查询部门编号不等于90号的员工名和部门编号
SELECT
last_name,
department_id
FROM
employees
WHERE department_id <> 90;
#二,按逻辑表达式筛选
#案例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;
#三,模糊查询
/*
like
特点:
①一般和通配符搭配使用
通配符:
% 任意多个字符,包含0个字符
_ 任意单个字符
between
in
is null
*/
#1.like
#案例1:查询员工名中包含字符a的员工信息
SELECT
*
FROM
employees
WHERE last_name LIKE '%a%';
#案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
SELECT
last_name,
salary
FROM
employees
WHERE last_name LIKE '__n_l%';
#案例3:查询员工名中第二个字符为_的员工名
SELECT
last_name
FROM
employees #where last_name like '_\_%';
WHERE last_name LIKE '_$_%' ESCAPE '$';
# ESCAPE 指定'$' 为转义字符
#2.between and
/*
①使用between and 可以提高语言的简洁度
②包含临界值
③两个临界值不要调换顺序
*/
#案例一:查询员工编号在110-120之间的员工信息
SELECT
*
FROM
employees
WHERE employee_id BETWEEN 110
AND 120;
#3.in
/*
含义:判断某字段中的值是否属于in列表中的某一项
①使用in提高语句简洁句
②in列表的值类型必须统一或者兼容
③in列表中的值不支持通配符
*/
#案例一:查询员工的工种编号是IT_PROG,AD_VP,AD_PRES中的一个的员工名和工种编号
SELECT
last_name,
job_id
FROM
employees
WHERE job_id = 'IT_PROG'
OR job_id = 'AD_VP'
OR job_id = 'AD_PRES';
SELECT
last_name,
job_id
FROM
employees
WHERE job_id IN ('IT_PROG', 'AD_VP', 'AD_PRES');
#4.is null
/*
=或者<>不能用于判断null值
is null 或者 is not null 可以用于判断null值
*/
#案例一:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE commission_pct IS NULL;
#案例二:查询有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE commission_pct IS NOT NULL;
#安全等于: <=>
#案例一:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE commission_pct <=> NULL;
#案例二:查询工资为12000的员工信息
SELECT
*
FROM
employees
WHERE salary <=> 12000;
/*
is null: 仅仅可以判断null值,可读性较高,建议使用
<=>:既可以判断null,又可以判断普通的数值,可读性较低
*/
排序查询
ORDER BY子句
- 使用ORDER BY 子句排序
- ASC(ascend): 升序
- DESC(descend): 降序
- ORDER BY 子句在SELECT语句的结尾。
#排序查询
/*
语法:
select 查询列表
from 表
【where 筛选条件】
order by 排序列表【asc|desc】
特点:
1、asc代表的是升序,可以省略
desc代表的是降序
2、order by子句可以支持 单个字段、别名、表达式、函数、多个字段
3、order by子句在查询语句的最后面,除了limit子句
*/
#案例1:查询员工信息,要求工资从高到低排序
SELECT
*
FROM
employees
ORDER BY salary DESC;
#从低到高
SELECT
*
FROM
employees
ORDER BY salary ASC;
#asc可以省略
#案例2:查询部门编号>=90的员工信息,按入职时间的先后进行排序
SELECT
*
FROM
employees
WHERE department_id >= 90
ORDER BY hiredate ASC;
#3、按表达式排序
#案例3:查询员工信息 按年薪降序
SELECT
*,
salary * 12 * (1+ IFNULL (commission_pct, 0)) AS 年薪
FROM
employees
ORDER BY salary * 12 * (1+ IFNULL (commission_pct, 0)) DESC;
#4、按别名排序
#案例4:查询员工信息 按年薪升序
SELECT
*,
salary * 12 * (1+ IFNULL (commission_pct, 0)) AS 年薪
FROM
employees
ORDER BY 年薪 ASC;
#5、按函数排序
#案例5:按姓名的长度显示员工的姓名和工资
SELECT
LENGTH (last_name) 姓名长度,
last_name,
salary
FROM
employees
ORDER BY LENGTH (last_name) DESC;
#6、按多个字段排序
#案例:查询员工信息,要求先按工资升序,再按员工编号降序
SELECT
*
FROM
employees
ORDER BY salary ASC,
employee_id DESC;