zoukankan      html  css  js  c++  java
  • mysql第二天 数据的增删改查补充及外键

    1.主键的一些补充:

      1.1 一个表中只允许一个主键,但是多个列可以共同拥有一个主键:

      上节课内容学的命名主键的方式:(具有一定的约束条件,不能为空,并且不能重复)

    mysql> create table t2 (
        -> id int auto_increment primary key,
        -> name varchar(10));
    Query OK, 0 rows affected (0.02 sec)
    View Code

      1.2今天学到的主键命名方式(可以给多个列进行主键的设定)

    mysql> create table t3(
        -> id int auto_increment ,
        -> name varchar(10),
        -> primary key(id,name));
    Query OK, 0 rows affected (0.02 sec)
    View Code

      1.3外建的的mysql语句:(和上面创建的t3进行连接)

    create table t4(
        -> id int auto_increment primary key,
        -> department_id int,
        -> name varchar(10),
        -> constraint fk_t3_t4 foreign key(department_id) references t3(id));
    View Code

      1.4外键一次性和和另外一个表格中的多个主键进行连接:

    create table t5 (
        -> id int auto_increment primary key,
        -> department_id int,
        -> name varchar(10),
        -> constraint fk_t5_t3 foreign key (department_id, name) references t3(id,name));
    View Code

      1.5加上引擎 engine用于防止数据错乱 /或者说数据进行更改的过程中如果某一方更改失败可以回到:

    mysql> create table t6(
        -> id int not null,
        -> name char(10)) engine=innodb default charset=utf8;
    Query OK, 0 rows affected, 1 warning (0.02 sec)
    View Code

    2.外键里面的变种:

      1.每一个表格中只允许某一个变量只出现一次:unique指令:(如果values出现第二次插入就会报错)

    create table t4 (
        -> id int not null auto_increment primary key,
        -> name varchar(10),
        -> unique t4_uql(name));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into (name) value('alex');
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(name) value('alex')' at line 1
    mysql> insert into (name) values ('alex');
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(name) values ('alex')' at line 1
    mysql> insert into t4 (name) values ('alex');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t4 (name) values ('alex');
    ERROR 1062 (23000): Duplicate entry 'alex' for key 't4.t4_uql'
    View Code

      如果不适用unique的结果: 

    insert into t2(name) values('alex');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t2(name) values('alex');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from t2;
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    |  2 | alex |
    +----+------+
    2 rows in set (0.00 sec)
    View Code

      2.1 外键里面的一对一:

    mysql> create table t5(
        -> id int auto_increment primary key,
        -> department_id int not null unique,
        -> name char(10),
        -> constraint fk_t5_t4 foreign key (department_id) references t4(id));
    Query OK, 0 rows affected (0.02 sec)
    View Code

      2.2外键里面的一对多:

    mysql> create table userinfo(
        -> id int auto_increment primary key,
        -> name varchar(10),
        -> department_name varchar(10));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table depart1(
        -> id int auto_increment primary key,
        -> department_id int,
        -> unique dep_ul(department_id),
        -> constraint fk_user_depart1 foreign key(department_id) references userinfo(id));
    Query OK, 0 rows affected (0.02 sec)
    View Code

      2.3外键里面的多对多:

    ql> create table userinfo(
        -> id int auto_increment primary key,
        -> name varchar(10),
        -> department_name varchar(10));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table depart1(
        -> id int auto_increment primary key,
        -> department_id int,
        -> unique dep_ul(department_id),
        -> constraint fk_user_depart1 foreign key(department_id) references userinfo(id));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table teacherinfo (
        -> id int auto_increment primary key,
        -> name varchar(10),
        -> teacher_name varchar(10));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table teacher_user(
        -> id int auto_increment primary key,
        -> user_id int,
        -> teacher_id int,
        -> unique teach_user(user_id,teacher_id),
        -> constraint fk_user_t1 foreign key(user_id) references userinfo(id),
        -> constraint fk_teach_t1 foreign key (teacher_id) references teacherinfo(id));
    Query OK, 0 rows affected (0.03 sec)
    View Code

    3.对创建表时执行了哪些命令进行查询:

    mysql> show create table t3;
    +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                                                                                          |
    +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | t3    | CREATE TABLE `t3` (
      `id` int NOT NULL AUTO_INCREMENT,
      `name` varchar(10) NOT NULL,
      PRIMARY KEY (`id`,`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
    +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    View Code

      在看的过程中会有点乱但是也能找到关系量,为了更加美观的进行看可以在指令后面加一个G:    注:使用这个指令最后会报一个错可以忽略

           Table: t3
    Create Table: CREATE TABLE `t3` (
      `id` int NOT NULL AUTO_INCREMENT,
      `name` varchar(10) NOT NULL,
      PRIMARY KEY (`id`,`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    1 row in set (0.00 sec)
    
    ERROR:
    No query specified
    View Code

    4.我们在使用auto_increment 的指令时 如果使用delete清空表里面的数据时,它的id下一次会从删除最后一个id+1进行显示:可以使用下面这种方法及进行修改:

      1.先去查看表格中现在id 的值:

    show create table t2;
    +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                                                                                                        |
    +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | t2    | CREATE TABLE `t2` (
      `id` int NOT NULL AUTO_INCREMENT,
      `name` varchar(10) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
    View Code

      从上面我们可以看到AUTO_INCREMENT=3,但是我们下次id的值我们想要从5开始:可以使用下面方法:

    mysql> alter t2 auto_increment_increment=5;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't2 auto_increment_increment=5' at line 1
    mysql> alter table t2 auto_increment_increment=5;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'auto_increment_increment=5' at line 1
    mysql> alter table t2 auto_increment=5;
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> insert into t2(name) values('wusir');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select *from t2;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | alex  |
    |  2 | alex  |
    |  5 | wusir |
    +----+-------+
    3 rows in set (0.00 sec)
    View Code

    5.我们发现我们我们id在使用自增一的时候,每一次步长都是1,是否可以进行更改:

      1.会话更改:指的是:在你打开的这个命令框有效,关闭或者从新打开一个命令框就没有作用:

    mysql> show session variables like 'auto_inc%';   查看步长
    +--------------------------+-------+
    | Variable_name            | Value |
    +--------------------------+-------+
    | auto_increment_increment | 1     |
    | auto_increment_offset    | 1     |
    +--------------------------+-------+
    2 rows in set, 1 warning (0.00 sec)
    
    mysql> set session auto_increment_increment =2;  设置步长
    Query OK, 0 rows affected (0.00 sec)
    View Code  
    mysql> select *from t2;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | alex  |
    |  2 | alex  |
    |  5 | wusir |
    +----+-------+
    3 rows in set (0.00 sec)
    
    mysql> insert into t2(name) values('wusi1r');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select *from t2;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | alex   |
    |  2 | alex   |
    |  5 | wusir  |
    |  7 | wusi1r |
    +----+--------+
    4 rows in set (0.00 sec)
    View Code

      2.如果我们想要每次启动sql都想使用此步长,则需要使用global(全局变量)

    mysql> set global auto_increment_increment=2;
    Query OK, 0 rows affected (0.00 sec)
    View Code

    6.昨天增添改删的补充:

      1.增加数据:

        1.每次增加一个数据:

    insert into t2 (name) values('alex');
    Query OK, 1 row affected (0.05 sec)
    
    mysql> select *from t2;
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    +----+------+
    1 row in set (0.00 sec)
    View Code

        2.每次增加多个数据:每个values之后面用逗号进行隔开:

     insert into t2(name) values('1'),('2'),('3');
    Query OK, 3 rows affected (0.01 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> select *from t2;
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    |  3 | 1    |
    |  5 | 2    |
    |  7 | 3    |
    +----+------+
    4 rows in set (0.00 sec)
    View Code

        3。如果新创建一个新表想要把另一个表格中的所有数据全部复制过来·:

     insert into t6 (id,name) from table t2(id,name);
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from table t2(id,name)' at line 1
    mysql> insert into t6(id,name) select id ,name from t2;
    Query OK, 4 rows affected (0.05 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql> select * from t6;
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    |  3 | 1    |
    |  5 | 2    |
    |  7 | 3    |
    +----+------+
    View Code

      2.删除数据:可以选择条件:

    mysql> select * from t6;
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    |  3 | 1    |
    |  5 | 2    |
    |  7 | 3    |
    +----+------+
    4 rows in set (0.00 sec)
    
    mysql> delete from t6 where id>3;
    Query OK, 2 rows affected (0.00 sec)
    
    mysql> select * from t6;
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    |  3 | 1    |
    +----+------+
    2 rows in set (0.00 sec)
    View Code

      3.数据更新:也可以进行条件更新:

    mysql> select * from t6;
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    |  3 | 1    |
    +----+------+
    2 rows in set (0.00 sec)
    
    mysql> update t6 set name='wusir'where id=3;
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from t6;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | alex  |
    |  3 | wusir |
    +----+-------+
    2 rows in set (0.00 sec)
    View Code

      4.数据的查看:

        1.查看所有数据:

    mysql> select *from t2;
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    |  3 | 1    |
    |  5 | 2    |
    |  7 | 3    |
    +----+------+
    4 rows in set (0
    View Code

        2.查看带条件的数据:

    mysql> select *from t2 where id >3 ;
    +----+------+
    | id | name |
    +----+------+
    |  5 | 2    |
    |  7 | 3    |
    +----+------+
    2 rows in set (0.00 sec)
    View Code

        3.如果要看某几个数据可以使用in语法:

    mysql> select * from t2 where id in (1,3,5);
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    |  3 | 1    |
    |  5 | 2    |
    +----+------+
    3 rows in set (0.00 sec)
    View Code

        4not in 除了他以外的数据都显示出来:

    mysql> select * from t2 where id not in (1,3,5);
    +----+------+
    | id | name |
    +----+------+
    |  7 | 3    |
    +----+------+
    1 row in set (0.00 sec)
    View Code

         5.如果想要查看某个范围内的·数据:可以使用between...and

    mysql> select * from t2 where id between 1 and 5;
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    |  3 | 1    |
    |  5 | 2    |
    +----+------+
    3 rows in set (0.00 sec)
    View Code

          6.查看两个表中共同拥有的数据:

    mysql> select * from t2 where id in (select id from t6) ;
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    |  3 | 1    |
    +----+------+
    2 rows in set (0.01 sec)
    View Code

          7.通配字符查找:

            1.a% 寻找以a开头 后面n个字符的所有符合条件的行

    mysql> select * from t6 where name like '1%';
    +----+------+
    | id | name |
    +----+------+
    |  1 | 11   |
    |  3 | 123  |
    |  5 | 13   |
    +----+------+
    3 rows in set (0.00 sec)
    View Code

            2.a_ x寻找以a开头 后面1个字符的所有符合条件的行

    mysql> select * from t6 where name like '1_';
    +----+------+
    | id | name |
    +----+------+
    |  1 | 11   |
    |  5 | 13   |
    +----+------+
    2 rows in set (0.00 sec)
    View Code

           8.限制字符:

                                   1每次显示:n个表格的数据:

    mysql> select * from t2 limit 2;
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    |  3 | 1    |
    +----+------+
    View Code

               2.设置每次开始的位置 limit (开始的位置,显示数据的个数)行数从0开始

    mysql> select * from t2 limit 2, 2;
    +----+------+
    | id | name |
    +----+------+
    |  5 | 2    |
    |  7 | 3    |
    +----+------+
    2 rows in set (0.00 sec)
    View Code
    mysql> select *from t2 limit 2,offset 2;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2' at line 1
    mysql> select * from t2 limit 2 offset 2;
    +----+------+
    | id | name |
    +----+------+
    |  5 | 2    |
    |  7 | 3    |
    +----+------+
    2 rows in set (0.00 sec)
    View Code

            3如果想要倒着取数据想要获取最后n个数据:

                1.把数据进行反转:desc

    mysql> select * from t2  where id order by id desc;
    +----+------+
    | id | name |
    +----+------+
    |  7 | 3    |
    |  5 | 2    |
    |  3 | 1    |
    |  1 | alex |
    +----+------+
    4 rows in set (0.00 sec)
    
    mysql>
    View Code

                2.把数据进行·正传:

    mysql> select * from t2  where id order by id asc;
    +----+------+
    | id | name |
    +----+------+
    |  1 | alex |
    |  3 | 1    |
    |  5 | 2    |
    |  7 | 3    |
    +----+------+
    4 rows in set (0.00 sec)
    View Code

                3.使用多重判断结构进行判断·

    mysql> select * from t10 order by id desc,   name asc;
    +------+------+
    | id   | name |
    +------+------+
    |    5 |    5 |
    |    4 |    4 |
    |    2 |    3 |
    |    1 |    1 |
    |    1 |    2 |
    |    1 |    3 |
    +------+------+
    6 rows in set (0.00 sec)
    View Code

    2.进行两个通过外键数据在同一行进行显示:

      1.第一种方法:

    mysql> select * from t1,t2 where t1.id =t2.department_id;
    +----+-----------------+----+------+---------------+
    | id | department_name | id | name | department_id |
    +----+-----------------+----+------+---------------+
    |  1 | 12              |  9 | jin  |             1 |
    |  5 | 11              | 11 | jinf |             5 |
    |  3 | 133             | 13 | iuf  |             3 |
    |  7 | 22              | 15 | jinn |             7 |
    +----+-----------------+----+------+---------------+
    4 rows in set (0.00 sec)
    View Code

      2.第二种方法:使用left方法:(左边的全部显示,右边没有的显示null)

    mysql> select * from t1 left join t2 on t1.id =t2.department_id;
    +----+-----------------+------+------+---------------+
    | id | department_name | id   | name | department_id |
    +----+-----------------+------+------+---------------+
    |  1 | 12              |    9 | jin  |             1 |
    |  3 | 133             |   13 | iuf  |             3 |
    |  5 | 11              |   11 | jinf |             5 |
    |  7 | 22              |   15 | jinn |             7 |
    |  9 | 11              | NULL | NULL |          NULL |
    +----+-----------------+------+------+---------------+
    5 rows in set (0.00 sec)
    View Code

      3.第三种方法:使用right方法:(右边的全部显示,左边没有的显示null,多余的不显示)

    | id   | department_name | id | name | department_id |
    +------+-----------------+----+------+---------------+
    |    1 | 12              |  9 | jin  |             1 |
    |    5 | 11              | 11 | jinf |             5 |
    |    3 | 133             | 13 | iuf  |             3 |
    |    7 | 22              | 15 | jinn |             7 |
    +------+-----------------+----+------+---------------+
    4 rows in set (0.00 sec)
    View Code

    7分组:

      1.想要查看某个部门共有多少个人:

     select count(department_name),department_name from t1 group by department_name;
    +------------------------+-----------------+
    | count(department_name) | department_name |
    +------------------------+-----------------+
    |                      1 | 12              |
    |                      1 | 133             |
    |                      2 | 11              |
    |                      1 | 22              |
    +------------------------+-----------------+
    4 rows in set (0.00 sec)
    View Code

      2。想要要使用某个id的最大值作为标号:

    mysql> select max(id),department_name from t1 group by department_name;
    +---------+-----------------+
    | max(id) | department_name |
    +---------+-----------------+
    |       1 | 12              |
    |       3 | 133             |
    |       9 | 11              |
    |       7 | 22              |
    +---------+-----------------+
    4 rows in set (0.00 sec)
    View Code

      3.如果想要对聚合元素进行二次筛选必须使用关键字having

    mysql> select count(department_name),department_name from t1 group by department_name having count(department_name)>2;
    +------------------------+-----------------+
    | count(department_name) | department_name |
    +------------------------+-----------------+
    |                      3 | 11              |
    +------------------------+-----------------+
    1 row in set (0.00 sec)
    View Code

    8作业:

    mysql> create table class(
        -> cid int auto_increment primary key,
        -> name varchar(10)) engine=innodb  default charset=utf8;
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    
    mysql> create table student (
        -> sid int auto_increment primary key,
        -> sname varcahr(10),
        -> gener varchar(10),
        -> class_id int,
        -> constraint fk_class_student foreign key(class_id) references  class(cid));
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'varcahr(10),
    gener varchar(10),
    class_id int,
    constraint fk_class_student foreig' at line 3
    mysql> create table student (
        -> sid int auto_increment primary key,
        -> sname varcahr(10),
        -> gener varchar(10),
        -> ;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'varcahr(10),
    gener varchar(10),' at line 3
    mysql> create table student (
        -> sid int auto_increment primary key,
        -> sname varchar(10),
        -> gener varchar(10),
        -> class_id int,
        -> constraint fk_class_student foreign key(class_id) references  class(cid));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table teacher (
        -> tid int auto_increment primary key,
        -> tname varchar(10));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table course(
        -> cid int auto_increment primary key,
        -> cname varchar(10),
        -> teacher_id int,
        -> constraint fk_course_teacher foreign key(cid) references teacher(tid));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table score (
        -> sid int auto_increment primary key,
        -> student_id int,
        -> corse_id int,
        -> number int,
        -> constraint fk_score_student foreign key(student_id) references student(sid),
        -> constraint fk_score_corse foreign key(corse_id) references course(cid));
    Query OK, 0 rows affected (0.03 sec)
    
    mysql>
    View Code
  • 相关阅读:
    Vue(小案例_vue+axios仿手机app)_go实现退回上一个路由
    nyoj 635 Oh, my goddess
    nyoj 587 blockhouses
    nyoj 483 Nightmare
    nyoj 592 spiral grid
    nyoj 927 The partial sum problem
    nyoj 523 亡命逃窜
    nyoj 929 密码宝盒
    nyoj 999 师傅又被妖怪抓走了
    nyoj 293 Sticks
  • 原文地址:https://www.cnblogs.com/ab461087603/p/12701075.html
Copyright © 2011-2022 走看看