(4)Mysql操作数据表中的记录

时间:2022-06-11 18:44:39

插入记录的操作INSERT:

方法一:INSERT [INTO] table_name [(column_name,...)] {VALUES|VALUE} ({expr(表达式)|DEFAULT(默认值)},...),(...),...;
方法二:INSERT [INTO] 表名 [(列名1,列名2,...)] VALUES(列值1,列值2,...),(列值3,列值4,…),…;

两者的区别其实很简单,就是插入时是否写列的名字,不写则所有列要依次赋值,当然对于自动编号的字段,我们可以插入“NULL”或“DEFAULT”系统将自动依次递增编号;对于有默认值的字段,可以插入“DEFAULT”表示使用默认值;记录的值也可以传入数值如(1,2,3….)、或者是表达式(如3*7+1),也可以是函数,如密码可以用md5()函数进行加密(PHP中的函数,求字符串哈希值函数)(如md5(‘123’));我们也可以一次同时插入多条记录,多条记录括号间用逗号“,”隔开,例如:
INSERT users VALUES(DEFAULT,'Tom','123',3*7-5,1),(NULL,'Rose',md5('123'),DEFAULT,0);
插入记录有3种方法:

  • INSERT tbl_name VALUES(值1,值2,值3,表达式1,……)[,(值1,值2,值3,……),…;]
    这种方式可以同时插入多条记录,但不能使用子查询,记录的值可以是值,也可以是表达式(不加单引号)
  • INSERT tbl_name SET col_name1=值1,col_name2=值2;
    只能一次性插入一条记录,此方法可以使用子查询subquery,因为我们引发子查询有三种情况,其中有一种情况是由比较运算符引发的子查询,=等号也典型的是一个比较运算符。例:INSERT users SET username='Ben',password='456';
  • INSERT tbl_name[col_name] SELECT……;
    此方法可以将查询结果插入到指定数据表

更新表的操作UPDATE:
如果我们的字段值有错误需要修改的话就需要用到update单表更新,多表更新只有我们在学到了连接以后才会书写方式,下面是单表更新的语法结构,其中如果省略WHERE条件的话,则字段下的所有数据将全部被修改。

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

我们可以更新一列,当然也可以更新多列:UPDATE users SET age = age - id,sex = 0;

删除记录的操作DELETE:
单表删除:DELETE FROM table_name [WHERE ...]
例子:DELETE FROM users WHERE id=6;删除id为6的数据。
当删除了一个纪录时原有纪录的ID号也被删除,则新加的记录的ID号为当前所存在的最大的ID号再加一;而并不会补上原来的空缺。

查询表的操作SELECT:
语法结构:

SELECT select_expr [,select expr2...] 只查找某一个函数或表达式
[
FROM table_references 查询表名
[WHERE where_conditon] 查询条件
[GROUP BY {col_name|position} [ASC|DESC],...] 按某个字段进行分组,相同的只显示第一个
[HAVING where_conditon] 分组时,给出显示条件
[ORDER BY {col_name|expr|position} [ASC|DESC],...] 排序
[LIMIT {[offset,]row_count|row_count OFFSET offset}] 限制返回数量
}

Select能占到表操作的80%以上的使用率,这句话本身也不为过,因为我们本身是对数据表记录进行查找,在整个的查找语句中我们可以发现[]大括号中的内容都是可以省略的,比如 select version ; select now;当然我们在操作数据表的时候这些都不可以省略,只有在查某一个函数表达式 select 3+5 这只是计算表达式的结果,不依附于任何表,自然可以省略。
我们需要清楚查询表达式该如何书写 select_expr,查询表达式的顺序会影响结果顺序:

  • 每个表达式表示想要的一列,必须有至少一个
  • 多个列直接以英文逗号分隔 例如 SELECT username,id from uesrs; SELECT id,username from users;
  • 星号(*)表示所有列 tbl_name.* 可以表示命名表的所有列 例如 SELECT user.id,user.username FROM users;这会操作单张表是没必要这么写的,但是如果是多张表又都有相同的字段名,此时如果要多表连接就需要这么写了,加上数据表可以清晰的明白这个字段隶属于哪个表。

