菜鸟的MySQL学习笔记(三)

4-1插入记录INSERT

INSERT [INTO] tbl_name [(col_name)] {VALUES|VALUE} ({expr|DEFAULT},...), (...), ...   #可以一次性插入多条记录

INSERT [INTO] tbl_name SET col_name = {expr | DEFAULT}, ...  #可以使用子查询

INSERT [INTO] tbl_name [(col_name,...)] SELECT ... #可以将查询的结果插入到指定的表中

4-2更新记录UPDATE

UPDATE [LOW_PRIORITY] [IGNORE] tbl_reference SET col_name1={expr1 | DEFAULT} [,col_name2={expr2|DEFAULT}] ... [WHERE where_condition]   #单表更新

4-3-1删除记录DELETE

DELETE FROM tbl_name [WHERE where_condition]  #单表删除

4-3-2多表删除

从数据表t1中把那些id值在数据表t2里有匹配的记录全删除掉
DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 

DELETE  FROM t1 USING t1,t2 WHERE t1.id=t2.id 
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不能是别名
#delete t1,t2 from table_name as t1 left join table2_name as t2 on t1.id=t2.id where table_name.id=25 
在数据里面执行是错误的(MYSQL 版本不小于5.0在5.0中是可以的)
上述语句改写成
#delete table_name,table2_name from table_name as t1 left join table2_name as t2 on t1.id=t2.id where table_name.id=25 
在数据里面执行是错误的(MYSQL 版本小于5.0在5.0中是可以的)
附:上述语句运行的环境 MYSQL 4.0.2以上

4-4查找记录SELECT

SELECT select_expr  [,select_expr ...]

[

FROM table_reference

[WHERE where_condition]

[GROUP BY {col_name | position} [ASC|DESC],....]                #分组,可以指定列名和列位置

[HAVING where_condition]                 #对某一部分分组,保证分组条件要么聚合函数(MAX,SUM),或该语句出现在select语句中

[ORDER BY {col_name | expr | position} [ASC|DESC] ,...]      #多用于升降序

[LIMIT {[offset,] row_count | row_count OFFSET offset}]      #限制查询结果返回数量

]

5-1子查询

子查询(Subquery)是指出现在其他SQL语句中的SELECT字句。

#SELECT * FROM t1                   #outer query/outer statement 外查询

WHERE

col1 = (SELECT col2 FROM t2);    #subquery   子查询

子查询是嵌套在查询内部,且必须始终出现在圆括号内,可以包含多个关键字或条件,如 DISTINCT、GROUP BY 、ORDER BY 、LIMIT,函数等。 子查询外层查询可以是:SELECT,INSERT,UPDATE,SET或DO。

子查询可以返回标量、一行、一列或子查询。

使用比较运算符的子查询

包括=/>/</>=/<=/<>/!=/<=>

语法结构: operand comparison_operator subquery

#SELECT  goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >=(SELECT ROUND (AVG(goods_price),2) FROM tdb_goods);

子查询结果大于一个结果是需要使用ANY /SOME/ALL 来修饰

operand comparison_operator ANY (subquery)

operand comparison_operator SOME (subquery)

operand comparison_operator ALL (subquery)

运算符/关键词 ANY
SOME

ALL
>/>= 最小值
最小值

最大值
</<= 最大值
最大值

最小值

=

任意值

任意值

 
<>/!=
 

 
任意值

由[NOT] IN 的子查询

语法结构:

operand comparison_operator [NOT] IN (subquery) =ANY 运算符与IN等效。

!=ALL或<>ALL运算符与NOT IN等效。

使用[NOT] EXISTS 的子查询

如果子查询返回任何行,EXISTS将返回TRUE;否则将返回FALSE。

5-2 使用INSERT....SELECT将查询结果写入数据表

语法结构:

INSERT [INTO] tbl_name [(col_name,...)] SELECT ...

#->INSERT tbl_goods_cates(cate_name)                                 #插入商品品牌名

->SELECT goods_cate FROM  tdb_goods GROUP BY goods_cate;      #从商品表中查找品牌名

5-3 多表更新

语法结构:

UPDATE table_references SET col_name1 = {expr1 | DEFAULT} [,col_name2 = {expr2 | DEFAULT}]... [WHERE where_condition]

#->UPDATE tdb_goods INNER JOIN tbd_goods_cates       #使用内连接更新

->ON goods_cate = cate_name                                                #条件为 表1字段=表2字段

-> SET goods_cate = cate_id;                                                    #设置表1字段 名称= 表2 字段ID

5-4 多表更新一步到位

创建数据表同时将查询结果写入到数据表

语法结构:

CREATE TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] select_statement

#->CREATE TABLE tdb_goods_brands                                                          #创建商品类型表

->(

->brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,                        #创建类型表ID字段

->brand_name VACHAR(40) NOT NULL                                                                       #创建类型名字段, 长度40 ,非空

->)

->SELECT brand_name FROM tdb_goods GROUP BY brand_name;                            #从商品表中查找类型

5-5 连接

表的参照关系:

table_references                                                                               #表1

{[INNER | CROSS] JOIN | {LEFE | RIGHT} [OUTER] JOIN}                  #连接类型

table_references                                                                              #表2

ON conditional_expr                                                                       #连接条件

连接类型

INNER JOIN ,内连接                                          # 在MySQL中,JOIN,CROSS JOIN 和INNER JOIN是等价的,A∩B

LEFT [OUTER] JOIN,左外连接                               # AU(A∩B)

RIGHT [OUTER] JOIN , 右外连接                          #(A∩B)UB

多表连接

