select语句实现

sql文件:atguigudb.sql · moonshuo/fruit stand - 码云 - 开源中国 (gitee.com)

select基本语句

列别名

1
2
#下面的三种方式别名方式都可以进行
SELECT employee_id emp_id,first_name AS f_name, phone_number "phone" FROM employees

image-20220608103819095

去除重复行

1
2
#查询一共有多少个部门id
SELECT DISTINCT department_id FROM employees

注意,如果此时要查询每一个部门下面的工资

1
2
#执行这个语句会报错,因为salary拥有107行,而DISTINCT department_id,却有17行,无法进行匹配
SELECT salary,DISTINCT department_id FROM employees

但是注意,如果我将上面的顺序换一换,得到的是每用一个部门下面,不同的工资水平,这里会首先匹配DISTINCT department_id

1
SELECT DISTINCT department_id,salary FROM employees

image-20220608105213908

空值参与运算

空值这里指的是null,并不是“”或者0

如果空值参与运算,则运算的结果一定为空

现在我们需要查询一个员工一年的工资

1
2
#在这里,commission_pct表示绩效提升倍数,其实当其为null的时候,我们是要将其当作0来看待,但是这里却出现了问题,这也说明了null0和“”不相同
SELECT first_name,(1+commission_pct)*salary,commission_pct FROM employees

image-20220608110132591

这里我们可以使用一个函数

1
2
# 如果为null,则使用0来进行替换
SELECT first_name,(1+IFNULL(commission_pct,0))*salary,commission_pct FROM employees

着重号

此时有一个表格为order,但是关键字也为order,想要查询order表格

1
2
#不是单引号,而是tab上面的那个着重号
SELECT * FROM `order`

查询常数

1
SELECT "公司名称",456,department_id FROM employees

image-20220608111643285

显示表的信息

1
DESCRIBE  employees;

image-20220608111909672

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
2
3
4
5
6
SELECT manager_id+'1' FROM departments
# 这个+a并不会将其看成ascii码进行处理,而是无法解析之后,看成0来进行处理
SELECT manager_id+'a' FROM departments

#null参数运算之后还是null
SELECT manager_id+NULL FROM departments

image-20220615144843674

image-20220615145100241

image-20220615145216075

其他

对于/,如果两个整型的数相除,其实结果为浮点型,mysql默认为除数不尽,所以默认为结果为浮点型

image-20220615145508379

而如果除数为0,那么最终得到的结果为null

image-20220615145554797

取模运算

其实最终得到的结果域被模数有关,与模数无关

image-20220615145854767

比较运算符

符号类型

1
2
3
4
5
6
7
8
# 比较运算符,正确为1,不正确为0
SELECT 1=1,2!=2 FROM departments
#字符串类型比较
SELECT 1='1',2='a',0='a' FROM departments 1 0 1
#两边全是字符串,不会隐式转换数值
SELECT 'a'='a','a'='b' FROM departments 1 0
#如果存在null,结果全为null
SELECT NULL=0,NULL=NULL FROM departments null null

image-20220615151019701

此时我们查看数据中的存在null的值,现在我们需要查询这些数据,执行以下语句,我们会发现这个结果居然为空集,这是因为在这个过程中manager_id=NULL返回的是null,而只有结果为1的才会被保留下来

1
2
3
4
SELECT * FROM departments WHERE manager_id=NULL
#那么这个结果我们因该怎么处理???
#使用安全等于,使得null也可以参数运算,当然我们也可以使用is null来进行判断
SELECT * FROM departments WHERE manager_id <=> NULL

image-20220615151131130

image-20220615151534631

字母类型

1
2
#LEAST 表示最小,GREATEST表示最大
SELECT LEAST(1,2,3,5,6),GREATEST(5,6,8,2) FROM departments 1 8

下面我们字符串进行这个函数的比较,他会对结果逐个字母进行比较,小的便是结果

between and,查询某个范围的信息,注意这个是包含两边的边界值的

image-20220615153232526

1
2
#不在6000-8000范围内
SELECT * FROM employees WHERE salary NOT BETWEEN 6000 AND 8000

查询是否在值内 in

这里查询部门id为10,20,30的部门,在没有学习in之前,这里的语句会发现他还返回了其他结果,这是因为or 20 不为0,所以sql看作1,就相当于所有条件都成立的。

image-20220615154104075

image-20220615154256596

模糊查询

现在查询包含字母a的员工信息

mysql怎样查询区分大小写-mysql教程-PHP中文网

1
2
3
# %表示不确定个数的字符,包括0个等等,注意此时大小写并不是区分的
SELECT * FROM employees WHERE last_name LIKE '%a%'

image-20220615155004171

查询其中包含字母a并且包含字母e的信息,注意两种写法的不同

1
2
#这样写虽然得到了结果,但是这样其实还是做出了条件限制,即a在e前面
SELECT * FROM employees WHERE last_name LIKE '%a%e%'

image-20220615155402837

所以说我们可以在加上

1
2
3
SELECT * FROM employees WHERE last_name LIKE '%a%e%' OR last_name LIKE '%e%a%'
#当然物品们也可以使用and进行链接,结果相同
SELECT * FROM employees WHERE last_name LIKE '%a%' AND last_name LIKE '%e%'

查询第二个字符为a的员工信息

1
2
#_表示一个不确定字符
SELECT * FROM employees WHERE last_name LIKE '_a%'

查询第二个字符为下划线,而都三个为a

1
2
# \使用转义字符,表示这是纯纯的下划线
SELECT * FROM employees WHERE last_name LIKE '_\_a%'

image-20220615160003847

正则表达式,REGEXP\RLIKE精确查询

插眼,学习!!!

1
2
#以a开始的名字
SELECT * FROM employees WHERE last_name REGEXP '^A'

image-20220615160454630

逻辑运算符

逻辑运算符中的or与and是存在优先级关系的,下面的运算中会先运算两个and的关系,并不会执行完第一个and,就立即执行or

1
SELECT * FROM `employees` WHERE employee_id>120 AND employee_id<130 OR salary>1000 AND salary<30000

位运算符

image-20220708111148368

排序与分页

排序数据

默认的排序顺序是我们添加的顺序

使用 ORDER BY 子句排序 ASC(ascend): 升序 DESC(descend,默认是升序):降序 ORDER BY 子句在SELECT语句的结尾。

1
2
3
SELECT last_name, job_id, department_id, hire_date
FROM employees
ORDER BY hire_date DESC;

image-20220708112830922

下面的排序中我们使用到了列的别名,最终的显示结果也是正确的

image-20220708113433761

但是如果在这里使用了where里面,就会无法识别,所以别名只能在order中使用

image-20220708113553085

其实这里与sql语句的执行顺序有关系,这里的执行顺序sql首先查看了from语句,看看我们想要查看哪一个表,然后在查看有什么过滤条件,最终再去查看的select这一行,所以where识别不了别名

二级排序

image-20220708114157388

分页操作