查询表达式可以使用 [AS] alias_name为其赋予别名,别名可用于 GROUP BY,ORDRE BY或HAVING子句。(有些字段的名称比较难记,此时可以设置别名)例如SELECT id AS userId,username AS uname FROM users;这样查询出来的结果会用别名来显示。字段的顺序以及别名都会影响结果的显示。AS 这个关键词既可以使用,也可以不使用,不写直接在后面加上别名也可以起作用,但是我们建议通常情况下最好使用,否则可能出现另外一种特殊的情况,举个例子来看:SELECT id username from users;这样的结果只会显示一个username 下面是id的值,这是重名问题,会显得比较乱,加上as 别名会更好。
我们之前提到过,update语句 delete语句当中,都可以带有where条件,那么在记录过滤的时候也可以进行where条件的指定,如果不指定则会显示全部的记录。在where表达式中,可以使用Mysql支持的函数或运算符。除了带有where条件对记录进行过滤以外,我们还可以对查询的结果进行分组,这就是我们的group by。
查询结果分组:
[ GROUP BY {col_name | position} [ASC|DESC],....]----默认为ASC (ASC 升序 DESC 降序)
在分组时既可以指定列的列名也可以指定列的位置。如果存在多个分组条件,以逗号隔开。SELECT sex FROM users GROUP BY sex;
在group by后面也可以加入分组条件 HAVING,分组条件 [HAVING where_condition] 也就是说分组我可以全部记录都做分组,也可以只对部分记录做分组。
在GROUP BY后接HAVING使用时,HAVING后的表达式必须满足以下条件之一:

  • HAVING后的字段出现在SELECT所查询的字段中;
    如:SELECT sex,age FROM users GROUP BY age HAVING age>20,age就出现在SELECT后;
  • HAVING后的字段没有出现在SELECT查询的字段中,但是它是一个聚合函数(只有一个值的函数,如:count()、max()、avg()、sum()…) SELECT sex FROM users GROUP BY 1 HAVING count(id)>=2;

COUNT:计算行的数量
MAX:计算列的最大值
MIN:计算列的最小值
SUM:获取单个列的合计值
AVG:计算某个列的平均值等
我们还可以对分组的结果进行排序操作 ORDER BY
语法结构:

Order by{col_name |expr |position} [ASC|DESC],....]
[ORDER BY {列名|位置} [ASC|DESC],...]

例子:
SELECT * FROM tbl_name ORDER BY col_name;:默认的是升序
还支持多字段:
SELECT * FROM tbl_name ORDER BY col_name1,col_name2 DESC;
对查询结果进行排序,可以有多个条件 如果第一个条件还不足排序,就拿下一个条件在原来的基础上在进行一次排序。
除了可以对记录进行排序,还可以限制查询结果返回的数量:
[LIMIT {[offset,] row_coun|row_coun OFFSET offset}] 限制记录数量我们通过LIMIT语法加以指定,在LIMIT语句当中一共有两种语法结构,这两种我们以第一种语法结构比较常见,我们来看一看,默认情况下,它返回所有的你要查找到的结果,但是我们可能会限制它返回某一部分结果,比方说*可以帮助我们返回所有结果,假如只想要两条,我们可以在后面加 LIMIT 2;如果只添一个数字,代表从第一个开始返回两个记录。第一条和第二条,如果我想返回3和4呢?这时一个条件就不够用了,还必须告诉它从第几条返回,所以写成 LIMIT 3,2;但是返回的结果确实第4条和第5条,这时什么原因呢?因为记录是从0开始编号的,所以第一条记录是0,如果为了显示第三条,应该是写LIMIT 2,2;除此之外我们还要注意,我们的id号和我们的结果集中没有任何联系,只要它排在结果集的第一个位置它就是0,和id的值没有任何关系。
从查询结果中批量插入记录
insert into table_1(列名)select (列名) from table_2
例子:将aaa表中age字段值大于30的user和pass数据插入到另一张表bbb中的username和password字段。
INSERT bbb(username,password) SELECT user,pass FROM aaa WHERE age > 30;
其中bbb表中的两个字段类型必须与aaa所选的字段类型相同,即VARCHAR。