1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > mysql - sql/DDL/DML/DQL/基础sql/常用sql

mysql - sql/DDL/DML/DQL/基础sql/常用sql

时间:2019-12-22 17:12:23

相关推荐

mysql - sql/DDL/DML/DQL/基础sql/常用sql

目录

1.SELECT语句

2.UPDATE 语句

3.REPLACE语句

4.INSERT语句

5.WHERE语句

6.BETWEEN语句

7.DELETE语句

8.EXISTS语句

9.JOIN语句

10.MOIFY语句

11.MySQL注释

1.SELECT语句

(1)SELECT语句语法

select select_expr [,select_expr,…] [

from tb_name

[join 表名]

[on 连接条件]

[where 条件判断]

[group by {col_name | postion} [asc | desc], …]

[having where 条件判断]

[order by {col_name|expr|postion} [asc | desc], …]

[ limit {[offset,]rowcount | row_count offset offset}]

]

(2)SELECT INTO…OUTFILE语法

SELECT ... INTO OUTFILE 'file_name'

[CHARACTER SET charset_name]

[export_options]

export_options:

[{FIELDS | COLUMNS}

[TERMINATED BY 'string']

[[OPTIONALLY] ENCLOSED BY 'char']

[ESCAPED BY 'char']

]

[LINES

[STARTING BY 'string']

[TERMINATED BY 'string']

]

FIELDS有三个子句:TERMINATED BY、 [OPTIONALLY] ENCLOSED BY和ESCAPED BY。如果指定了FIELDS则三个必指定一个。

(1)TERMINATED BY指定字段之间分隔符号

(2)ENCLOSED BY指定包裹字段值的符号,如“ENCLOSED BY ' " '”表示值放在双引号之间,若加上OPTIONALLY表示所有的值都放在双引号之间。

(3)ESCAPED BY子句用来指定转义字符,例如“ESCAPED BY '*'”将“*”指定为转义字符,取代“\”,如空格将表示为“*N”。

(4)LINES子句:使用TERMINATED BY指定一行结束的标志,如“LINES TERMINATED BY '?'”表示一行以“?”作为结束标志。

2.UPDATE 语句

Solution 1: 修改1列

update student s, city c

set s.city_name = c.name

where s.city_code = c.code;

Solution 2: 修改多个列

update a, b

set a.title=b.title, a.name=b.name

where a.id=b.id

Solution 3: 采用子查询

update student s set city_name = (select name from city where code = s.city_code);

3.REPLACE语句

1.replace介绍

REPLACE与此类似 INSERT,除非表中的旧行与a PRIMARY KEY或UNIQUE 索引的新行具有相同的值, 否则在插入新行之前将删除旧行

要使用REPLACE,您必须拥有表的权限INSERT和 DELETE权限。

2.MySQL replace into 有三种形式

(1)replace into tbl_name(col_name, ...) values(...)

(2)replace into tbl_name(col_name, ...) select ...

(3)replace into tbl_name set col_name=value, ...

第三种replace set用法类似于update set用法,使用一个例如“SET col_name = col_name + 1”的赋值,

则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。

前两种形式用的多些。其中 “into” 关键字可以省略,不过最好加上 “into”,这样意思更加直观。另外,对于那些没有给予值的列,

MySQL 将自动为这些列赋上默认值。

select start_date,end_date,count(1) from rds.amz_all_order_3 group by start_date,end_date order by start_date,end_date;

3.table2中存在多条主键重复数据,覆盖次序如何

replace into table1 select * from table2;

当table2中有重复多条数据时,重复数据中排序后的数据覆盖排序前的数据,结果只保留排序最后的一条数据

4.INSERT语句

(1)INSERT语法

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name

[PARTITION (partition_name [, partition_name] ...)]

[(col_name [, col_name] ...)]

{VALUES | VALUE} (value_list) [, (value_list)] ...

[ON DUPLICATE KEY UPDATE assignment_list]

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name

[PARTITION (partition_name [, partition_name] ...)]

SET assignment_list

[ON DUPLICATE KEY UPDATE assignment_list]

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name

[PARTITION (partition_name [, partition_name] ...)]

[(col_name [, col_name] ...)]

SELECT ...

[ON DUPLICATE KEY UPDATE assignment_list]

value:

{expr | DEFAULT}

value_list:

value [, value] ...

assignment:

col_name = value

assignment_list:

assignment [, assignment] ...

2.INSERT ... SELECT语法

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name

[PARTITION (partition_name [, partition_name] ...)]

[(col_name [, col_name] ...)]

