mysql查询报错Subquery returns more than 1 row

mysql查询报错Subquery returns more than 1 row,第1张

MySQL报Subquery returns more than 1 row这个错误的意思是指子查询的结果多于一行。

解决方法:在子查询的条件语句末尾加 limit 1 。

例如:WHERE ( SELECT ccip FROM crawl_site cc WHERE ccid=this_site_id)>=_ipstart_ip

用这种条件,WHERE 后边的子查询(SELECT)里面结果只能是1条,多了就会报“Subquery returns more than 1 row”这样的错误。

扩展资料:

MySQL管理工具:可以使用命令行工具管理 MySQL 数据库(命令 mysql 和 mysqladmin),也可以从 MySQL 的网站下载图形管理工具 MySQL Administrator, MySQL Query Browser 和 MySQL Workbench。

phpMyAdmin是由 php 写成的 MySQ L资料库系统管理程程序,让管理者可用 Web 界面管理 MySQL 资料库。

phpMyBackupPro也是由 PHP 写成的,可以透过 Web 界面创建和管理数据库。它可以创建伪 cronjobs,可以用来自动在某个时间或周期备份 MySQL 数据库。

另外,还有其他的 GUI 管理工具,例如 mysql-front 以及 ems mysql manager, navicat等等。

参考资料:

百度百科——mySQL

子查询目标

子查询是一种把查询的结果作为参数返回给另一个查询的一种查询

子查询可以让你将多个查询绑定在一起

嵌套子查询

多层子查询

相关子查询

可接受外部的引用

exists/any/all

any:与子查询中的每一行与主查询进行比较 并对子查询中的每一行返回一个true值

some 结果与any一样

all 子查询结果都满足条件 才会返回true

DML

数据库插入

insert value

insert select

update update table set col=value

delete

DDL

创建和 *** 作表

create

存储参数 storage(initial size next size minextents value pctincrease value)初始分配空间 追加的长度 最小追加长度 每次追加的百分比或进行下一次追加

用已存在的表创建新表

create table new_t(num name amount) as(select from old_t where amount< )

alter

加入一列到已经存在的表中

修改已经存在的表中的某一列

ALTER TABLE BILLS MODIFY NAME CHAR( );将表中某字段改为长度 个字符

ALTER TABLE NEW_BILLS ADD MENTS CHAR( );向表中加一列

alter不能用于对一个数据库增加或删除字段 但可以将某列由not null改为null

drop

drop table table_name;

创建视图和索引

视图 常被称为虚表 create view 视图是一个数据库对象 他允许用户从一个表或一组表中建立一个 虚表 它本身没有数据 仅仅是一条查询语句 它可以方便的在各个表中进行联合查询 这对用户来说是很方便的 其次 可以增加安全性 屏蔽一些不想让无权限的用户看一些表中的数据即隐藏了基本表 这同时也可以隐藏着其中的复杂性 有时更改起来也很方便而不必涉及到应用程序 如一个表中有 列数据 我只想让其他用户看到 列 这时候视图就会显得十分方便 如表school 有ID name lesson三项 我只需要显示其中 项 实例如下

子查询目标 子查询是一种把查询的结果作为参数返回给另一个查询的一种查询子查询可以让你将多个查询绑定在一起嵌套子查询多层子查询相关子查询可接受外部的引用exists/any/allany:与子查询中的每一行与主查询进行比较 并对子查询中的每一行返回一个true值some 结果与any一样all 子查询结果都满足条件 才会返回true

DML 数据库插入 insert valueinsert selectupdate update table set col=valuedelete

DDL 创建和 *** 作表create存储参数 storage(initial size next size minextents value pctincrease value)初始分配空间 追加的长度 最小追加长度 每次追加的百分比或进行下一次追加用已存在的表创建新表 create table new_t(num name amount) as(select from old_t where amount< )alter 加入一列到已经存在的表中 修改已经存在的表中的某一列ALTER TABLE BILLS MODIFY NAME CHAR( );将表中某字段改为长度 个字符ALTER TABLE NEW_BILLS ADD MENTS CHAR( );向表中加一列alter不能用于对一个 数据库 增加或删除字段 但可以将某列由not null改为nulldropdrop table table_name;

