/* 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值,那么二者的结果就不同了。