#->SELECT goods_id,goods_name,cate_name,brand_name,goods_price  FROM tdb_goods AS g   #使用别名,查找

->INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_ID                                                                   #条件1

->INNER JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id;                                                         #条件2

无限分类表的设计(通过自身连接实现 存在三个字段  ID,name,父类ID)

#->SELECT s.type_id,s.type_name,p.type_name                                          #查询

->FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p                              #左外连接 FROM子查询中必须使用别名

->ON s.parent_id = p.type_id;                                                                                       #连接条件

多表删除

语法结构:DELETE tbl_name[.*] [,tbl_name[.*]] ... FROM table_references [WHERE where_condition]

#->DELETE t1 FROM tdb_goods AS t1            #删除表t1表

->LEFT JOIN                                                           #使用左外连接

-> (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name  HAVING count(goods_name) >= 2) AS t2                                                            #子查询 商品名称类型数量大于2

->ON t1.goods_name= t2.goods_name               #连接条件

->WHERE t1.goods_id > t2.goods_id;                  #删除条件为id更大的

时间: 2024-11-06 03:36:03

菜鸟的MySQL学习笔记(三)的相关文章

MySQL学习笔记(三)&mdash;索引

一.概述 1.基本概念       在大型数据库中,一张表中要容纳几万.几十万,甚至几百万的的数据,而当这些表与其他表连接后,所得到的新的数据数目更是要大大超出原来的表.当用户检索这么大量的数据时,经常会感觉慢.这个时候要提高数据库的检索性能,就必须要用到索引.给表追加合适的索引能极大的改善数据检索的效率,提供数据库性能.      索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,而且每种存储引擎也不一定支持所有的索引类型.      所有存储引擎支持每个表至多16个索引,总索

菜鸟的MySQL学习笔记(五)

7.自定义函数 用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同.包含了两个必要条件,参数与返回值.没有必然内在联系. 函数可以返回任意类型的值,同样可以接收这些类型的参数: 创建自定义函数: CREATE FUNCTION function_name             #函数名 RETURNS {STRING | INTEGER | REAL | DECIMAL}        #返回值类型 routine_body

菜鸟的MySQL学习笔记(二)

3-1约束: 1.约束保证数据的完整性和一致性: 2.约束分表级约束(两个或两个个以上字段的约束)和列级约束(一个字段约束): 3.NOT NULL       非空: PRIMARY KEY       主键约束: UNIQUE KEY         唯一约束: DEFAULT               默认约束: FOREIGN KEY        外键约束. 空值与非空值: NULL 与 NOT NULL 自动编号: AUTO_INCREMENT 自动编号,必须与主键组合使用,默认情

菜鸟的MySQL学习笔记(四)

MySQL中的运算符和函数: 1.字符函数: 2.数值运算符与函数: 3.比较运算符与函数: 4.日期时间函数: 5.信息函数: 6.聚合函数: 7.加密函数等: 6-1.字符函数: CONCAT()                     字符连接 #SELECT  CONCAT(first_name,last_name) AS fullname FROM name_test;   从name表中 连接显示 first last CONCAT_WS()              使用指定的分隔

MySQL学习笔记(三):常用函数

一:字符串函数 需要注意的几个细节: 1.cancat中有一个字符串为null,则结果为null. 2.left(str,x) 和 right(str,x)中x为null,则不返回任何字符串,不是null. 二:数值函数 注意的几个细节: 1.truncate(x,y) 和 round(x,y) 都能截断,只是round会四舍五入,而truncate不会. 三:日期和时间函数 四:流程函数 五:其他函数

MYSQL学习笔记三:日期和时间函数

1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ #CURDATE()与CURRENT_DATE()作用同样,返回同样的系统当前日期 #CURDATE()+0则将当前日期值转换成数值类型 SELECT CURDATE(), CURRENT_DATE(), CURDATE()+0; /* CURTIME()和CURRENT_TIME()作用同样.将当前时间以'HH:MM:SS'或者'HH

Mysql学习笔记(三)对表数据的增删改查。

写在前面:(一些牢骚,可以直接跳到分割线后) 太过敏感的人不会快乐,不幸的是我正是这种性格的人. 从培训机构毕业后,迫于经济方面的压力,和当时的班里的一个同学住在了一起,我们在一个公司上班.谁知道这都是不开心生活的源头,从每天早晨开始心情就很糟糕.他是个脾气很慢的人,我是个急脾气,特别是在早上上班的时候.由此种种吧,实在是不胜枚举.算了,还是不说了,太痛苦了,我不太喜欢说别人的坏话.我是学心理学的,已经用各种方法去安慰自己,但是都不太奏效. 回想以往和朋友的交往中,我虽然不算十分合群的人,但绝对

Mysql学习笔记(三)运算符和控制流函数

原文:Mysql学习笔记(三)运算符和控制流函数 本章学习内容: 1.操作符 2.控制流程函数 操作符: i.圆括号.. 简单的介绍一下圆括号,圆括号的使用的目的是规定计算表达式的顺序...这个想必大家都熟悉例如  mysql>select 1+(2*3) mysql>select (1+2)*3 ii.比较运算符. 比较运算符就比较多了,并且也很常用..比如 = 等于: mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -&g

MySql学习笔记(一)之DQL常用查询

MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前,我们先做一些准备工作. 需要安装的软件如下: 1.mysql,版本可以选择5.1或者5.5,安装过程可以参考博客:http://www.cnblogs.com/ixan/p/7341637.html 2.mysql图形化管理软件:Navicate,sqlyog(二选一,推荐使用sqlyog). 本文