xml地图|网站地图|网站标签 [设为首页] [加入收藏]
删除_Mysql_脚本之家,19下子查询为什么无法使用
分类:数据库

CREATE TABLE `oplogs`  unsigned NOT NULL AUTO_INCREMENT,`kind` varchar NOT NULL DEFAULT '',`op` varchar NOT NULL,`user` varchar NOT NULL DEFAULT '',`ip` varchar NOT NULL DEFAULT '',`updatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY  ENGINE=MyISAM AUTO_INCREMENT=34896 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED

SELECT a.id,a.kind,a.op,a.user,a.ip,a.updatetime FROM oplogs as a inner join(select id from oplogs where 1 order by id desc limit 0,20) as b using

同样的,只会讲解跟SQLSERVER不同的地方

比较出大家的异同点,从而加深记忆

用php读取内容并显示

将多行查询结果插入到表中

这一篇《与MSSQL对比学习MYSQL的心得》也是一样,相同的地方略略带过,不同的地方我会给出例子,谢谢大家的支持oo

首次显示结果需要3.5秒

INSERT INTO table_name1 SELECT  FROM table_name2 WHERE 

这一节主要介绍MYSQL里的基本查询

在linux 下 5.5.38下

INSERT INTO SELECT 在SQLSERVER里也是支持的

MySQL中select的基本语法形式:

然后在5.6下执行了explain 结果如下:

table_name1指定待插入数据的表;column_list1指定待插入表中要插入数据的哪些列;table_name2指定插入数据是从

select 属性列表from 表名和视图列表[where 条件表达式][group by 属性名[having 条件表达式]][order by 属性名[asc|desc]][limit ,row count]说明:

而同样的数据 explain 结构如下:

哪个表中查询出来的;column_list2指定数据来源表的查询列,该列表必须和column_list1列表中的字段个数相同,数据类型相同;

where子句:按照“条件表达式”指定的条件进行查询。

比较结果很明显 主要在于对oplogs进行排序时,rows行变化太大了,一个进行了完整的遍历,第一个使用了索引,造成差距过大,不过原因尚未找到,有哪位知道呢?

condition指定SELECT语句的查询条件

group by子句:按照“属性名”指定的字段进行分组。

从person_old表中查询所有的记录,并将其插入到person表

having子句:有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出。

CREATE TABLE person ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, NAME CHAR NOT NULL DEFAULT '', age INT NOT NULL DEFAULT 0, info CHAR NULL, PRIMARY KEY CREATE TABLE person_old ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, NAME CHAR NOT NULL DEFAULT '', age INT NOT NULL DEFAULT 0, info CHAR NULL, PRIMARY KEY INSERT INTO person_oldVALUES (11,'Harry',20,'student'),(12,'Beckham',31,'police')SELECT * FROM person_old

group by子句通常和count等聚合函数一起使用。

可以看到,插入记录成功,person_old表现在有两条记录。接下来将person_oldperson_old表中的所有记录插入到person表

order by子句:按照“属性名”指定的字段进行排序。排序方式由“asc”和“desc”两个参数指出,默认是按照“asc”来排序,即升序。

INSERT INTO personSELECT id,NAME,age,info FROM person_old;SELECT * FROM person 
CREATE TABLE fruits NOT NULL, s_id INT NOT NULL, f_name CHAR NOT NULL, f_price DECIMAL NOT NULL, PRIMARY KEY

INSERT INTO fruits(f_id,s_id,f_name,f_price)VALUES,('b1',102,'blackberry',5.2),('bs1',105,'orange',5.2),('bs2',103,'melon',5.2),('t1',106,'banana',5.2);

可以看到数据转移成功,这里的id字段为自增的主键,在插入时要保证该字段值的唯一性,如果不能确定,可以插入的时候忽略该字段,

使用select语句查询f_id字段的数据

如果再执行一次就会出错

SELECT f_id,f_name FROM fruits

MYSQL和SQLSERVER的区别:

注意:MYSQL中SQL语句是不区分大小写的,因此select和SELECT作用是相同的

当要导入的数据中有重复值的时候,MYSQL会有三种方案

这一点跟SQLSERVER是一样的!

方案一:使用 ignore 关键字方案二:使用 replace into方案三:ON DUPLICATE KEY UPDATE

SELECT * FROM fruitsSELECT f_id,f_name FROM fruits WHERE f_price >5.1SELECT f_id,f_name FROM fruits WHERE s_id INSELECT f_id,f_name FROM fruits WHERE s_id NOT INSELECT f_id,f_name FROM fruits WHERE f_price BETWEEN 2 AND 10SELECT f_id,f_name FROM fruits WHERE f_price NOT BETWEEN 2 AND 10

第二和第三种方案这里不作介绍,因为比较复杂,而且不符合要求,这里只讲第一种方案

带like的字符匹配查询

TRUNCATE TABLE personTRUNCATE TABLE persona_old INSERT INTO person_oldVALUES (11,'Harry',20,'student'),(12,'Beckham',31,'police')##注意下面这条insert语句是没有ignore关键字的INSERT INTO personSELECT id,NAME,age,info FROM person_old;INSERT INTO person_old VALUES (13,'kay',26,'student')##注意下面这条insert语句是有ignore关键字的INSERT IGNORE INTO personSELECT id,NAME,age,info FROM person_old;

1、百分号通配符“%”,匹配任意长度的字符,甚至包括零字符

在SQLSERVER这边,如果要忽略重复键,需要在建表的时候指定 WITH ON [PRIMARY]

SELECT f_id,f_name FROM fruits WHERE f_name LIKE 'b%y'

这样在插入重复值的时候,SQLSERVER第一次会保留值,第二次发现有重复值的时候,SQLSERVER就会忽略掉

2、下划线通配符“_”,一次只能匹配任意一个字符

SQLSERVER需要使用 SET IDENTITY_INSERT 表名 ON 才能把自增字段的值插入到表中,如果不加 SET IDENTITY_INSERT 表名 ON

SELECT f_id,f_name FROM fruits WHERE f_name LIKE '____n'

则在插入数据到表中时,不能指定自增字段的值,则id字段不能指定值,SQLSERVER会自动帮你自动增加一

同样,在SQLSERVER里面也是有的

INSERTINTO person VALUES 
USE [sss]GOSELECT * FROM [dbo].[aaa] WHERE [name] LIKE 's_____'

CREATE TABLE customers( c_id INT NOT NULL AUTO_INCREMENT, c_name CHAR NOT NULL, c_city CHAR NULL, PRIMARY KEYINSERT INTO customersVALUES,SELECT * FROM customers WHERE c_city IS NULL

SELECT * FROM customers WHERE c_city IS NOT NULL

而MYSQL则不需要,而且自由度非常大

AND、OR、DISTINCT关键字

你可以将id字段的值指定为NULL,MYSQL会自动帮你增一

SELECT f_id,f_name FROM fruits WHERE f_name LIKE '____n' AND f_id='bs2'SELECT f_id,f_name FROM fruits WHERE f_name LIKE '____n' OR f_id='bs2'SELECT DISTINCT s_id FROM fruits

SELECT s_id ,COUNT AS total FROM fruits GROUP BY s_id

INSERT INTO fruits(f_id,s_id,f_name,f_price)VALUES,
INSERTINTO person VALUES (NULL,'feicy',33,'student')

INSERT IGNORE INTO person VALUES (16,'tom',88,'student')

如果要查看每个供应商提供的水果的种类的名称,MYSQL中可以在GROUP BY中使用GROUP_CONCAT()函数,

也可以不写id的值,MYSQL会自动帮你增一

将每个分组中各个字段的值显示出来

INSERT IGNORE INTO person VALUES 
SELECT s_id,GROUP_CONCAT AS NAMES FROM fruits GROUP BY s_id 

你可以指定id字段的值也可以不指定,指定的时候只要当前id字段列没有你正在插入的那个值就可以,即没有重复值就可以

SQLSERVER是没有GROUP_CONCAT()函数的,SQLSERVER要达到同样效果需要使用xml函数,MYSQL这方面做得非常好

自由度非常大,而且无须指定 SET IDENTITY_INSERT 表名 ON 选项

having:过滤分组

唯一索引的NULL值重复问题

根据s_id对fruits表中的数据进行分组,并显示水果种类大于1的分组信息

在MYSQL中UNIQUE 索引将会对null字段失效

SELECT s_id ,GROUP_CONCAT AS NAMES FROM fruits GROUP BY s_id HAVING COUNT>1
insert into test insert into test

在group by中使用with rollup

上面的插入语句是可以重复插入的

SELECT s_id ,COUNT AS total FROM fruits GROUP BY s_id WITH ROLLUP

SQLSERVER则不行

增加了最后一行,7表示total列的所有值的总和

CREATE TABLE person ( id INT NOT NULL IDENTITY NULL DEFAULT '', age INT NOT NULL DEFAULT 0, info CHAR NULL, PRIMARY KEY CREATE UNIQUE INDEX IX_person_unique ON [dbo].[person]INSERT INTO [dbo].[person] ( [NAME], [age], [info] )VALUES ( NULL, -- NAME - char 1, -- age - int 'aa' -- info - char, ( NULL, -- NAME - char 2, -- age - int 'bb' -- info - char

消息 2601,级别 14,状态 1,第 1 行不能在具有唯一索引“IX_person_unique”的对象“dbo.person”中插入重复键的行。重复键值为 。语句已终止。

而rollup关键字在SQLSERVER里面也有,详见:SQLSERVER中的ALL、PERCENT、CUBE关键字、ROLLUP关键字和GROUPING函数

更新比较简单,就不多说了

注意:当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的!

UPDATE person SET info ='police' WHERE id BETWEEN 14 AND 17SELECT * FROM person

limit限制查询结果的数量

本文由澳门新葡亰手机版发布于数据库,转载请注明出处:删除_Mysql_脚本之家,19下子查询为什么无法使用

上一篇:数据库迁移到 下一篇:启动报错,MYSQL拒绝访问报错not
猜你喜欢
热门排行
精彩图文