创建视图和索引视图 常被称为虚表 create view 视图是一个数据库对象 他允许用户从一个表或一组表中建立一个 虚表 它本身没有数据 仅仅是一条查询语句 它可以方便的在各个表中进行联合查询 这对用户来说是很方便的 其次 可以增加安全性 屏蔽一些不想让无权限的用户看一些表中的数据即隐藏了基本表 这同时也可以隐藏着其中的复杂性 有时更改起来也很方便而不必涉及到应用程序 如一个表中有 列数据 我只想让其他用户看到 列 这时候视图就会显得十分方便 如表school 有ID name lesson三项 我只需要显示其中 项 实例如下

所以在适当的时候 十分有必要在众多表中建立视图

索引 索引是与磁盘上数据的存储方式不同的另外一组数据的方法 索引的特例是表中记录一句其在磁盘上的存储位置显示 索引可以在表内创建一个列或列的组合 通过对正确的 特定的两个表的归并字段进行索引可以获得明显的好处 create index

ps 视图和索引是两个完全不同的对象 但有一点是相同的 它们都与一个表或数据库相关联 尽管每一个对象只能与一个特定的表相关联 但它们还是通过对数据的预排序和预定义显著地提高了表的工作性能

使用视图 create view view_name(col col ……) as select table_name(col col ……) from table_name;

select规则 不能使用union 不能使用order by 但使用group by有其相同功能

DML的规则 对于多表视图不能使用delete

除非非空列都出现在视图中 否则不能使用insert

对于一个归并(merger)的表插入或更新 所有被更新的记录必须属于同一个物理表

如果创建视图时使用dintinct子句 就不能插入或更新这个视图

不能更新视图中      的虚拟列(它是用计算字段得到的)

删除视图:drop view view_name;

使用索引

索引可以让存储于磁盘上的数据进行重新排序

使用索引的原因 在使用unique关键字时前执行的保证数据的完整性

可以容易的用索引字段或其他字段进行排序

提高查询执行速度

索引的概念

两种方法从数据库中获得数据 顺序访问方式 需要sql检查每一个记录以找到与之匹配的 此法效率很低 但它是使记录准确定位的唯一方法   使用索引的的直接访问方式 sql采用树形结构来存储和返回所以数据 用以指示的数据存储在树的最末端(也就是叶子) 它们被称为结点(也可以叫叶 子) 每个结点中有一个指向其他结点的指针 结点左边的值只是它的双亲结点 结点右边的值则是孩子结点或叶子 sql将从根结点开始找到所需的数据

ps 当查询没有使用索引的表时 查询通常是全表搜索后才会得到结果 全表搜索会让数据库服务程序遍历过表中的所有记录然后返回给定条件的记录 索引可以让数据库服务程序快速的定位到表中的确定行

create index index_name on table_name(column_name [column_name ] );

SQL Server 和ORACLE允许你创建成簇的索引 Informix和ORACLE允许你指明列名是按升序排列还是按降序排列

使用索引不会对表中的物理存储造成影响

order by和索引的区别

使用order by子句时 每次运行它都需要重新进行排序 而使用索引时 数据库会建立一个物理索引对象(树结构) 每次运行查询时都访问同一个索引

当表被删除时 所有与之相关的索引也将被删除

使用索引的技巧

对于小表来说 使用索引对于性能不会有任何提高

当你的索引列中有极多的不同数据和空值时 索引会使性能有极大的提高

当查询要返回的数据很少时(少于全部数据的 %) 索引可以优化你的查询 如果要返回的数据很多时 索引会加大系统开销

索引可以提高数据的返回速度 但它使得数据的更新 *** 作变慢 (对记录和索引进行更新时请不要忘记先删除索引 当执行完更新 *** 作后 恢复索引即可 对于一次特定的 *** 作 系统可以保存删除的索引 个小时 在这个时间内数据更新完成后你可以恢复它 )

索引会占用数据库空间

可以提高归并速度

大多数数据库系统不允许对视图使用索引

不要对经常需要更新或修改的字段创建索引 否则会降低性能

