select语句实现
sql文件:atguigudb.sql · moonshuo/fruit stand - 码云 - 开源中国 (gitee.com)
select基本语句
列别名
1 | #下面的三种方式别名方式都可以进行 |
去除重复行
1 | #查询一共有多少个部门id |
注意,如果此时要查询每一个部门下面的工资
1 | #执行这个语句会报错,因为salary拥有107行,而DISTINCT department_id,却有17行,无法进行匹配 |
但是注意,如果我将上面的顺序换一换,得到的是每用一个部门下面,不同的工资水平,这里会首先匹配DISTINCT department_id
1 | SELECT DISTINCT department_id,salary FROM employees |
空值参与运算
空值这里指的是null,并不是“”或者0
如果空值参与运算,则运算的结果一定为空
现在我们需要查询一个员工一年的工资
1 | #在这里,commission_pct表示绩效提升倍数,其实当其为null的时候,我们是要将其当作0来看待,但是这里却出现了问题,这也说明了null与0和“”不相同 |
这里我们可以使用一个函数
1 | # 如果为null,则使用0来进行替换 |
着重号
此时有一个表格为order,但是关键字也为order,想要查询order表格
1 | #不是单引号,而是tab上面的那个着重号 |
查询常数
1 | SELECT "公司名称",456,department_id FROM employees |
显示表的信息
1 | DESCRIBE employees; |
select条件过滤
查询部门id为90的员工
1 | SELECT * FROM employees WHERE department_id=90 |
查询first—name为den的人
1 | SELECT * FROM employees WHERE first_name='Den' |
但是注意次数mysql存在一定的缺陷
我执行下面的语句,发现两次查询的结果相同,但是在数据库中这个人的名称为Den,第二次查询应该不会有结果集,这是sql 的一个缺陷,但是像oracel不会出现这样的情况
1 | SELECT * FROM employees WHERE first_name='den' |
where要放到from的后面
算数运算符
+号使用
在sql中+没有Java语言中的字符转换的作用,只是体现运算符相加的作用
1 | SELECT manager_id+'1' FROM departments |
其他
对于/,如果两个整型的数相除,其实结果为浮点型,mysql默认为除数不尽,所以默认为结果为浮点型
而如果除数为0,那么最终得到的结果为null
取模运算
其实最终得到的结果域被模数有关,与模数无关
比较运算符
符号类型
1 | # 比较运算符,正确为1,不正确为0 |
此时我们查看数据中的存在null的值,现在我们需要查询这些数据,执行以下语句,我们会发现这个结果居然为空集,这是因为在这个过程中manager_id=NULL返回的是null,而只有结果为1的才会被保留下来
1 | SELECT * FROM departments WHERE manager_id=NULL |
字母类型
1 | #LEAST 表示最小,GREATEST表示最大 |
下面我们字符串进行这个函数的比较,他会对结果逐个字母进行比较,小的便是结果
between and,查询某个范围的信息,注意这个是包含两边的边界值的
1 | #不在6000-8000范围内 |
查询是否在值内 in
这里查询部门id为10,20,30的部门,在没有学习in之前,这里的语句会发现他还返回了其他结果,这是因为or 20 不为0,所以sql看作1,就相当于所有条件都成立的。
模糊查询
现在查询包含字母a的员工信息
1 | # %表示不确定个数的字符,包括0个等等,注意此时大小写并不是区分的 |
查询其中包含字母a并且包含字母e的信息,注意两种写法的不同
1 | #这样写虽然得到了结果,但是这样其实还是做出了条件限制,即a在e前面 |
所以说我们可以在加上
1 | SELECT * FROM employees WHERE last_name LIKE '%a%e%' OR last_name LIKE '%e%a%' |
查询第二个字符为a的员工信息
1 | #_表示一个不确定字符 |
查询第二个字符为下划线,而都三个为a
1 | # \使用转义字符,表示这是纯纯的下划线 |
正则表达式,REGEXP\RLIKE精确查询
插眼,学习!!!
1 | #以a开始的名字 |
逻辑运算符
逻辑运算符中的or与and是存在优先级关系的,下面的运算中会先运算两个and的关系,并不会执行完第一个and,就立即执行or
1 | SELECT * FROM `employees` WHERE employee_id>120 AND employee_id<130 OR salary>1000 AND salary<30000 |
位运算符
排序与分页
排序数据
默认的排序顺序是我们添加的顺序
使用 ORDER BY 子句排序 ASC(ascend): 升序 DESC(descend,默认是升序):降序 ORDER BY 子句在SELECT语句的结尾。
1 | SELECT last_name, job_id, department_id, hire_date |
下面的排序中我们使用到了列的别名,最终的显示结果也是正确的
但是如果在这里使用了where里面,就会无法识别,所以别名只能在order中使用
其实这里与sql语句的执行顺序有关系,这里的执行顺序sql首先查看了from语句,看看我们想要查看哪一个表,然后在查看有什么过滤条件,最终再去查看的select这一行,所以where识别不了别名