京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9665|回复: 0

MySQL基础教程之DML语句详解

[复制链接]

19

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-10 20:30:50 | 显示全部楼层 |阅读模式 来自 中国
目录
, y& z& C3 m, n& @; N, N0 @. M8 v% ]1 ?
    & b, t$ b( T# O: `% ~
  • DML 语句
    - ~$ E. c& c2 w5 e, l% c, f
  • 1.插入记录
    8 N# z0 ?# A* @
  • 2.更新记录3 M' ?! R+ h+ e' {, @7 ^$ q
  • 3.简单查询记录
    . R9 I: K$ [( \, J0 O- ?
  • 4.删除记录
    ) A. C4 B7 o9 H/ E' f) l) i
  • 5.查询记录详解(DQL语句)
    ; V, D6 [0 p6 ]+ B
      6 h5 A3 T; S7 [& l" t
    • 5.1.查询不重复的记录0 _6 s0 S0 w! J5 G6 l. R1 l
    • 5.2.条件查询) D- D) n0 a& p) o  J$ F9 b: i
    • 5.3.聚合查询
      & U2 |0 F6 g5 W9 p* x) [/ z: h% V
    • 5.4.排序查询1 E1 X/ R# P% w9 h, V5 {, {
    • 5.5.limit查询, H' i. l# s. ~8 N7 k; {3 t( R
    • 5.6.连表查询- \. w( }4 z+ _. n4 x  t# _
    • 5.7.子查询5 z3 C6 H  C' S6 O
    • 5.8.记录联合
      2 z+ q- J( K5 d4 }
    • 5.9.select语句的执行顺序
      & S& x9 w* L7 y% o  m; Z

      W+ y/ t1 F" E+ C& y& d/ c! n
  • 6.总结
    / V  l  {8 W3 h+ u; s! X* P
! r! X) s5 R$ O- N
DML 语句- [. q+ ~# d; [# @, M$ T5 o; {

- j; u; T4 `, W+ y, s% v/ p# nDML(Data Manipulation Language)语句:数据操纵语句。. A- v  D* a! F6 j4 i6 K
用途:用于添加、修改、删除和查询数据库记录,并检查数据完整性。0 F1 ^6 z# s7 {1 d% a) p  F
常用关键字:insert、update、delete、select等。
# g( G" J: R6 T' O; ODML 操作的对象是库表的数据(记录)。  B9 y/ A0 J4 o1 q# k
主要包括插入(insert)、更新(update)、删除(delete)和查询(select)。
/ n2 ]2 o+ c2 u' P' m/ oDML 语句是开发人员使用最频繁的操作。
( V5 A2 }! C4 M7 O
4 N" O; \+ O" L# @1.插入记录
8 V# s) Y% Q2 R. d6 M1 X
4 \- x4 T9 I+ @0 I# \& u插入一条记录
  1. insert into tablename (field1,field2,...,fieldn) values (value1,value2,...,valuen);
复制代码
一次性插入多条数据
  1. insert into tablename (field1,field2,...,fieldn)values (value1,value2,...,valuen), (value1,value2,...,valuen);
复制代码
2.更新记录$ Q+ q. V8 H/ s7 U& m" x# i( A

; K! g$ ?& a0 V8 v5 Q8 h更新单表数据
  1. update tablename set field1=value1,filed2=value2,...fieldn=valuen [where condition]
复制代码
同时更新多个表的数据
  1. update t1,t2,...,tn set t1.field1=expr1,tn.field=exprn [where condition];
复制代码
通常用于根据一个表的字段来动态地更新另外一个表的字段% t" h* v: Q) j% p) M2 Q
在此说明:中括号 “[ ]” 代表的是可选参数,即可有可无的参数。
5 q- {6 i( I! S. v, ]8 A: c8 b1 V# Y7 M1 _+ y' b7 M* d" i/ l
3.简单查询记录
/ B- c, Z; R4 e+ H4 ~' v) S$ C) ?8 e: [& ~+ O9 M8 p( f
简单的条件查询。符号“*”代表查询所有字段,如果只想看其中某些列,则写表的列名。
  1. select * from tablename [where condition];select field1,field2,...,fieldn from tablename [where condition];
复制代码
别名
3 V4 P& u0 J" r/ {; ^0 E    给列名或表名取别名的关键字:AS 或者不写关键字。如:
  1. select field1 AS f1,field2 f2  from tablename;select t2.field1 AS f1,t1.field2 f2  from table1 as t1,table2 t2;
复制代码
不取别名,则查询结果的列名为表原本的列名;
$ E7 U4 {6 M% O, i7 Q8 w: R: [取别名,则查询结果的列名为别名
3 t" G/ U6 Z! u

' y% k+ s) j3 i; @
/ v, o! J3 @# b7 T* G4.删除记录
0 x& s6 t7 p& o/ J3 g) d. K) z8 v6 X$ C- S1 ^
删除单表记录
  1. delete from tablename [where condition];
复制代码
同时删除多个表的数据
  1. delete t1,t2,...,tn from t1,t2,...,tn [where condition];
复制代码
说明:不加where 条件则删除全表数据
. p. D. ~; {* @/ C# Q单表“增改查删”操作案例:
; q/ E. ]) Y. L5 Q) @
; H/ x7 Y) Q, s' l0 I7 K
多表“删除”操作案例:
% D2 ]( O- m& x% q" Y) E

0 j* O! }2 R2 X7 D  再看个删除案例4 X+ J" P' S3 ^4 l+ A
4 F, ]9 o1 G1 U+ W8 d: I
 最后再看个删除案例
# V/ J( c2 D9 {! H0 [
1 T8 J& T3 r" s* \8 r5 e% Z$ l
多表删除结论:
5 F' A2 ^: g; N5 x$ p- b) f  条件成立,则删除有条件表的对应数据,没条件的则全表删除;
5 w3 |: r# q# m+ @  条件不成立,则都不删除。
* x4 W9 Z+ i) |" D9 [留个疑问:多表删除不给where 条件会怎样呢?; _. e' L9 ~" P( E5 }+ V
关于同时更新多个表数据的操作,可以自行探索,毕竟有思考的学习最有价值。, O( @3 `" c3 H

4 m- r  Z! T" x5.查询记录详解(DQL语句)
$ ]6 r# d  m0 I7 C- ^- A6 n
/ U- \% ^% g# ]; B* GDQL(Data Query Language)即数据库查询语言。5 f5 Z( M; g) A9 B+ u+ \
数据库查询语句就像玩积木一样,一块一块的拼凑,每个中括号“[]”代表一块积木。
* N0 a# U) p1 h: A% M先通过递进的方式一条一条列出查询语法。3 \' G4 L7 C6 p9 m6 s( C1 |, ~, ]% f
8 ~, B! Q, J( k9 V
5.1.查询不重复的记录4 j( L2 y" j7 I, I6 v8 F  B' e) S/ O
  1. select distinct filed from tablename;
复制代码

/ M& v3 D( _/ b" s, Ndistinct 关键字是对 “查询结果集” 去重,再看个例子就明白了。
0 J# [4 P9 v7 @6 n7 h2 ^  c

, p8 ]- }; O" M0 C) {# F$ f3 x8 H* Y
5.2.条件查询
  T5 A& X& \- a( h8 B8 L
  1. --查询所有列:select * from tablename [where condition];--查询指定列:select [field1,field2,...,fieldn] from tablename [where condition];
复制代码
常用的条件(condition)5 K1 R4 R2 ~& x% H
等于:field = xxx1 y$ {4 z% q" U9 H/ w+ N
大于:field > xxx' X- N8 j7 B3 p- O, v
小于:field < xxx. U$ K" J! t) K! A8 |% |
不等于:field != xxx
& R: ^# M1 I; m# {3 k不等于:field  xxx
5 z& J9 f$ w, `. T& [+ o6 A等于null:field is null: \/ p+ ?7 Z# @$ I0 C
不等于null:field is not null7 a. F! h- b- F- Z4 t1 t6 x' V
多个条件之间用逻辑运算符:and 和 or 6 z. O* Y. h" A( X; ^( Q/ g
模糊查询之"_":field like _x_xx_     符号"_"代表匹配单个任意字符,可以在你喜欢的字符旁加上"_"
2 L0 R; d1 J) L# i5 }模糊查询之"%":field like %x%xx%     符号"%"代表匹配0~n个任意字符,可以在你喜欢的字符旁加上"%") G9 b% ^$ b$ ?" f) \! y' \
in语句查询:field in(value1,value2,...)  查询field 和 in 数组配得上的,不配就没有数据+ C, H( T; l. E, x0 }5 q- ~, E! i
not in语句查询:field not in(value1,value2,...)   查询field 和 in 数组配不上的,不配就有数据! w" C! ^7 |! }) |9 L, ?% U
其它常用条件具体怎么用,参考常用条件去操作。
% v( ~! C, w0 V& v' t* X
" K) ]+ q) D7 Z  U: N

9 s2 n7 h( i; Q* _/ P2 O. X) A5.3.聚合查询$ i' R5 n2 _# C3 n! B
  1. --最简单的聚合查询:select [field1,field2,...,fieldn] fun_name from tablename group by field;--完整语法:select [field1,field2,...,fieldn] fun_name from tablename [where condition] [group by field1,field2,...,fieldn [with rollup]] [having condition];
复制代码
说明:
, Q, q/ Z. _. K+ \' w6 G5 o( Z3 ]5 y
fun_name  表示聚合函数,常用有:求和sum()、记录数count(*)、平均值avg()、最大值max()、最小值min();
) t8 r. |4 J1 i+ G8 U( b' }[where condition] 就是上面讲的条件查询;! _/ o2 O/ S8 n( j; j" H
[group by field1,field2,...,fieldn [with rollup]] 9 _6 c  ?. ?& D
  group by 关键字表示对field字段进行分类聚合;
4 V% W5 ?) o3 Q8 f  with rollup 关键字表示是否对分类聚合后的结果进行再汇总
4 \. E. @. E! H* J2 E5 ?[having condition] 对分类聚合后的查询结果集进行条件的过滤
/ t9 h  i3 F/ {/ ~1 L- a
where 和 having 的区别:5 u; a  }& I( [1 }' y
        * r' D1 m" v2 q( {
  • where 是分组前的条件过滤;having 是分组后的条件过滤。    7 n& ^) M2 p( h4 x% M2 Q
  • where 是用原表列名做条件过滤;having 是用查询结果集列名做条件过滤。  Y; M6 u; R' C* ]. u! l
    优先选择where 条件过滤,这样可以减少结果集,进而提高分类聚合的效率。& A3 f' q" C8 T/ I& ~
中括号"[]"代表可选的意思,也就是说group by 前面的[where condition] 可有可无,后面的[with rollup] 和 [having condition] 也是可有可无。
( V7 b( U0 I0 B& E3 t
group by 和distinct 的区别:    group by 是对指定列进行分组;distinct 是对查询结果进行去重。
# j& {# y+ h. `8 j( N7 Y- s

6 O9 `* ^8 c' e8 O$ v5 M加入where 和 having的例子:" ]1 G4 n0 a8 P; H
$ [/ J2 @: j7 m$ S, _) M
列名为avg(stu_age) 看着有点怪怪,给他取个别名就一目了然:' E8 v6 Y9 @) h2 H0 c1 E( t( t) a
, M: Q9 N/ t. w( D
& I/ F) e# n1 {; G& a8 ?; f
5.4.排序查询
8 C) w! X' K$ D2 {* X* Y& q7 K! L1 u
  1. --最简单的排序查询:select * from tablename order by field;--完整语法:select [field1,field2,...,fieldn] fun_name from tablename [where condition] [group by field1,field2,...,fieldn [with rollup]] [having condition] [order by field1 [desc|asc], field2 [desc|asc],...,fieldn [desc|asc]];DESC 代表降序(从大到小);ASC 代表升序(从小到大),asc为默认排序。也就是说你只要记住desc 就可以了。碰巧的是desc 是查询表设计的关键字,而且语法很简单:desc tablename;
复制代码
单列排序:" p9 ?, [- W9 S. E! y( V4 y( t6 \
8 E! M0 v; a4 d) u) P: L
多列排序:用符号 “,” 隔开即可9 M' T9 h5 I( D0 w3 X

/ l5 k" V5 C& @5 f8 n7 _6 {" L, r; b6 Q: }. y) D4 b
5.5.limit查询/ i3 \( x# G0 Q% t) n

# C8 N+ ]7 M: {0 f* H- q+ w  又称为限制查询、范围查询、分页查询
  1. --最简单的limit查询:offset_start和数组下标一样,从0开始算select * from tablename limit offset_start,row_count;--完整语法:这条sql是单表查询的完整版select [field1,field2,...,fieldn] fun_name from tablename [where condition] [group by field1,field2,...,fieldn [with rollup]] [having condition] [order by field1 [desc|asc], field2 [desc|asc],...,fieldn [desc|asc]] [limit offset_start,row_count];
复制代码
例子1:从第1条开始,查询两条数据
1 L1 e& e: w  w2 e. G例子2:从第2条开始,查询两条数据
: D, p& I  U7 I( m1 p# e; j7 ^
* D  ]; S  |; V* S" u7 O
=========================
  O( c1 z4 P- l0 z" O/ M1 M= 以上就是关于单表查询的语法 =  x; l. ?- ]7 a7 h  v. y
= 以下则是关于两表联查的语法 =
& `' q" Q$ m! Q2 t=========================
, j( ?$ l$ t, ~" g9 v1 h2 v. O+ F1 ]3 q7 F# Q1 |. S" V; r) s
5.6.连表查询
4 S# Z+ v: f! g6 X' L* i
7 n  H1 U" D, x9 z5 x在需要关联多个表数据时使用。 学习左连接和内连接即可。
" O$ o$ _. p- `8 ]  c' e左连接:选出左表所有的记录,不管右表有没有和它匹配;左表是主,关联右表信息
  1. select * from t1 left join t2 on t1.field1=t2.field2;
复制代码
内连接:仅选出两张表中互相匹配的记录,没有匹配则结果为空
  1. select * from t1 inner join t2 on t1.field1=t2.field2;select * from t1,t2 where t1.field1=t2.field2;
复制代码

, X' o  Y" [$ N9 N5 _4 D' c
' _' i8 j  d- c5.7.子查询' P- H+ G: Z4 k; T9 g7 a
1 @4 T& t! t% z+ d: m
在需要另外一个查询结果作为查询条件时使用。子查询用“()” 括起来。( ]: m; E6 C' [- M+ z, i
如:查询学生“张三”的成绩, x$ h- Y; ^: W7 a, ]

  |" o, d/ [" v6 ]0 {# o某些情况下,子查询可以转化为连表查询。如上面的例子可以写成连表查询:8 X+ M) p* F  y9 g( I  N/ ^) j

  ], h- b  L0 C+ a4 y+ v. C3 `; ?
+ m0 v1 v) N) d4 G+ g( \2 r# ^5.8.记录联合
; |" r; P" p) G' m: M: v2 j4 t1 G! `, O7 Q/ W/ i( V. d
 将两个过多个表的查询结果合并成结果集输出。合并的条件是多个表的查询结果字段数要相同,注意是查询结果字段数不是表字段数。
  1. select f1,f2,...,fn from t1union/union allselect f1,f2,...,fn from t2...union/union allselect f1,f2,...,fn from tn
复制代码
, G  O3 n! c$ z) K3 L0 p
查询结果字段数不等,则报错
  H. P5 \* A  v+ B5 L
! R4 H" z( u- N6 S9 E4 J0 E8 m
固定查询结果集字段数. F# h# v7 [# g* `! B! V

$ y" ?. w, X7 Z' T% g1 k
- S6 J$ Z( s0 G3 ]5.9.select语句的执行顺序% E% A$ F1 N5 q9 k! f% l
7 l5 \, h1 C* C5 @* L, Q5 t( d3 F
自行证明该执行顺序是否正确,也算是对前面所学知识的一个巩固。​! v, m. i; z3 R4 y3 U1 s
(7)  SELECT ' z5 V4 s9 F# O% ^. R$ i* l9 `
(8)  DISTINCT ; \* E6 v/ b9 p( q$ A
(1)  FROM
% J" s8 J; ^5 h4 C(3)   JOIN ; M$ C8 n# J/ v+ B3 b0 b
(2)  ON 4 R7 b1 P/ c' Q( E) {5 c4 y) a
(4)  WHERE
; v7 b& ?( e. R& E; [4 p$ `(5)  GROUP BY
" W; D' V4 m  P3 P/ L1 ?(6)  HAVING
. ^, r% [  R" W! e8 ?(9)  ORDER BY
" p/ B' \) a$ K+ y; @2 k(10) LIMIT ​3 U2 I! ~: T$ u! R# |0 t9 B

6 o5 y9 u: `4 G( q6.总结% l! z# ?/ O1 c6 }
9 C6 H* a0 @2 Z) K  P; ]
到此为止,关于日常操作最为频繁的表数据的插入(insert)、更新(update)、删除(delete)和查询(select)语句就讲完了。最为繁杂的查询语句,又名为DQL语句,是DML语句中的重点。, ^5 i8 Q; |0 v) z7 a$ m
到此这篇关于MySQL基础教程之DML语句的文章就介绍到这了,更多相关MySQL基础之DML语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!! z5 s! G6 I# {+ @
/ V1 {2 s2 O9 x; v4 y
来源:http://www.jb51.net/article/232467.htm
" L' G+ f+ _, ^* n7 P) U免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

帖子地址: 

梦想之都-俊月星空 优酷自频道欢迎您 http://i.youku.com/zhaojun917
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2026-9-19 19:26 , Processed in 0.050545 second(s), 24 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表