数据表的操作

数据库表的操作

创建表   

  CREATE TABLE tab_name(
  filed1 TYPE [约束条件], /*名字,类型,每项用逗号隔开*/
  filed2 TYPE
  );
  约束条件:
    PRIMARY KEY (非空且唯一,能够唯一区分当前内容的字段称之为主键)
    UNIQUE
    NOT NULL
    AUTO_INCREMENT (主键字段必须为数字类型)
    外键约束 foreign key

查看表

  desc tab_name;   /*查看表结构*/
  show columns from tab_name;    /*查看表结构*/
  show tables;   /*查看当天数据库中所有的表*/
  show create table tab_name;    /*查看创建表的代码语句*/

  数据表的操作_第1张图片

修改表的结构 

  增加字段
    alter table tab_name add 列名 约束条件 [frist|after 字段名]     /*把新增的字段放到某个字段前或后*/
  增加多个字段
    alter table tab_name add 列名1,
    add 列名2;
  删除字段
    alter table tab_name drop 列名;
  删除多个字段
    alter table tab_name drop 列名1,
    drop 列名2;
  删除表
    drop table tab_name;
  修改字段
    alter table tab_name modify 列名 类型 约束条件 first|after 字段名;          -- 改类型
    alter table tab_name change 列名 新列名 类型 约束条件 first|after 字段名;        -- 改列名
  修改表名
    rename table 表名 to 新表名
  修改表用的字符集
    alter table tab_name character set utf8
  删除主键
    alter table tab_name modify 列名 类型;
    alter table tab_name drop primary key;    -- 两句合在一起才会生效

表记录的增删改查

  增加一条记录
    insert [into] tab_name (filed1,filed2....) values (value1,value2,....);
    注意字段名和值要一一对应
  增加多条记录
    insert [into] tab_name (filed1,filed2....) values (value1,value2,....),
                         (value1,value2,....);
    /*多条记录用逗号隔开*/
  set 插入
    insert [into] tab_name set name=value; -- 通过键值对插入

  数据表的操作_第2张图片
  修改表记录
    update tab_name set filed1=value1,filed2=value2,.... [where 语句];
    update tab_name set filed1=filed1+value [where 语句];
    /*
    *update 可以将每行的各列更新新值替换原有的值
    *也可以在原有的基础上再加减变动调整
    *where 指定更新哪些行,如果不加where语句,则更新全部行
    */

   数据表的操作_第3张图片

  删除表记录
    delete from tab_name [where filed1=value1 or filed2=value2];
    /*
    *如果不加where语句,则删除整张表中的数据
    *注意delete不能删除表,删除表用drop
    *truncate table 也可以删除整张表的数据,此语句首先是摧毁表,再建新表,不可在事务中恢复
    */

  查看表记录
    select [distinct] *|filed1,field2... from tab_name;
      -- 查看表记录,*代表所有
      -- distinct代表剔除重复项
    select name,age+10 from tab_name;
    select name as 姓名,age+10 as 年龄 from tab_name;
      -- 将查询到的结果加10,注意只是显示出加10,库中的表数据还是原来的
      -- 字段名 as 别名,将字段用别名显示出来
    select * from tab_name where field1=value1;
      -- 通过where语句过滤出符合的
      /*
      *where中的运算符
      * 比较运算符:> < >= <= !=
      * between value and value     not between value and value
      * in(value1,value2,...)     not in      在指定的值中
      * like 'ss'%           not like%    搜索匹配,%代表后面可有任意字符 _ 代表一个字符
      * is null              is not null      空值判断
      * and not or              且 非 或
      */

      例:select age from tab_name where between 15 and 25; 

    order by 字段名 [asc|desc] -- 排序[正序|倒序]
      例:select name from tab_name order by name;
    group by -- 分组
      注意:按照分组条件分组
        后面接字段名
      例:select name from tab_name group by name;
      having语句,过滤符合条件的,分组后过滤
      例:select name from tab_name group by name having sum(总成绩)>80;

        --  按 name 分组后,再过滤出总成绩大于80的
      /*
      *sum 聚合函数
      *where语句可以用的地方,having也可以
      *where是先过滤再计算,having是先分组再过滤
      *where不能使用聚合函数
      */

  聚合函数
    count(字段名)     --  统计个数,注意它不能统计null
      select count(ifnull(成绩,0)) from tab_name;
        --  如果要统计null,用ifnull将null转换成0
    sum() -- 求和
    avg() -- 平均值
    max(),min() -- 不统计null
  正则表达式查询
    select * from tab_name where name RegExp '^ss';