不要将索引与表存储在同一个驱动器上 分开存储会去掉访问冲突从而使结果返回的更快

复合索引

对多个字段进行索引(一个索引包含多个列)

CREATE INDEX ID_CMPD_INDEX ON BILLS( ACCOUNT_ID AMOUNT );尽量将经常在查询中使用的字段放在最前边

复合索引的性能与单个字段的索引相比是无法判定的

创建索引时使用unique关键字

复合索引通常使用unique关键字来防止有相同数据的多个记录多次出现 (oracle 不支持 从 i开始支持)

索引与归并

当查询中使用了复杂的归并时 你的select语句会好用很长时间

在归并时对字段创建索引可以显著得提高查询反应速度 但创建太多的索引 会使性能下降而不是提高

作为一个规 则你应该对表中的唯一属性的字段或你用以归并 *** 作的字段来创建索引

群集(簇)的使用

当 使用群集索引时 数据在表中的物理排序方式会被修改 使用群集索引通常比传统的不使用群集索引速度要快 ORACLE 中群集的概念与此不同 当使用ORACLE 关系数据库系统时 群集就是一个像数据或表一样的对象 群集一般是存储了表的共有字段以提高对表的访问速度

oracle 的例子

CREATE CLUSTER [schema ]cluster (column datatype [ column datatype] )

[PCTUSED integer] [PCTFREE integer] [SIZE integer [K|M] ]

[INITRANS integer] [MAXTRANS integer] [TABLESPACE tablespace]

[STORAGE storage_clause] [!!under!!INDEX | [HASH IS column] HASHKEYS integer]

你随后创建的其于该表的群集的索引会被加入到群集中 然后把表也加入群集中 你应该只将经常需要归并的表加入到群集 不要向群集中加入只需要用简单的SELECT 语句进行个别访问的表

事务处理控制

事务控制

事务控制(事务处理)指关系数据库系统执行数据库事务的能力 (逻辑分组 它有自己的开始和结束)

事务 逻辑上必须完成的一命令序列的单位

单元工作期 事务的开始和结束时期

开始事务处理

SET TRANSACTION {READ ONLY | USE ROLLBACK SEGMENT segment}

可以在下列语句中使用READ ONLY选项 SELECT LOCK TABLE SET ROLE ALTER SESSION ALTER SYSTEM

有些数据库支持SET AUTOMIT [ON | OFF]

结束事务处理

MIT [WORK][ MENT text | FORCE text [ integer] ] ;

MIT (TRANSACTION | TRAN | WORK) (TRANSACTION_NAME)

取消事务处理

这必须是在MIT 之前 ROLLBACK 语句必须在一个事务之中运行 它可以一直撤消到事务的开始

在事务中使用保存点

SAVEPOINT savepoint_name;

ROLLBACK TO SAVEPOINT savepoint_name;

数据库安全

技巧要带着下边的问题去规划你数据库系统的安全性

谁应该得到数据库管理员权限?

有多少个用户需要访问数据库系统?

每个用户应该得到什么样的权限与角色

当一个用户不再访问数据库时应该如何去删除它

oracle使用三个结构来实现安全性 用户 角色 权限

用户

CREATE USER user

IDENTIFIED {BY password | EXTERNALLY}

[DEFAULT TABLESPACE tablespace]

[TEMPORARY TABLESPACE tablespace]

[QUOTA {integer [K|M] | UNLIMITED} ON tablespace]

[PROFILE profile]

如 果选择了EXTERNALLY 选项 ORACLE 将会依赖于你登录进入计算机系统的用户名和密码 也就是说当你登录进行计算机时你就已经登录进行了ORACLE 我们推荐你使用IDENTIFIED BY 子句强制用户在登录进行系统时输入密码IDENTIFIED BY PASSWORD

角色

GRANT role TO user [WITH ADMIN OPTION];

REVOKE role from user;

lishixinzhi/Article/program/Oracle/201311/16734

Select 查询语句

语法:SELECT [ALL|DISTINCT] <目标列表达式> [AS 列名][,<目标列表达式> [AS 列名] ] FROM <表名> [,<表名>…]

