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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Steriles_/article/details/82495688
/*
select 查询列表 from 表名;

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

*/

SELECT * FROM student_file

特点:

1、查询列表可以是:表中的字段、常量值、表达式、函数

2、查询到的结果是一个虚拟的表格

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

SELECT last_name FROM employees

功能2、查询表中的多个字段(不同字段之间用逗号隔开)

SELECT last_name , salary , email FROM employees

功能3、查询表中的所有字段(*代表所有的字段,但是顺序是跟原表里的字段一样的

SELECT * FROM employees

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

SELECT 100;

SELECT 'join';

功能5、查询表达式

-- 结果为2
SELECT 100%98;

功能6、查询函数

SELECT VERSION();

显示结果

功能7、去重查询

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、按条件表达式筛选

-- 案例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;

功能2、按逻辑表达式筛选

-- 案例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;

功能3、模糊查询

①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;

接下来介绍排序查询

特点:

1、ASC代表的是升序,DESC代表的是降序,如果不写则默认为升序;

2、ORDER BY 子句中可以支持单个字段、多个字段、表达式、函数、别名作为条件的查询

3、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的查询结果如下:箭头方向表示从高到低的方向。


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

SELECT NAME FROM employees;

SELECT `name` FROM employees;

二、起别名

方式一   使用AS

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

方式二   使用空格

SELECT lase_name 姓, first_name 名 FROM employees;

如果起别名遇到别名中有特殊符号(比如空格、井号等),建议用双引号将别名括起来,单引号也可以

起别名优点:

1、便于理解;

2、如果要查询的字段有重名的情况,使用别名可以区分开来

执行结果

                      

三、加号 + 的作用

在java中的 + 号:

1、运算符,两个操作数都为数值型;

2、连接符,只要有一个操作数为字符串

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

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

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

                   如果转换成功,则继续做加法运算,

                   如果转换失败,则将字符型数值转换成0。

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

-- 结果为 190
SELECT 100 + 90;

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

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

-- 结果为 null
SELECT null + 90;

四、在mysql中将不同字段进行拼接

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

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

执行结果

                    

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

SELECT IFNULL (commission_pct,0)

五、安全等于  <=>

缺点:可读性不强。

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

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

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

六、经典面试题

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

SELECT * FROM employees;

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

答案:不一样!如果判断的字段有NULL值,那么两者的结果就不一样了。

猜你喜欢

转载自blog.csdn.net/Steriles_/article/details/82495688
今日推荐