order by:后面跟的是字段,表示你选择的字段,也可以是字段对应的数字,比如
order by 1,3
DEPTNO ENAME SAL
------ ---------- ----------
20 SMITH 800
1,3对应的字段分别是DEPTNO,SAL
修改数据库表中的信息,使用update关键字。
3.在mysql中最该数据时会出现Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
是因为在mysql在safe-updates模式中,如果你where后跟的条件不是主键id,那么就会出现这种错误。
解决问题方法:
1、SET SQL_SAFE_UPDATES = 0;执行该命令更改mysql数据库模式。
2、在where判断条件中跟上主键id 例如:delete from firstmysqldatabase.user where UserName='zhangsan' and ID>=0;
4.in和exists的区别
表展示
首先,查询中涉及到的两个表,一个user和一个order表,具体表的内容如下:
user表:
order表:
in
确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。
具体sql语句如下:
SELECT
*
FROM
`user`
WHERE
`user`.id IN (
SELECT
`order`.user_id
FROM
`order`
)
这条语句很简单,通过子查询查到的user_id 的数据,去匹配user表中的id然后得到结果。该语句执行结果如下:
它的执行流程是什么样子的呢?让我们一起来看一下。
首先,在数据库内部,查询子查询,执行如下代码:
SELECT
`order`.user_id
FROM
`order`
执行完毕后,得到结果如下:
此时,将查询到的结果和原有的user表做一个笛卡尔积,结果如下:
此时,再根据我们的user.id IN order.user_id的条件,将结果进行筛选(既比较id列和user_id 列的值是否相等,将不相等的删除)。最后,得到两条符合条件的数据。
exists
指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
具体sql语句如下:
SELECT
`user`.*
FROM
`user`
WHERE
EXISTS (
SELECT
`order`.user_id
FROM
`order`
WHERE
`user`.id = `order`.user_id
)
这条sql语句的执行结果和上面的in的执行结果是一样的。
但是,不一样的是它们的执行流程完全不一样:
使用exists关键字进行查询的时候,首先,我们先查询的不是子查询的内容,而是查我们的主查询的表,也就是说,我们先执行的sql语句是:
SELECT `user`.* FROM `user`
得到的结果如下:
然后,根据表的每一条记录,执行以下语句,依次去判断where后面的条件是否成立:
EXISTS (
SELECT
`order`.user_id
FROM
`order`
WHERE
`user`.id = `order`.user_id
)
如果成立则返回true不成立则返回false。如果返回的是true的话,则该行结果保留,如果返回的是false的话,则删除该行,最后将得到的结果返回。
区别及应用场景
in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
group_by:
根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组。
语法
select 字段 from 表名 where 条件 group by 字段
或者
select 字段 from 表名 group by 字段 having 过滤条件
注意:对于过滤条件,可以先用where,再用group by或者是先用group by,再用having
案例
1 创建表格并插入数据
说明:在plsql developer上创建表格并插入数据,以便下面进行简单字段分组以及多个字段分组,同时还结合聚合函数进行运算。
创建student表
create table student
(id int not null ,
name varchar2(30),
grade varchar2(30),
salary varchar2(30)
)
在student表中插入数据
insert into student values(1,'zhangsan','A',1500);
insert into student values(2,'lisi','B',3000);
insert into student values(1,'zhangsan','A',1500);
insert into student values(4,'qianwu','A',3500);
insert into student values(3,'zhaoliu','C',2000);
insert into student values(1,'huyifei','D',2500);
数据插入到student表中的结果
2 单个字段分组
① select grade from student 查出所有学生等级(包括重复的等级)
② select grade from student group by grade 查出学生等级的种类(按照等级划分,去除重复的)
3 多个字段分组
select name , sum(salary) from student group by name , grade 按照名字和等级划分,查看相同名字下的工资总和
注意:这里有一点需要说明一下,多个字段进行分组时,需要将name和grade看成一个整体,只要是name和grade相同的可以分成一组;如果只是name相同,grade不同就不是一组。
4 配合聚合函数一起使用
常用的聚合函数:count() , sum() , avg() , max() , min()
count():计数
select name , count(*) from student group by name 查看表中相同人名的个数
得出的如下结果
sum():求和
select name , sum(salary) from student group by name 查看表中人员的工资和(同姓的工资相加)
得出的如下结果
avg():平均数
select name , avg(salary) from student group by name , grade 查看表中人员的工资平均数(同姓工资平均数)
得出的如下结果
max():最大值
select grade , max(salary) from student group by grade 查看按等级划分人员工资最大值
得出的如下结果
min():最小值
select grade , min(salary) from student group by grade 查看按等级划分人员工资最小值
得出的如下结果
使用 SHOW INDEX 命令。
show index from
删除表中不想要的数据,
每个数据库管理系统都提供了可以删除一个字符串里不想要的字符的函数,其中最有用的
函数是 REPLACE 和 TRANSLATE。