select [distinct] *{col_name1,col_name2,..} from tb_name; select*from s_dept; select id,name,region_id from s_dept; select id,last_name,salary from s_emp;
设置别名
1 2 3
select old_column [as] new_column_name from tb_name; # 建议不要省略as select id,last_name,salary*12as annual from s_emp; select id,se.last_name from s_emp se; # 给员工表起别名
去除重复
1
selectdistinct col_name,col_name... from tb_name;
注意事项:distinct关键词只能放在select关键词后面
空值运算
1 2
select ifnull(expression,replacement) from tb_name; select id,last_name,ifnull(commission_pct,0) c_pct from s_emp;
select id,last_name,dept_id,title,salary from s_emp where salary >1000 and (dept_id =41or dept_id =44);
特殊条件
between and 操作符,表示在俩个值之间
in() ,表示值在一个指定的列表中
like ,模糊查询,在值不精确的时候使用
% ,通配0到多个字符
_ ,通配一个字符,并且是一定要有一个字符
\ ,转义字符
1 2 3
select id,last_name,salary from s_emp where last_name like'_ _ _ n _%'; # 注意我是为了区分才加空格滴
注意事项:数据库中的字符串,需要使用单引号括起来
is null ,判断值为null的时候使用,null值的判断不能使用等号
注意,上述几个关键字的取反操作的为:
1 2 3 4
notbetweenand notin (列表) notlike isnotnull
SQL运算符
算数运算符
1 2
select1+1; select id,last_name,salary,salary*13as sumsal from s_emp;
比较运算符
1 2
select id,last_name,salary from s_emp where salary <=>null; # 等于下一条语句 select id,last_name,salary from s_emp where salary isnull;
注意事项:
null参与运算结果都为null
<=> 和 = 作用一样,唯一的区别 <=>可以用来对NULL进行判断‘
1 2 3 4 5 6
select id,last_name,salary from s_emp where id>=22; select id,last_name,salary from s_emp where salary isnotnull; select least(1,3,4,87,34); select id,last_name,salary from s_emp where salary between850and1200; select id,last_name,dept_id from s_emp where dept_id in(41,42,43,44); select id,last_name from s_emp where last_name like'%a%';
注意事项:
%表示0到任意字符
_表示1个字符占位
1 2 3
select id,last_name,salary from s_emp where last_name like'$_%'escape'$'; # 注意事项:escape指定转义符 select id,last_name,salary from s_emp where last_name regexp '^s'; # regexp仍然解决不了大小写问题 select id,last_name,salary from s_emp wherebinary last_name like'^s'; # binary可以解决
逻辑运算符
1 2 3
select id,last_name,salary from s_emp where salary notbetween850and1200; select id,last_name,salary from s_emp where salary not (salary>=850and salary<=1200); select id,last_name,salary from s_emp where salary<850or salary>1200;
注意:OR和And可以连用,但是and的优先级高于or
1 2 3 4
select id,last_name,dept_id from s_emp where dept_id notin(41,42,43,44); # 员工在41或42号部门,但是薪水不能高于1000的员工信息,或员工不在41或42号部门,但是薪水高于1000的员工信息 # 也就是两个条件只能有一个为真 select id,last_name,salary,dept_id from s_emp where dept_id in(41,42) xor salary>1000;
注意事项:逻辑异或(XOR)运算符是当给定的值中任意一个值为NULL时,则返回NULL
位运算符
1
select5&3;
运算优先级
排序分页
排序
查询数据的时候进行排序,就是根据某个字段的值,按照升序或者降序的情况将记录显示出来
1
select id,id2 from test orderby id asc,id2 desc;
注意事项:
order by语句,只对查询记录显示调整,并不改变查询结果,所以执行权最 低,最后执行
排序的默认值时asc:升序, desc:降序
如果有多个列进行排序,后面的列排序的前提时前面的列排好序以后有重复(相同)的值
分页
1 2
select 字段列表 from 表名 limit 起始索引, 查询记录数; select id,last_name from s_emp limit 0,5;
select col_name.... from table_name1,table_name2 where [table_name1].[col_name]=[table_name2].[col_name] 或 select col_name.... from table_name1 innerjoin table_name2 on [table_name1].[col_name]=[table_name2].[col_name]
不等值连接
两张没有关联关系(主外键)的表,通过某个特定场景的业务连接起来,为不等值连接
1 2 3
select e.id, e.last_name, e.title, e.salary, s.name from s_emp e, salgrade s # s_emp 和 salgrade没有关联关系 where e.salary between s.minsal and s.maxsal;
自连接
自连接就是一张表,自己和自己连接后进行查询
1 2 3 4
select s1.id,s1.last_name,s2.id,s2.last_name manager_name from s_emp s1,s_emp s2 where s1.manager_id = s2.id; # 可理解s1为员工表,s2为经理表
内连接
内连接查询:查询两表或多表中交集部分数据。
隐式内连接语法:
1 2 3
select 字段列表 from table_name1,table_name2 where 条件 ... ;
显式内连接语法:
1 2 3
select 字段列表 from table_name1 [inner] join table_name2 on 连接条件 ... ;
注意事项:一旦表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名再指定字段
外连接
左外连接
1 2 3
select col_name.... from table_name1 left [outer] join table_name2 on [table_name1].[col_name]=[table_name2].[col_name]
右外连接
1 2 3
select col_name.... from table_name1 right [outer] join table_name2 on [table_name1].[col_name]=[table_name2].[col_name]
全连接
1 2 3 4 5 6 7 8 9 10 11
# UNION 并集 ->全连接 # 使用左连接和右连接的并集代替全连接 SELECT se.dept_id, last_name, `name` FROM s_emp se LEFTJOIN s_dept sd on se.dept_id = sd.id UNION SELECT se.dept_id, last_name, `name` FROM s_emp se RIGHTJOIN s_dept sd on se.dept_id = sd.id;
-- 1.查询Smith所在部门id select dept_id from s_emp where last_name='Smith'; #查询结果:41 -- 2.查询Smith所在部门的最高工资 selectmax(salary) from s_emp where dept_id=41; #查询结果:1450.00 -- 3.查询比Smith所在部门最高工资高的员工的信息 select id,last_name,salary from s_emp where salary >1450; -- 合并以上三条SQL语句 select id,last_name,salary from s_emp where salary > ( selectmax(salary) from s_emp where dept_id=( select dept_id from s_emp where last_name='Smith' ) );
-- 1.查询41号部门的平均工资 selectavg(salary) from s_emp where dept_id=41; #查询结果:1247.5 -- 2.查询平均工资比41号部门的平均工资高的部门编号 select dept_id from s_emp groupby dept_id havingavg(salary)>1247.5; #查询结果: 313235503310 -- 3.查询平均工资比 41号部门的平均工资 高 的部门中员工的信息 select last_name,salary,dept_id from s_emp where dept_id in(10,31,32,33,35,50); -- 合并以上三条SQL语句 select last_name,salary,dept_id from s_emp where dept_id in( select dept_id from s_emp groupby dept_id havingavg(salary)>( selectavg(salary) from s_emp where dept_id=41 ) );
行子查询
子查询返回的结果是**一行(可以是多列)**,这种子查询称为行子查询。
常用的操作符:= 、<> 、IN 、NOT IN
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-- 查询"Ngao"的入职日期 及 职位 select start_date,dept_id from s_emp where last_name ='Ngao'; #查询结果:1990-03-0841 -- 查询与"Ngao"的入职日期及职位相同的员工信息 select last_name,id,salary,dept_id from s_emp where (start_date,dept_id) = ('1990-03-08',41); -- 合并以上两条SQL语句 select last_name,id,salary,dept_id from s_emp where (start_date,dept_id) = ( select start_date,dept_id from s_emp where last_name ='Ngao');
-- 1.查询41号部门的平均工资 selectavg(salary) from s_emp where dept_id=41; #查询结果:1247.5 -- 2.查询平均工资比 41号部门的平均工资 高 的部门id select dept_id from s_emp groupby dept_id havingavg(salary) >1247.5; #查询结果:10,31,32,33,35,50 -- 3.查询平均工资比 41号部门的平均工资 高 的部门中员工的信息 select se.last_name,se.dept_id from s_emp se where se.dept_id in (10,31,32,33,35,50); -- 4.准备部门平均工资表 select dept_id,avg(salary) avgs from s_emp groupby dept_id; -- 5.查询平均工资比 41号部门的平均工资 高 的部门中员工的信息,并且显示 出当前部门的平均工资 select se.last_name,se.dept_id,sa.avgs from s_emp se,( select dept_id,avg(salary) avgs from s_emp groupby dept_id ) sa where se.dept_id in (10,31,32,33,35,50) and sa.dept_id = se.dept_id; -- 合并以上五条SQL语句 select se.last_name,se.dept_id,sa.avgs from s_emp se,( select dept_id,avg(salary) avgs from s_emp groupby dept_id ) sa where se.dept_id in ( select dept_id from s_emp groupby dept_id havingavg(salary) > ( selectavg(salary) from s_emp where dept_id=41 ) ) and sa.dept_id = se.dept_id;