[WHERE <条件表达式> [AND|OR <条件表达式>]

[GROUP BY 列名 [HAVING <条件表达式>>

[ORDER BY 列名 [ASC | DESC>

解释:[ALL|DISTINCT] ALL:全部; DISTINCT:不包括重复行

<目标列表达式> 对字段可使用AVG、COUNT、SUM、MIN、MAX、运算符等

<条件表达式> 查询条件 谓词

比较 =、>,<,>=,<=,!=,<>,

确定范围 BETWEEN AND、NOT BETWEEN AND

确定集合 IN、NOT IN

字符匹配 LIKE(“%”匹配任何长度,“_”匹配一个字符)、NOT LIKE

空值 IS NULL、IS NOT NULL

子查询 ANY、ALL、EXISTS

集合查询 UNION(并)、INTERSECT(交)、MINUS(差)

多重条件 AND、OR、NOT

<GROUP BY 列名> 对查询结果分组

[HAVING <条件表达式>] 分组筛选条件

[ORDER BY 列名 [ASC | DESC> 对查询结果排序;ASC:升序 DESC:降序

增加外键

创建表的时候增加外键:在所有的表字段之后,使用foreign key(外键字段) references 外部表(主键字段)

在新增表之后增加外键:修改表结构,使用alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 父表(主键字段);

修改外键&删除外键

alter table 表名 drop foreign key 外键名;

外键条件

外键要存在,首先必须保证表的存储引擎是innodb

列类型必须与父表的主键类型一致

一张表中的外键名字不能重复

增加外键的字段数据已经存在,必须保证数据与父表主键要求对应

外键约束

有三种约束模式

district:严格模式(默认的)

cascade:级联模式

set null:置空模式

语法:foreign key(外键字段) references 父表(主键字段) on delete 模式 on update 模式;

联合查询

基本语法:

select 语句1

union [union 选项]

select 语句2……

union 选项

all:保留所有,不管重复

distinct:去重,默认的

子查询(sub query)

按位置分类

from子查询

where子查询

exists子查询

按结果分类

标量子查询

列子查询

行子查询

表子查询

子查询

列子查询

=any等价于in; -- 其中一个即可

any等价于some; -- 二者是一样的

=all为全部

-- 创建外键

create table my_foreign1(

idint primary key auto_increment,

name varchar (20)not null comment

'学生姓名',

c_idint comment'班级id',

-- 增加外键

foreign key(c_id)references

my_class(id)

)charset utf8;

-- 创建表

create table my_foreign2(

idint primary key auto_increment,

name varchar (20)not null comment

'学生姓名',

c_idint comment'班级id'  -- 普通字段

)charset utf8;

-- 增加外键

alter table my_foreign2add

-- 指定外键的名字

constraint student_class_1  -- 可以指定多个外键 但是名字不能相同

-- 指定外键的字段

foreign key(c_id)

-- 引用父表主键

references my_class(id);

-- 删除外键

alter table my_foreign1drop

foreign key my_foreign1_ibfk_1;  -- my_foreign1_ibfk_1 通过外键的名字来删

-- 插入数据;外键字段在父表不存在

insert into my_foreign2values (

null,'郭富城',4);  -- 没有4号班级

insert  into my_foreign2values (

null,'项羽',1);

insert  into my_foreign2values (

null,'刘邦',2);

insert  into my_foreign2values (

null,'韩信',3);

-- 更新父表的记录

update my_classset id=4 where id=1;  -- 失败;id=1记录已经被学生引用

update my_foreign2set c_id=2 where id=4;  -- 更新

update my_classset id=4 where id=3;  -- 可以;没有学生引用此班级

-- mysql中添加外键约束遇到一下情况:

-- cannot add foreign key constraint

-- 出现这个问题的原因是,外键的使用:

-- 1 外键字段不能为该表的主键;

-- 2 外键字段参考字段必须为参考表的主键

-- 插入数据

insert into my_foreign1values (

null,'马超','3'

);

-- 增加外键

alter table my_foreign1add

foreign key(c_id)references

my_class(id);  -- 失败;因为没有3号班了

-- 创建外键,指定模式;删除置空;更新级联

create table my_foreign3(

idint primary key auto_increment,

name varchar (20)not null,

c_idint,

-- 增加外键

foreign key (c_id)

-- 引用表

references my_class(id)

-- 指定删除模式

on delete set null

-- 指定更新模式

on update cascade

)charset utf8;

-- 插入数据

insert into my_foreign3values (

null,'刘备',1),

(null,'曹 *** ',1),

(null,'孙权',1),

(null,'祝贺量',2),

(null,'周瑜',2);

-- 解除My_foreign2表的外键

alter table my_foreign2drop

foreign key student_class_1;

-- 更新父表主键

update my_classset id=3 where id=1;

-- 删除父表主键

delete from  my_classwhere id=2;

-- 联合查询

select from my_class

union  -- 默认去重

select from my_class;

select from my_class

union all  -- 不去重

select from my_class;

select id,c_name,roomfrom my_class

union all  -- 不去重

select name,number,idfrom my_student;

-- 需求;男生升序;女生降序(年龄)

(select from my_student

where sex='男'

order by ageasc limit9999999)

union

(select from my_student

where sex='女'

order by agedesc limit9999999);

select from my_studentwhere

c_id=(

-- 标量子查询

select idfrom my_classwhere

c_name='python1903');-- id一定只有一个值(一行一列)

insert into my_classvalues (1,

'python1907','B407');

-- 列子查询

select from my_studentwhere

c_idin(select idfrom my_class);

-- any,some,all

select from my_studentwhere

c_id=any(select idfrom my_class);

select from my_studentwhere

c_id=some(select idfrom my_class);

select from my_studentwhere

c_id=all(select idfrom my_class);

select from my_studentwhere

c_id!=any(select idfrom my_class);  -- 所有结果(null除外)

select from my_studentwhere

c_id!=some(select idfrom my_class);  -- 所有结果(null除外)

select from my_studentwhere

c_id!=all(select idfrom my_class);  -- 所有2号班级(null除外)

select from my_studentwhere

age=(select max(age)from

my_student)

and

height=(select max(height))from

my_student);

-- 行子查询

select from my_student

-- (age,height)称之内为行元素

where (age,height)=(select max(

age),max(height)from my_student);

update my_studentset height=188

where name='王五';

select from my_studentorder by

agedesc,heightdesc limit1;

select from my_studentorder by

heightdesc;

-- 表子查询

select from my_studentgroup by

c_idorder by heightdesc;  -- 每个班选出第一个学生再按身高排序

select from (select from

my_studentorder by heightdesc)

as studentgroup by studentc_id;

嵌套SELECT语句也叫子查询,一个

SELECT

语句的查询结果能够作为另一个语句的输入值。子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在select

list中,作为一个字段值来返回。

1、单行子查询

:单行子查询是指子查询的返回结果只有一行数据。当主查询语句的条件语句中引用子查询结果时可用单行比较符号(=,

>,

<,

>=,

<=,

<>)来进行比较。

例:

select

ename,deptno,sal

from

emp

where

deptno=(select

deptno

from

dept

where

loc='NEW

YORK');

2、多行子查询:多行子查询即是子查询的返回结果是多行数据。当主查询语句的条件语句中引用子查询结果时必须用多行比较符号(IN,ALL,ANY)来进行比较。其中,IN的含义是匹配子查询结果中的任一个值即可("IN"

*** 作符,能够测试某个值是否在一个列表中),ALL则必须要符合子查询的所有值才可,ANY要符合子查询结果的任何一个值即可。而且须注意ALL

和ANY

*** 作符不能单独使用,而只能与单行比较符(=、>、<

、>=

、<=

、<>)结合使用。

例:

1)多行子查询使用IN *** 作符号例子:查询选修了老师名叫Rona(假设唯一)的学生名字

sql>

select

stName

以上就是关于mysql查询报错Subquery returns more than 1 row全部的内容,包括:mysql查询报错Subquery returns more than 1 row、oracle对表的基本 *** 作、在关系数据库标准语言SQL中,实现数据检索的语句命令是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10191599.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存