SELECT ...

[ON DUPLICATE KEY UPDATE assignment_list]

value:

{expr | DEFAULT}

assignment:

col_name = value

assignment_list:

assignment [, assignment] ...

--指定IGNORE忽略会导致重复键违规的行

--INSERT ... SELECT会忽略DELAYED

--INSERT语句 的目标表 可能出现在SELECT .. FROM子句中,但无法从子查询中选择目标表数据插入目标表。

--为确保二进制日志可用于重新创建原始表,MySQL不允许对INSERT ... SELECT语句进行并发插入。

insert into tbl_temp2 (fld_id)

select tbl_temp1.fld_order_id from tbl_temp1 where tbl_temp1.fld_order_id > 100;

--

insert into book select "abc","bdd" union all select "add","dsf";

(3)INSERT ... ON DUPLICATE KEY UPDATE语法

[1]ON DUPLICATE KEY UPDATE语法说明与案例

插入数据时,目标表数据已存在(基于唯一索引或主键),则修改将插入的数据,不存在,则新增。

如果一个表中包含了一个自增的字段,使用INSERT ... ON DUPLICATE KEY UPDATE新增或修改t数据后,可以通过last_insert_id()方法返回最后自动生成的值,如果是多条,实际测试是返回第一条数据自增的值。

例1:

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

等同于:UPDATE table SET c=c+1 WHERE a=1;

例2:

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

等同于:

INSERT INTO t1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=3;

INSERT INTO t1 (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=9;

例3:

INSERT INTO tablename(field1,field2, field3, ...) VALUES(value1, value2, value3, ...) ON DUPLICATE KEY UPDATE field1=value1,field2=value2, field3=value3, ...;

tablename是表名,field1,field2,field3等是字段名称,value1,value2,value3等是字段值。

例4:

INSERT INTO t1 (a, b)

SELECT * FROM

(SELECT c, d FROM t2 UNION SELECT e, f FROM t3) AS dt

ON DUPLICATE KEY UPDATE b = b + c;

[2]使用注意点

INSERT INTO ... ON DUPLICATE KEY UPDATE b=values(b); values(b)表示为VALUES中对应b字段的值

同一pk值,当同时插入多条时取第一条或是最后一条:生效是最后一条

[3]应用情景

如合成一张多字段大表时,如juvo_agg_metadata_sku表(sku为主键),可拆分字段分组分步骤导入。

(4)INSERT IGNORE语法

MySQL提供了Ignore 用来避免数据的重复插入.若有导致unique key 或 primary key 冲突的记录,则该条记录不会被插入到数据库中.

例:sample

insert ignore into books (c_name) values ('mysql manual')

INSERT IGNORE INTO table_name SELECT ... FROM table_2;

5.WHERE语句

(1)实现组合字段条件

SELECT a.* from yida_org.temp_buyerid_orderid_2B a

where (amazon_order_id,asin) NOT in (select amazon_order_id,asin from

yida_org.temp_buyerid_orderid_2A);

6.BETWEEN语句

(1)基本的语法格式

[NOT] BETWEEN 取值1 AND 取值2

NOT:可选。加上NOT表示不能满足指定范围的条件。

取值1:表示范围的起始值。

取值2:表示范围的终止值。

(2)例子

age between 18 and 24查询条件是age字段的取值范围为18~24

age not between 18 and 24 查询条件是age字段的取值不在18~24之间

7.DELETE语句

(1)单表语法

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]

[PARTITION (partition_name [, partition_name] ...)]

[WHERE where_condition]

[ORDER BY ...]

[LIMIT row_count]

-- 该DELETE语句从中删除行 tbl_name并返回已删除行的数量。要检查已删除行的数量,请调用ROW_COUNT()功能。

-- where_condition是一个表达式,对于要删除的每一行,计算结果为true。

-- 如果ORDER BY指定了该子句,则按指定的顺序删除行。该 LIMIT子句限制了可以删除的行数。这些子句适用于单表删除,但不适用于多表删除。

(2)多表语法

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

tbl_name[.*] [, tbl_name[.*]] ...

FROM table_references

[WHERE where_condition]

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

FROM tbl_name[.*] [, tbl_name[.*]] ...

USING table_references

[WHERE where_condition]

(1)性能

当需要删除全表时,TRUNCATE TABLE语句是一种更快的方式来清空表,但TRUNCATE TABLE不能在事务中使用或者如果您对表有锁定。

(2)自动增量列

如果删除包含列的最大值的行 AUTO_INCREMENT,则不会对该 表MyISAM或InnoDB表重用该值。

