美文网首页
第四章 操作数据表中的记录

第四章 操作数据表中的记录

作者: 齐天大圣李圣杰 | 来源:发表于2016-09-15 14:50 被阅读0次

    回顾和概述

    约束

    按约束所针对列的数目划分:
    表级约束:针对两个或两个以上的字段使用
    列级约束:只针对某一个字段
    按功能划分:
    NOU NULL(非空约束)不存在表级约束
    PRIMARY KEY(主键约束)
    UNIQUE KEY(唯一约束)
    DEFAULT(默认约束)不存在表级约束
    FOREIGN KEY(外键约束)

    修改数据表

    针对字段的操作:添加/删除字段、修改列定义,修改列名称等
    针对约束的操作:添加/删除各种约束
    针对数据表操作:数据表更名(两种方式)

    插入记录INSERT

    INSERT:
    INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

    INTO 可以省略,col_name列名称如果省略默认为所有咧赋值,如果存在多个字段,字段之间用逗号分隔

    创建数据表:

    CREATE TABLE users(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20) NOT NULL,
    password VARCHAR(32) NOT NULL,
    age TINYINT UNSIGNED NOT NULL DEFAULT 10,
    sex BOOLEAN
    );
    

    插入记录:
    如果省略字段名,默认为所有字段赋值,但是为id自动增长的字段赋值时,可以采用两个特殊的值,依次让它采用默认的自动编号的形式(NULL,DEFAULT)

    INSERT users VALUES(NULL,'Tom','123',25,1);#插入一条记录id为NULL(默认的自动编号)
    

    使用SELECT * FROM users;#id为1,按照默认的自动增长插入

    INSERT users VALUES(NULL,'John','456',25,1);
    

    使用SELECT * FROM users;#id依次递增,按照默认的自动增长插入

    INSERT users VALUES(NULL,'Tom','123',25,1);#使用DEFAULT同样也可以自动增长
    

    如果省略列名,所有的列必须依次赋值,否则会报错
    列的值也可以是一个数学表达式:
    INSERT users VALUES(DEFAULT,'Tom','456',3*7-5,1);#插入成功
    除此之外,还可以写成字符表达式或函数

    为有默认值的DEFAULT字段可以用DEFAULT设置成默认值:

    INSERT users VALUES(DEFAULT,'Tom','123',DEFAULT,1);#为age字段设置为默认的值
    

    使用SELECT * FROM users;查看记录,发现刚刚插入的记录被赋予了默认值

    一次插入多条记录

    INSERT users VALUES(DEFAULT,'Tom','123',3*7-5,1),(NULL,'Rose',md5('123'),DEFAULT,0);#一次插入多条记录,列值可以为表达式或函数(md5()为计算字符串md5的哈希)DEFAULT为默认值
    

    插入记录INSERT SET-SELECT

    插入记录的第二种方法:
    INSERT [INTO] tbl_name SET col_name={expr | DEFAULT},...
    说明:与第一种方式的区别在于,此方法可以使用子查询(SubQuery)

    这种方法用的较少,还以一个区别,刚才的那个方法一次可以插入多条记录,此方法一次只能插入一条记录
    INSERT users SET username='Ben',password='456';

    第三种方法:
    INSERT [INTO] tbl_name [(col_name,...)] SELECT...
    说明:此方法可以将查询结果插入到指定数据表中。

    单表更新记录UPDATE

    UPDATE:
    更新记录(单表更新)
    UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}]... [WHERE where_condition]

    更新记录:省略条件将会更新所有记录

    UPDATE users set age=age+5;#把所有记录的age增加5
    

    更新记录:多列
    UPDATE users SET age=age-id,sex=0;#age=age-id没有实际意义,只是为了演示

    更新记录:加条件
    UPDATE users SET age=age+10 WHERE id%2=0;#id为偶数的年龄增加10

    单表删除记录

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

    如果省略WHERE条件,将删除所有记录
    DELETE FROM users WHERE id=6;#id=6的记录被删除
    此时再插入一条记录:
    INSERT users VALUES(NULL,'111','222',33,NULL);#id为9不是6
    *把记录删除后,即使id不连续,新插入的id仍然是已有的最大的id号加1而不是被删除的id加1

    查询表达式解析

    SELECT:

    SELECT select_expr [,select_expr...]
    [
      FROM table_references
      [WHERE where_condition]
      [GROUP BY {col_name | position} [ASC | DESC],...]
      [HAVING where_condition]
      [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

    • 每一个表达式表示想要的一列,必须有至少一个。
    • 多个列之间以英文逗号分隔。
    • 星号()表示所有列。tbl_name.可以表示命名表的所有列。
    • 查询表达式可以使用[AS] alias_name为其赋予别名。
    • 别名可以用于GROUP BY,ORDER BY或HAVING子句。

    SELECT id,username FROM users;#选择某一列或几列查询
    SELECT username,id FROM users;#顺序可以和原表中不同,SELECT的顺序影响查询结果中的顺序
    *表示所有列
    tbl_name.*可以表示命名表的所有列,如:
    SELECT users.id,users.username FROM users;#选择users表中的id和users表中的username
    对于单表查询,没有必要再字段前加上表名,如果以后使用到多表连接就会使用到,若果两张表存在相同的字段就不可以只写字段名了,这时就要使用表名.列名查询

    如果某些字段比较长,可以为其赋予别名
    SELECT id AS userid,username AS uname FROM users;#为id赋予别名userid,为username赋予别名uname
    字段别名也会影响到查询结果集
    别名中的AS可以使用,也可以不使用,建议使用SELECT查询时都加上AS,避免发生以下错误
    SELECT id username FROM users;#username别名和字段名相同,系统会认为是别名,结果只会产生一列id而且username是其别名

    where语句进行条件查询

    条件表达式WHERE

    • 对记录进行过滤,如果没有指定WHERE子句,则显示所有记录。
    • 在WHERE表达式中,可以使用MySQL支持的函数或运算符。

    group by语句对查询结果分组

    查询结果分组GROUP BY

    [GROUP BY {col_name | position} [ASC | DESC],...]

    ASC升序(默认),DESC降序,如果存在多个分组条件,之间用逗号分隔

    按照性别分组
    SELECT sex FROM users GROUP BY sex;#结果只有两个0和NULL

    Paste_Image.png
    分组除了写列名字还可以写位置
    SELECT sex FROM users GROUP BY 1;#1是指SELECT中第一个出现的字段
    一般建议指定列名称而不是位置,位置比较麻烦

    having语句设置分组条件

    分组条件:对部分记录进行分组

    分组条件HAVING

    [HAVING where_condition]

    SELECT sex FROM users GROUP BY 1 HAVING age>35;
    系统提示错误,因为在使用HAVING进行分组条件的指定时,一定要保证分组条件要么为一个聚合函数要么要保证HAVING 后的字段必须出现在SELECT所选择的列中,否则会出现错误
    SELECT sex,age FROM users GROUP BY 1 HAVING age>35;#HAVING 后的字段出现在SELECT所选择的列中了,没有任何结果,但是语法是正确的
    ``SELECT sex FROM users GROUP BY 1 HAVING count(id)>=2;#分组条件为聚合函数(只有一个返回结果的函数,如sum(),avg(),max(),min(),count())。结果就一个(sex分组中计算数目大于2的)`

    Paste_Image.png

    order by语句对插询结果排序

    对查询结果进行排序

    [ORDER BY {col_name | expr | position} [ASC | DESC],...]

    SELECT * FROM users ORDER BY id DESC;#按照id降序排列

    如果第一个字段的排序不能得出想要的结果,还可以再按照第二个字段排序:
    SELECT * FROM users OPDER BY age,id DESC;#先按照age降序排列,如果有相同的值再按id降序排列

    limit语句限制插询数量

    有两种语法结构限制返回数量,第一个比较常用
    第一种:

    限制查询结果返回的数量LIMIT

    [LIMIT {[offset,] row_count | row_count OFFSET offset}]

    SELECT * FROM users LIMIT 2;#从第一条开始返回,一共返回2条记录

    SELECT * FROM users LIMIT 3,2;#返回第4条和第5条记录,因为SELECT是从0开始编号的

    id的编号和SELECT所选择的记录的编号没有关系,如
    SELECT * FROM user ORDER BY id DESC LIMIT 2,2;#返回第7和第5条记录,而不是id为3和4 的记录

    再看INSERT SET语句:把选择的结果存储到指定的数据表

    插入记录INSERT

    INSERT [INTO] tbl_name SET col_name={expr | DEFAULT},...
    说明:与第一种凡是的区别在于,此方法可以使用子查询(SubQuery)

    CREATE TABLE test(
    id TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20)
    );
    

    从users表中选择数据插入到test表中:
    INSERT test SELECT username FROM users WHERE age>=30;#错误,因为test表中有两列,而选择出的结果只有一列
    应该修改为:
    INSERT test(username) SELECT username FROM users WHERE age>=30;#插入成功

    offset通常用于分页
    会使用这个语句进行分页:

    限制查询结果返回的数量LIMIT

    [LIMIT {[offset,] row_count | row_count OFFSET offset}]

    偏移值=(当前页码-1)每页所显示的记录数*

    小结

    Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png

    相关文章

      网友评论

          本文标题:第四章 操作数据表中的记录

          本文链接:https://www.haomeiwen.com/subject/qakbettx.html