外键约束

设置外键:在创建子表时
  [CONSTRAINT 外键名] FOREIGN KEY (子表字段名) REFERENCES 主表名(主表字段名);
  -- 注意:用外键约束的子表字段名要和关联的主表字段名数据类型相同

已经创建好表之后额外增加外键和删除外键
  ALTER TABLE 子表名 ADD CONSTRAINT 外键名
                FOREIGN KEY (子表字段名)
                REFERENCES 主表名(主表字段名);
  ALTER TABLE 表名 DROP FOREIGN KEY 外键名

外键作用:
  对子表:在主表中找不到对应的候选键,则不允许update/insert
  对主表:如果子表关联了主表的相应字段,则主表的这个字段不能update/delete

级联删除:
  主子表关联时不能随便删除,可以在子表添加外键约束时
  CONSTRAINT 外键名 FOREIGN KEY (子表字段名) REFERENCES 主表(主表字段名)
                         ON DELETE CASCADE;
  -- 设置级联删除后,主表删除时会将子表的相应的也删除

SET NULL 方式:
  外键约束加上:ON DELETE SET NULL;
  -- 主表删除后,子表不会删除,但关联的相应字段会变成null

restrict方式:拒绝对主表删除操作
no action方式:在mysql中与restrict作用相同,拒绝对主表删除/更新操作

多表操作

创建两张表

CREATE TABLE tableA(
      id TINYINT PRIMARY KEY AUTO_INCREMENT NOT NULL,
      name VARCHAR(25)
);
CREATE TABLE tableB(
      id TINYINT PRIMARY KEY NOT NULL AUTO_INCREMENT,
      class VARCHAR(25),
      tA_id TINYINT
);
INSERT INTO tableA (id,name) VALUES (1,'ss'),
      (2,'yy'),
      (3,'zz');

INSERT INTO tableB (class,tA_id) VALUES ('class1',2),
      ('class2',1),
      ('class3',4);

数据表的操作_第4张图片数据表的操作_第5张图片

笛卡尔积查询:
  select * from tableA,tableB;
  将两张表以行*行的形式全部显示出来

数据表的操作_第6张图片

内连接:
  select * from tableA,tableB where tableA.id=tableB.tA_id;
  select * from tableA inner join tableB on tableA.id=tableB.tA_id;
  两种方式结果相同,根据过滤条件查询出两表对应的部分

数据表的操作_第7张图片

外连接:
  select * from tableA left join tableB on tableA.id=tableB.tA_id;
  select * from tableA right join tableB on tableA.id=tableB.tA_id;
  -- left join:以左边的表为基准显示,左边表若与右边表没有对应的则显示null
  -- right join:以右边表为基准显示,右边表若与左边表没有对应的则显示null
  -- tableA left join tableB与tableB right join tableA结果相同

数据表的操作_第8张图片

全外连接:
  full join:mysql不支持
  可以用union将左右连接结合模拟出full join
  select * from tableA left join tableB on tableA.id=tableB.tA_id
  UNION
  select * from tableA right join tableB on tableA.id=tableB.tA_id;

数据表的操作_第9张图片

 mysql索引

索引:键,创建索引会消耗时间和磁盘空间,但会大大的缩减查询时间

索引分为普通索引,唯一索引(unique),全文索引(fulltext),空间索引(spatial),多列索引,主键索引(primary)

可以在创建表的时候直接设置索引

CREATE TABLE 表名(
  字段名 数据类型 [完整性约束条件],
  字段名 数据类型 [完整性约束条件],
  [UNIQUE|FULLTEXT|SPATIAL] INDEX [索引名] (字段名[(长度)]) 
);

如创建一个普通索引

CREATE TABLE t1(
            id TINYINT NOT NULL,
            name VARCHAR(25),
            INDEX index_name (name) 
            );

在表已经存在的时候添加索引

  CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX [索引名] ON 表名(字段名[(长度)]);

  ALTER TABLE 表名 ADD INDEX [索引名] (字段名[(长度)]);

  例:CREATE INDEX index_name ON t1(name);

删除索引

  DROP INDEX 索引名 ON 表名

你可能感兴趣的:(数据表的操作)