如果在模式下删除表中的所有行(没有 子句) ,则除了和之外,所有存储引擎的序列都将重新开始。

(3)修饰符

该DELETE语句支持以下修饰符:

如果指定LOW_PRIORITY修饰符,则服务器会延迟执行, DELETE直到没有其他客户端从表中读取。这会影响只使用表级锁只存储引擎(例如 MyISAM,MEMORY和 MERGE)。

对于MyISAM表,如果使用 QUICK修饰符,则存储引擎在删除期间不会合并索引叶,这可能会加速某些类型的删除操作。

该IGNORE修改导致MySQL删除行的过程中忽略的错误。(解析阶段遇到的错误以常规方式处理。)由于使用而IGNORE被忽略的错误 将作为警告返回。

(4)删除顺序

如果DELETE语句包含 ORDER BY子句,则按照子句指定的顺序删除行。这主要与结合使用有用LIMIT。

例如,以下语句查找与WHERE子句匹配的行,对其进行排序timestamp_column,并删除第一个(最旧的):

DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp_column LIMIT 1;

3.多表删除

可以在DELETE语句中指定多个表,根据WHERE子句中的条件从一个或多个表中删除行,但不能在多表 DELETE中使用ORDER BY或LIMIT。

对于第一个多表语法,仅FROM删除子句之前列出的表中的匹配行。对于第二个多表语法,仅删除FROM子句(在USING子句之前)中列出的表中的匹配行。

结果是您可以同时从多个表中删除行,并具有仅用于搜索的其他表:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id;

或:

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id;

多表DELETE语句可以使用语句中允许的其他类型的连接 SELECT,例如 LEFT JOIN。例如,要删除不存在t1匹配项的行 t2,请使用LEFT JOIN:

DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;

DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2

WHERE a1.id=a2.id;

DELETE FROM a1, a2 USING t1 AS a1 INNER JOIN t2 AS a2

WHERE a1.id=a2.id;

4.其他跨表删除案例

(1)从数据表t1中把那些id值在数据表t2里有匹配的记录全删除掉

DELETE t1 FROM t1,t2 WHERE t1.id=t2.id

或DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id

实例:

delete a from yida_org.ama_businessreport_info a ,yida_org.temp_businessreport_17_01 b

where a.store_nam=b.store_nam and a.area_nam=b.area_nam and a.data_date=b.data_date;

(2)从数据表t1里在数据表t2里没有匹配的记录查找出来并删除掉

DELETE t1 FROM t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL 或

DELETE FROM t1,USING t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL

(3)从两个表中找出相同记录的数据并把两个表中的数据都删除掉

DELETE t1,t2 from t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t1.id=25

注意此处的delete t1,t2 from 中的t1,t2不能是别名;

8.EXISTS语句

这条语句适用于a表比b表大的情况

select * from ecs_goods a where cat_id in(select cat_id from ecs_category);

这条语句适用于b表比a表大的情况

select * from ecs_goods a where EXISTS (select cat_id from ecs_category b where a.cat_id = b.cat_id);

9.JOIN语句

(1)实现full join

mysql不支持full join,可以同过 左外连接+ union+右外连接来实现

SELECT * FROM Persons p LEFT OUTER JOIN Orders o ON p.pid=o.pid

UNION

SELECT * FROM Persons p RIGHT OUTER JOIN Orders o ON p.pid=o.pid;

10.MOIFY语句

(1)修改字段类型或排列位置

ALTER TABLE 表名 MODIFY 字段名1 数据类型 FIRST|AFTER 字段名2

参数说明

FIRST,将字段1修改为表的第一个字段。

AFTER 字段名2

将字段1,插入到字段2的后面。

例子:

alter table deptment modify name VARCHAR(30);

ALTER TABLE tb001 MODIFY COLUMN C1 VARCHAR(20) NOT NULL DEFAULT 'A1';

11.MySQL注释

MySQL服务器支持3种注释风格:

(1)从‘#’字符从行尾。

(2)从‘-- ’序列到行尾。‘-- ’注释要求第2个破折号后面至少跟一个空格符(tab、换行符)。

(3)从/*序列到后面的*/序列。结束序列不一定在同一行中,允许注释跨越多行。

例子:下面的例子显示了3种风格的注释:

mysql> SELECT 1+1; # This comment continues to the end of line

mysql> SELECT 1+1; -- This comment continues to the end of line

mysql> SELECT 1;/* this is an in-line comment */ + 1;

mysql> SELECT 1+;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。