(1)算术运算符:+ - * /(除也可以写成 div) %(取模可以写成 mod) (2)比较运算符:= > >= < <= !=(不等于还可以写成<>) <=>(安全等于) (3)逻辑运算符:&&(逻辑与也可以写成 and) ||(逻辑或也可以写成 or) not(逻辑非) (4)范围:表达式 between … and … (也可以写成 表达式>=… and 表达式 <=…) 表达式 not between … and …(也可以写成 表达式<… || 表达式 >…) (5)集合:in (值,值,值…) not in(值,值,值…) (6)模糊查询:LIKE NOT LIKE,通配符:%表示 0-n 个字符,_下划线代表一个字符 (7)位运算符:&(按位与) |(按位或)^(按位异或)~(按位取反)>>(右移)<<(左移) (8)NULL 值判断,is null 或 is not null,如果使用 null=null,null<>null,null=0,null<>0,null=false 等都不对。 不过 xxx is null 可以使用 xxx <=> null ,xxx is not null 可以写成 not xxx <=> null 结论:所有的运算符遇到 NULL 结果都是 NULL,除了<=>
作用:从 2 张或多张表中,取出有关联的数据。
关联查询一共有几种情况:
内连接:INNER JOIN 、CROSS JOIN外连接:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)、全外连接(FULL OUTER JOIN)自连接:当 table1 和 table2 本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。说明: (1)连接 n 个表,至少需要 n-1 个连接条件。 例如:连接三个表,至少需要两个连接条件。 (2)当两个关联查询的表如果有字段名字相同,并且要查询中涉及该关联字段,那么需要使用表名前缀加以区分 (3)当如果表名比较长时,可以给表取别名,简化 SQL 语句
定义:将两(或多)个表的所有行进行组合,连接后的行数为两(或多)个表的乘积数。 在 MySQL 中如下情况会出现笛卡尔积,主要是因为缺少关联条件或者关联条件不准确。
注:外连接必须写关联条件,否则报语法错误。
#查询员工姓名和所在部门名称 SELECT ename,dname FROM t_employee,t_department; SELECT ename,dname FROM t_employee INNER JOIN t_department; SELECT ename,dname FROM t_employee CROSS JOIN t_department; SELECT ename,dname FROM t_employee JOIN t_department;表连接的约束条件可以有三种方式:WHERE, ON, USING。
WHERE:适用于所有关联查询ON:只能和 JOIN 一起使用,只能写关联条件。虽然关联条件可以并到 WHERE 中和其他条件一起写,但分开写可读性更好。USING:只能和 JOIN 一起使用,而且要求 两个关联字段在关联表中名称一致,而且只能表示关联字段值相等。 #把关联条件写在 where 后面 SELECT ename,dname FROM t_employee,t_department WHERE t_employee.dept_id=t_department.did; #把关联条件写在 on 后面,只能和 JOIN 一起使用 SELECT ename,dname FROM t_employee INNER JOIN t_department ON t_employee.dept_id=t_department.did; SELECT ename,dname FROM t_employee CROSS JOIN t_department ON t_employee.dept_id=t_department.did; SELECT ename,dname FROM t_employee JOIN t_department ON t_employee.dept_id=t_department.did; 把关联字段写在 using()中,只能和 JOIN 一起使用,而且两个表中的关联字段必须名称相同,而且只能表示= #查询员工姓名与基本工资 SELECT ename,basic_salary FROM t_employee INNER JOIN t_salary USING(eid); n 张表关联,需要 n-1 个关联条件 #查询员工姓名,基本工资,部门名称 SELECT ename,basic_salary,dname FROM t_employee,t_department,t_salary WHERE t_employee.dept_id=t_department.did AND t_employee.eid=t_salary.eid; SELECT ename,basic_salary,dname FROM t_employee INNER JOIN t_department INNER JOIN t_salary ON t_employee.dept_id=t_department.did AND t_employee.eid=t_salary.eid;有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。
格式:
隐式:SELECT [cols_list] from 表 1,表 2 where [condition]显式:SELECT [cols_list] from 表 1 INNER JOIN 表 2 ON [关联条件] where [其他筛选条件] SELECT [cols_list] from 表 1 CROSS JOIN 表 2 ON [关联条件] where [其他筛选条件] SELECT [cols_list] from 表 1 JOIN 表 2 ON [关联条件] where [其他筛选条件] #查询员工姓名和所在部门名称 SELECT ename,dname FROM t_employee,t_department WHERE t_employee.dept_id=t_department.did; SELECT ename,dname FROM t_employee INNER JOIN t_department ON t_employee.dept_id=t_department.did; SELECT ename,dname FROM t_employee CROSS JOIN t_department ON t_employee.dept_id=t_department.did; SELECT ename,dname FROM t_employee JOIN t_department ON t_employee.dept_id=t_department.did; #查询员工姓名,基本工资,部门名称 SELECT ename,basic_salary,dname FROM t_employee,t_department,t_salary WHERE t_employee.dept_id=t_department.did AND t_employee.eid=t_salary.eid; SELECT ename,basic_salary,dname FROM t_employee INNER JOIN t_department INNER JOIN t_salary ON t_employee.dept_id=t_department.did AND t_employee.eid=t_salary.eid;外连接分为:
左外连接(LEFT OUTER JOIN),简称左连接(LEFT JOIN)。右外连接(RIGHT OUTER JOIN),简称右连接(RIGHT JOIN)。全外连接(FULL OUTER JOIN),简称全连接(FULL JOIN)。当 table1 和 table2 本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询。
#查询员工姓名以及领导姓名,仅显示有领导的员工 SELECT emp.ename,mgr.ename FROM t_employee AS emp, t_employee AS mgr WHERE emp.mid = mgr.eid; #查询员工姓名以及领导姓名,仅显示有领导的员工 SELECT emp.ename,mgr.ename FROM t_employee AS emp INNER JOIN t_employee AS mgr ON emp.mid = mgr.eid; #查询所有员工姓名及其领导姓名 SELECT emp.ename,mgr.ename FROM t_employee AS emp LEFT JOIN t_employee AS mgr ON emp.mid = mgr.eid;