(二)MySQL基础——基础查询、条件查询、排序查询

/*
select 查询列表 from 表名;

相似于:System.out.println(要打印的东西);

*/

SELECT * FROM student_file

特色:java

一、查询列表能够是:表中的字段、常量值、表达式、函数mysql

二、查询到的结果是一个虚拟的表格面试

 

功能一、查询表中的单个字段sql

SELECT last_name FROM employees

功能二、查询表中的多个字段(不一样字段之间用逗号隔开)json

SELECT last_name , salary , email FROM employees

功能三、查询表中的全部字段(*表明全部的字段,可是顺序是跟原表里的字段同样的安全

SELECT * FROM employees

功能四、查询常量值(不用加FROM关键字,只是一个普通的值 ),且不区分字符、字符串(用单引号括起来)函数

SELECT 100;

SELECT 'join';

功能五、查询表达式spa

-- 结果为2
SELECT 100%98;

功能六、查询函数3d

SELECT VERSION();

显示结果code

功能七、去重查询

SELECT DISTINCT department_id FROM employees

以上涉及到的是基础查询部分,下面展开条件查询的部分

/*
select 
    查询列表 
from 
    表名
where
    筛选条件;
*/

SELECT * FROM student_file WHERE student.number=1;

 分类:

(1)按条件表达式筛选

MySQL中条件运算符:>(大于)  <(小于)  =(等于)  !=(不等于)  <>(不等于) >=(大于等于)  <=(小于等于)

(2)按逻辑表达式筛选

MySQL中逻辑运算符:&&(与) ||(或) !(非)但更推荐其标准中的and(与)  or(或)  not(非)

做用:用于链接条件表达式

&&和and:两个条件都为true,结果为true,反之为false

||或or:只要有一个条件为true,结果为true,反之为false

!或not:若是链接的条件自己为false,结果为true,反之为false

(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;
-- 或者写成如下这种格式,也是对的
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;
-- 或者用下面这种逻辑判断式去筛选
SELECT * FROM employees WHERE NOT(department_id>=90 AND department_id<=110)OR salary>15000;

功能三、模糊查询

①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 '__n_l%';

-- 案例3:查询员工名中第二个字符为_的员工名
SELECT last_name FROM employees WHERE  last_name LIKE '_\_%';

各案例中,由于是字符型,因此要用单引号。案例3中,将特殊符号_进行转义,支持\_表达,或者利用ESCAPE关键词用任意字符指定为转义字符

-- 案例3:查询员工名中第二个字符为_的员工名
SELECT last_name FROM employees WHERE  last_name LIKE '_$_%' ESCAPE '$';

显示案例2中查询结果 和 案例3中查询结果

                    

②between and 

使用between and能够提升语句的简洁度,包含两个临界值,但两个临界值不要调换顺序,其彻底等价于>=左边的值且<=右边的值

-- 案例1:查询员工编号在100到120之间的员工信息
SELECT * FROM employees WHERE employee_id >= 100 AND employee_id <= 120;

-- 使用between and
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;

③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';

-- 用in来简化查询语句
SELECT 
    last_name,job_id     
FROM 
    employees 
WHERE 
    job_id IN('IT_PROG','AD_VP','AD_PRES');

④is null

注意细节:= 或者< >不能用于判断null值,is null或 is not null 能够判断null值;is 也不能用来作其余判断。

-- 案例:查询没有奖金的员工名和奖金率(错误示范)
SELECT last_name,commission_pct FROM employees WHERE commission_pct = 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;

接下来介绍排序查询

特色:

一、ASC表明的是升序,DESC表明的是降序,若是不写则默认为升序;

二、ORDER BY 子句中能够支持单个字段、多个字段、表达式、函数、别名做为条件的查询

三、ORDER BY 子句通常是放在查询语句的最后位置,LIMIT子句除外。

/*  排序查询


语法:
SELECT 查询列表 FROM WHERE 筛选条件 ORDER BY 排序列表  [ASC 升序 DESC 降序]
*/

-- 案例:查询员工信息,要求工资从高到低排序
SELECT * FROM employees ORDER BY salary DESC;

-- 案例:查询员工信息,要求工资从低到高排序
SELECT * FROM employees ORDER BY salary ASC;
-- 默认为升序
SELECT * FROM employees ORDER BY salary;

排序查询里面能够按照表达式排序、按照别名排序、按照函数排序、按多个字段查询等。

-- 案例1:按年薪的高低显示员工的信息和年薪【按表达排序】
SELECT 
    * , salary*1*(1+IFNULL(commission_pct,0)) 年薪 
FROM 
    employees 
ORDER BY 
    salary*1*(1+IFNULL(commission_pct,0)) DESC;

-- 案例2:按年薪的高低显示员工的信息和年薪【按别名排序】
SELECT 
    * , salary*1*(1+IFNULL(commission_pct,0)) 年薪 
FROM 
    employees 
ORDER BY 
    年薪 DESC;

-- 案例3:按姓名的长度显示员工的姓名和工资【按函数排序】
SELECT 
    LENGTH(last_name) 字节长度, last_name,salary
FROM 
    employees 
ORDER BY 
    LENGTH(last_name) DESC;

-- 案例4:查询员工信息,要求先按工资升序,再按员工编号降序【按多个字段排序】
SELECT * FROM employees ORDER BY salary ASC, employee_id DESC;

案例4的查询结果以下:箭头方向表示从高到低的方向。


1、着重号‘  `  ’,是用来区分字段和关键字 

SELECT NAME FROM employees;

SELECT `name` FROM employees;

2、起别名

方式一   使用AS

SELECT 100%98 AS 结果;
SELECT last_name AS 姓, first_name AS 名 FROM employees;

方式二   使用空格

SELECT lase_name 姓, first_name 名 FROM employees;

若是起别名遇到别名中有特殊符号(好比空格、井号等),建议用双引号将别名括起来,单引号也能够

 

起别名优势:

一、便于理解;

二、若是要查询的字段有重名的状况,使用别名能够区分开来

 

执行结果

                      

3、加号 + 的做用

在java中的 + 号:

一、运算符,两个操做数都为数值型;

二、链接符,只要有一个操做数为字符串

在MySQL中的 + 号:仅仅只有一个功能——做运算符。

(1)两个操做数都为数值型,则作加法运算;

(2)只要其中一方为字符型,就会试图将字符型数值转换成数值型;

                   若是转换成功,则继续作加法运算,

                   若是转换失败,则将字符型数值转换成0。

(3)只要其中一方为null,则结果确定为null。

-- 结果为 190
SELECT 100 + 90;

-- 结果为 213
SELECT '123' + 90;

-- 结果为 90
SELECT 'json' + 90;

-- 结果为 null
SELECT null + 90;

4、在mysql中将不一样字段进行拼接

SELECT CONCAT('a','b','c') AS 结果;

SELECT CONCAT(last_name , first_name) AS 姓名 FROM employees;

执行结果

                    

若是拼接的时候遇到字段的值为空的状况,那么就要用到 IFNULL 关键字,第一个参数存放可能值有null的字段,第二个是当该字段的值为null时要返回的值。

SELECT IFNULL (commission_pct,0)

5、安全等于  <=>

缺点:可读性不强。

-- 案例:查询工资为12000的员工信息
SELECT last_name,salary FROM employees WHERE salary <=> 12000;

IS NULL:仅仅能够判断NULL值,可读性较高,建议会用。

<=>:既能够判断NULL值,又能够判断普通的数值,可读性较低。

6、经典面试题

试问:如下两个SQL语句执行结果是否同样?

SELECT * FROM employees;

SELECT * FROM employees WHERE commission_pct LIKE '%%' AND last_name LIKE '%%';

答案:不同!若是判断的字段有NULL值,那么二者的结果就不同了。