本节主要介绍查询语句(select),包括基础查询、条件查询、模糊查询,以及一些常用函数包括:去重函数distinct、字符拼接函数concat、null判断函数ifnull。
内容都是自己学习后从SQLyog上摘抄下来的,需要sql文件的朋友可以私发,自己弄到SQLyog跑一跑就行。
/*
一. 基础查询的语法:
Select 查询列表 from 表名;
其中:
查询列表就是查询的对象,一定要先明确查询的对象是什么
特点:
(1)查询列表可以是:表中的字段、常量值、表达式、函数等
(2)查询的结果是一个虚拟的表格
*/
1. 查询字段
查询表中的单个字段
SELECT last_name FROM employees;
查询表中的多个字段(以逗号隔开)
SELECT last_name,salary,email FROM employees;
查询表中所有字段
SELECT * FROM employees;
2. 查询常量值
SELECT 100;
SELECT 'join';
3. 查询表达式
SELECT 100%98;
4. 查询函数(获取函数返回值)
SELECT VERSION();
5.起别名
/*
起别名的好处:
(1) 便于理解
(2) 如果要查询的字段有重名的情况,起别名可以更好的区分
*/
方式一:(使用AS)
对表达式起别名
SELECT 100%98 AS 结果;
SELECT last_name AS "姓",
first_name AS "名"
FROM employees;
方式二:(直接接别名,省略AS)
SELECT last_name "姓",first_name "名" FROM employees;
注意:字符最好加上双引号(或单引号),如果不加的话,当别名中含有一些特殊字符如井号和空格时会出问题
6. 去重
如:查询员工表中涉及到的所有部门编号
#去重前
SELECT department_id FROM employees;
#去重后
SELECT DISTINCT department_id FROM employees;
7. 加号(+)的作用
/*
mysql中的”+“只有一个功能:运算符
select 50+90;
(140) 两个操作数为数值型,则做加法运算
select "50"+90;
(140)其中一方为字符型,则运算会试图将字符型转化为数值型,
如果转换成功,则为数值型相加
select "john"+90;
(90)如果转换失败,则字符型转换为数值0用作计算
select null+90;
(null)只要有一方为null,则运算结果一定为null
*/
字符拼接函数CONCAT(str1,str2,…)
SELECT CONCAT("a","b","c") AS 结果;
案例1:查询员工名和姓连接成一个字段,并显示为”姓名“
SELECT CONCAT(last_name," ",first_name) AS 姓名 FROM employees;
案例2:显示出表employees的全部列,各个列之间用逗号连接,列头显示成out_put
/*
分析:
(1)各个列用逗号连接:concat
(2)列头显示为out_put:起别名
*/
SELECT
CONCAT(employee_id,",",first_name,",",last_name,",",phone_number,",",`commission_pct`) # 这里不写完了
AS out_put
FROM employees;
结果很多为null,原因在于commission_pct
中有很多值为null,只要有一个为null,拼接结果必为null。所以要使用ifnull()函数判断是否为null并将null转化为数值0进行计算
先来试一下ifnull的作用:
SELECT IFNULL(commission_pct,0) AS output FROM employees;
案例2正确写法
SELECT
CONCAT(employee_id,",",first_name,",",last_name,",",phone_number,",",IFNULL(commission_pct,0))
AS out_put
FROM employees;
/*
二. 条件查询
语法:
select
查询列表
from
表名
where
筛选条件;
分类:
1. 按条件表达式筛选:<、>、=、!=、 <>(不等于) 、<=,>=
2. 按逻辑表达式筛选(用于连接条件表达式):&&(and)、||(or)、!(not)
3. 模糊查询: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;
案例3:查询工资在10000到20000之间的员工名、工资以及奖金
SELECT
last_name,salary,commission_pct
FROM
employees
WHERE
salary>=10000 AND salary<=20000;
案例4: 查询部门编号不在90-110之间,或者工资高于15000的员工信息
SELECT
*
FROM
employees
WHERE
department_id>110 OR department_id <90 OR salary>15000;
三:模糊查询
主要关键字:
like
between and
in
is null 、is not null
1.like
特点:
(1)一般和通配符搭配使用,通配符**%**表示任意多的字符,通配符_(下划线)表示任意单个字符
*/
案例1:查询员工名中包含字符a的员工信息(这里的包含并不是精确匹配,只要包含就行,所以是模糊匹配)
SELECT
*
FROM
employees
WHERE
last_name LIKE "%a%";
案例2:查询员工名中第三个字符为s,第五个字符为i的员工名和工资
SELECT
last_name,salary
FROM
employees
WHERE
last_name LIKE "__s_i%";
#案例3:查询员工名中第二个字符为下划线_的员工名
SELECT
last_name
FROM
employees
WHERE
last_name LIKE "_\_%"; # \为转义字符
#last_name LIKE "_$_%" escape '$';
这里可以使用任意字符来充当转义符,只要在后面用escape指明即可
2. between and
案例3:查询工资在10000到20000之间的员工名、工资以及奖金
SELECT
last_name,salary,commission_pct
FROM
employees
WHERE
salary>=10000 AND salary<=20000;
SELECT
last_name,salary,commission_pct
FROM
employees
WHERE
salary BETWEEN 10000 AND 20000;
注意:between and 中间的数值不能随意交换位置
3. in
/*
含义:判断某字段的值是否属于in列表中的某一项
特点:
(1)提高语句简介度
(2)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
案例:查询没有奖金的员工名和奖金率
SELECT
last_name,commission_pct
FROM
employees
WHERE
commission_pct IS NULL; # 不能用”= null“,=或<>不能用于判断null值
#commission_pct IS NOT NULL; # 判断不为NULL的值
补充
安全等于: <=>
用法: 既可以判断一般数值,也可以判断null
缺点:可读性较差
SELECT
last_name,commission_pct
FROM
employees
WHERE
commission_pct <=> NULL;
练习:查询员工号为176的员工的姓名、部门编号以及年薪
分析:注意年薪的计算包括奖金以及奖金率中包含空值
SELECT
last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
employees
WHERE
employee_id=176;