• MySQL基本操作


    #显示所有的数据库

    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | db                 |
    | db_utf             |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+

    #创建数据库

    MariaDB [(none)]> create database s18;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | db                 |
    | db_utf             |
    | mysql              |
    | performance_schema |
    | s18                |
    | test               |
    +--------------------+

    #查看数据库的创建信息

    MariaDB [(none)]> show create database s18;
    +----------+----------------------------------------------------------------+
    | Database | Create Database                                                |
    +----------+----------------------------------------------------------------+
    | s18      | CREATE DATABASE `s18` /*!40100 DEFAULT CHARACTER SET latin1 */ |
    +----------+----------------------------------------------------------------+
    
    MariaDB [(none)]> create database s18_2 character set utf8;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | db                 |
    | db_utf             |
    | mysql              |
    | performance_schema |
    | s18                |
    | s18_2              |
    | test               |
    +--------------------+
    
    MariaDB [(none)]> show create database s18_2;
    +----------+----------------------------------------------------------------+
    | Database | Create Database                                                |
    +----------+----------------------------------------------------------------+
    | s18_2    | CREATE DATABASE `s18_2` /*!40100 DEFAULT CHARACTER SET utf8 */ |
    +----------+----------------------------------------------------------------+

    #修改数据库字符集编码

    MariaDB [(none)]> alter database s18 character set utf8;
    Query OK, 1 row affected (0.01 sec)

    #删除数据库

    MariaDB [(none)]> drop database s18_2;
    Query OK, 0 rows affected (0.00 sec)

    #使用数据库

    MariaDB [(none)]> use s18;
    Database changed

    #查看当前使用的数据库

    MariaDB [s18]> select database();
    +------------+
    | database() |
    +------------+
    | s18        |
    +------------+

    数据表操作

    #创建表

    MariaDB [s18]> create table c1(
        ->     name varchar(20),
        ->     age int);
    Query OK, 0 rows affected (0.01 sec)

    #查看表结构

    MariaDB [s18]> desc c1;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | name  | varchar(20) | YES  |     | NULL    |       |
    | age   | int(11)     | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+

    #查看所有字段

    MariaDB [s18]> select * from c1;
    Empty set (0.00 sec)

    #查看当前数据库下的所有表

    MariaDB [s18]> show tables;
    +---------------+
    | Tables_in_s18 |
    +---------------+
    | c1            |
    +---------------+

    #查看数据库的创建表信息

    MariaDB [s18]> show create table c1G
    *************************** 1. row ***************************
           Table: c1
    Create Table: CREATE TABLE `c1` (
      `name` varchar(20) DEFAULT NULL,
      `age` int(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)

    #添加新字段

    MariaDB [s18]> alter table c1 add salary float NOT NULL;
    Query OK, 0 rows affected (0.01 sec)               
    
    MariaDB [s18]> desc c1;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | name   | varchar(20) | YES  |     | NULL    |       |
    | age    | int(11)     | YES  |     | NULL    |       |
    | salary | float       | NO   |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+

    完整性约束

    1.主键约束

    primary key:非空(not null)且唯一(unique)

    MariaDB [s18]> alter table c1 add id int first;
    Query OK, 0 rows affected (0.01 sec)       
    
    MariaDB [s18]> desc c1;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | YES  |     | NULL    |       |
    | name   | varchar(20) | YES  |     | NULL    |       |
    | age    | int(11)     | YES  |     | NULL    |       |
    | salary | float       | NO   |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+

    #修改字段

    MariaDB [s18]> alter table c1 modify id int primary key auto_increment first;
    Query OK, 0 rows affected (0.01 sec) 
    
    MariaDB [s18]> desc c1;
    +--------+-------------+------+-----+---------+----------------+
    | Field  | Type        | Null | Key | Default | Extra          |
    +--------+-------------+------+-----+---------+----------------+
    | id     | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name   | varchar(20) | YES  |     | NULL    |                |
    | age    | int(11)     | YES  |     | NULL    |                |
    | salary | float       | NO   |     | NULL    |                |
    +--------+-------------+------+-----+---------+----------------+

    #更改表名

    MariaDB [s18]> alter table c1 change name names varchar(20);
    Query OK, 0 rows affected (0.01 sec)  
    
    MariaDB [s18]> desc c1;
    +--------+-------------+------+-----+---------+----------------+
    | Field  | Type        | Null | Key | Default | Extra          |
    +--------+-------------+------+-----+---------+----------------+
    | id     | int(11)     | NO   | PRI | NULL    | auto_increment |
    | names  | varchar(20) | YES  |     | NULL    |                |
    | age    | int(11)     | YES  |     | NULL    |                |
    | salary | float       | NO   |     | NULL    |                |
    +--------+-------------+------+-----+---------+----------------+

    #删除表字段

    MariaDB [s18]> alter table c1 drop names;
    Query OK, 0 rows affected (0.01 sec) 
    
    MariaDB [s18]> desc c1;
    +--------+---------+------+-----+---------+----------------+
    | Field  | Type    | Null | Key | Default | Extra          |
    +--------+---------+------+-----+---------+----------------+
    | id     | int(11) | NO   | PRI | NULL    | auto_increment |
    | age    | int(11) | YES  |     | NULL    |                |
    | salary | float   | NO   |     | NULL    |                |
    +--------+---------+------+-----+---------+----------------+

    #删除表
    drop table table_name;

    表记录操作

    MariaDB [s18]> create table emp(
        ->     id int primary key auto_increment,
        ->     name varchar(20),
        ->     gender tinyint,
        ->     bir date,
        ->     salary float(6,2),
        ->     dep varchar(20));
    Query OK, 0 rows affected (0.01 sec)
    
    MariaDB [s18]> desc emp;
    +--------+-------------+------+-----+---------+----------------+
    | Field  | Type        | Null | Key | Default | Extra          |
    +--------+-------------+------+-----+---------+----------------+
    | id     | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name   | varchar(20) | YES  |     | NULL    |                |
    | gender | tinyint(4)  | YES  |     | NULL    |                |
    | bir    | date        | YES  |     | NULL    |                |
    | salary | float(6,2)  | YES  |     | NULL    |                |
    | dep    | varchar(20) | YES  |     | NULL    |                |
    +--------+-------------+------+-----+---------+----------------+

    1.增加表记录

    MariaDB [s18]> insert emp (id,name,gender,bir,salary,dep) values
        ->                    (1,'tom',1,'1989-12-12',99.99,'安保部');
    
    MariaDB [s18]> select * from emp;
    +----+------+--------+------------+--------+-----------+
    | id | name | gender | bir        | salary | dep       |
    +----+------+--------+------------+--------+-----------+
    |  1 | tom  |      1 | 1989-12-12 |  99.99 | 安保部    |
    +----+------+--------+------------+--------+-----------+
    
    MariaDB [s18]> insert emp (id,name,gender,bir,salary,dep) values 
        ->                    (2,'jerry',0,'1986-12-12',199.99,'安保部'),
        ->                    (3,'peter',1,'1988-12-12',2299.99,'高管部');
    Query OK, 2 rows affected (0.00 sec)
    
    MariaDB [s18]> select * from emp;
    +----+-------+--------+------------+---------+-----------+
    | id | name  | gender | bir        | salary  | dep       |
    +----+-------+--------+------------+---------+-----------+
    |  1 | tom   |      1 | 1989-12-12 |   99.99 | 安保部    |
    |  2 | jerry |      0 | 1986-12-12 |  199.99 | 安保部    |
    |  3 | peter |      1 | 1988-12-12 | 2299.99 | 高管部    |
    +----+-------+--------+------------+---------+-----------+

    #使用set也可以插入记录

    MariaDB [s18]> insert emp set name='prog',gender=1,bir='1990-04-12',salary=8000,dep='教学部';
    
    MariaDB [s18]> select * from emp;
    +----+-------+--------+------------+---------+-----------+
    | id | name  | gender | bir        | salary  | dep       |
    +----+-------+--------+------------+---------+-----------+
    |  1 | tom   |      1 | 1989-12-12 |   99.99 | 安保部    |
    |  2 | jerry |      0 | 1986-12-12 |  199.99 | 安保部    |
    |  3 | peter |      1 | 1988-12-12 | 2299.99 | 高管部    |
    |  4 | prog  |      1 | 1990-04-12 | 8000.00 | 教学部    |
    +----+-------+--------+------------+---------+-----------+

    2.修改表记录

    MariaDB [s18]> update emp set salary=300 where name='peter';
    
    MariaDB [s18]> select * from emp;
    +----+-------+--------+------------+---------+-----------+
    | id | name  | gender | bir        | salary  | dep       |
    +----+-------+--------+------------+---------+-----------+
    |  1 | tom   |      1 | 1989-12-12 |   99.99 | 安保部    |
    |  2 | jerry |      0 | 1986-12-12 |  199.99 | 安保部    |
    |  3 | peter |      1 | 1988-12-12 |  300.00 | 高管部    |
    |  4 | prog  |      1 | 1990-04-12 | 8000.00 | 教学部    |
    +----+-------+--------+------------+---------+-----------+

    3.删除表记录

    MariaDB [s18]> delete from emp where id=2;
    
    MariaDB [s18]> select * from emp;
    +----+-------+--------+------------+---------+-----------+
    | id | name  | gender | bir        | salary  | dep       |
    +----+-------+--------+------------+---------+-----------+
    |  1 | tom   |      1 | 1989-12-12 |   99.99 | 安保部    |
    |  3 | peter |      1 | 1988-12-12 |  300.00 | 高管部    |
    |  4 | prog  |      1 | 1990-04-12 | 8000.00 | 教学部    |
    +----+-------+--------+------------+---------+-----------+

    #清空表记录
    1.delete from table_name
    2.truncate table_name --> 适用于数据量非常大的表

    MariaDB [s18]> truncate emp;
    
    MariaDB [s18]> select * from emp;
    Empty set (0.00 sec)

    4.查询表记录

    MariaDB [s18]> drop table emp;
    
    MariaDB [s18]> create table emp(
        -> id      int primary key auto_increment,
        -> name    varchar(20),
        -> gender  enum('male','female','other'),
        -> age     tinyint,
        -> dep     varchar(20),
        -> city    varchar(20),
        -> salary  double(7,2));
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [s18]> insert into emp (name,gender,age,dep,city,salary) values
        ->                         ('tom','male',24,'教学部','河北省',8000),
        ->                         ('jerry','male',34,'保安部','山东省',8000),
        ->                         ('peter','male',28,'保安部','山东省',10000),
        ->                         ('景丽阳','female',22,'教学部','北京',9000),
        ->                         ('张三','male',24,'教学部','河北省',6000),
        ->                         ('李四','male',32,'保安部','北京',12000),
        ->                         ('王五','male',38,'教学部','河北省',7000),
        ->                         ('赵六','male',28,'保安部','河北省',9000),
        ->                         ('猪七','female',24,'保洁部','北京',9000);
    Query OK, 9 rows affected (0.01 sec)
    
    MariaDB [s18]> select * from emp;
    +----+-----------+--------+------+-----------+-----------+----------+
    | id | name      | gender | age  | dep       | city      | salary   |
    +----+-----------+--------+------+-----------+-----------+----------+
    |  1 | tom       | male   |   24 | 教学部    | 河北省    |  8000.00 |
    |  2 | jerry     | male   |   34 | 保安部    | 山东省    |  8000.00 |
    |  3 | peter     | male   |   28 | 保安部    | 山东省    | 10000.00 |
    |  4 | 景丽阳    | female |   22 | 教学部    | 北京      |  9000.00 |
    |  5 | 张三      | male   |   24 | 教学部    | 河北省    |  6000.00 |
    |  6 | 李四      | male   |   32 | 保安部    | 北京      | 12000.00 |
    |  7 | 王五      | male   |   38 | 教学部    | 河北省    |  7000.00 |
    |  8 | 赵六      | male   |   28 | 保安部    | 河北省    |  9000.00 |
    |  9 | 猪七      | female |   24 | 保洁部    | 北京      |  9000.00 |
    +----+-----------+--------+------+-----------+-----------+----------+
    
    MariaDB [s18]> select name,salary from emp;
    +-----------+----------+
    | name      | salary   |
    +-----------+----------+
    | tom       |  8000.00 |
    | jerry     |  8000.00 |
    | peter     | 10000.00 |
    | 景丽阳    |  9000.00 |
    | 张三      |  6000.00 |
    | 李四      | 12000.00 |
    | 王五      |  7000.00 |
    | 赵六      |  9000.00 |
    | 猪七      |  9000.00 |
    +-----------+----------+
    
    MariaDB [s18]> select name as 姓名,salary as 薪水 from emp;  # as 可以省略  MariaDB [s18]> select name 姓名,salary 薪水 from emp;
    
    +-----------+----------+
    | 姓名      | 薪水     |
    +-----------+----------+
    | tom       |  8000.00 |
    | jerry     |  8000.00 |
    | peter     | 10000.00 |
    | 景丽阳    |  9000.00 |
    | 张三      |  6000.00 |
    | 李四      | 12000.00 |
    | 王五      |  7000.00 |
    | 赵六      |  9000.00 |
    | 猪七      |  9000.00 |
    +-----------+----------+
    
    MariaDB [s18]> select name from emp where age>20;
    +-----------+
    | name      |
    +-----------+
    | tom       |
    | jerry     |
    | peter     |
    | 景丽阳    |
    | 张三      |
    | 李四      |
    | 王五      |
    | 赵六      |
    | 猪七      |
    +-----------+
    
    MariaDB [s18]> select name,age from emp where age>20;
    +-----------+------+
    | name      | age  |
    +-----------+------+
    | tom       |   24 |
    | jerry     |   34 |
    | peter     |   28 |
    | 景丽阳    |   22 |
    | 张三      |   24 |
    | 李四      |   32 |
    | 王五      |   38 |
    | 赵六      |   28 |
    | 猪七      |   24 |
    +-----------+------+
    
    MariaDB [s18]> select name,age from emp where age between 20 and 30;
    +-----------+------+
    | name      | age  |
    +-----------+------+
    | tom       |   24 |
    | peter     |   28 |
    | 景丽阳    |   22 |
    | 张三      |   24 |
    | 赵六      |   28 |
    | 猪七      |   24 |
    +-----------+------+
    
    MariaDB [s18]> select name,age from emp where name like '张%';
    +--------+------+
    | name   | age  |
    +--------+------+
    | 张三   |   24 |
    +--------+------+
    
    MariaDB [s18]> insert emp set name='张无忌';
    
    MariaDB [s18]> select name,age from emp where name like '张%';
    +-----------+------+
    | name      | age  |
    +-----------+------+
    | 张三      |   24 |
    | 张无忌    | NULL |
    +-----------+------+
    
    一个_代表一个符号
    
    MariaDB [s18]> select name,age from emp where name like '张_';
    +--------+------+
    | name   | age  |
    +--------+------+
    | 张三   |   24 |
    +--------+------+
    1 row in set (0.00 sec)
    
    MariaDB [s18]> select name,age from emp where name like '张__';
    +-----------+------+
    | name      | age  |
    +-----------+------+
    | 张无忌    | NULL |
    +-----------+------+
    1 row in set (0.00 sec)
    
    MariaDB [s18]> select name,age from emp where gender='male' and age>25;
    +--------+------+
    | name   | age  |
    +--------+------+
    | jerry  |   34 |
    | peter  |   28 |
    | 李四   |   32 |
    | 王五   |   38 |
    | 赵六   |   28 |
    +--------+------+
    View Code

    分组查询group by

    MariaDB [s18]> delete from emp where name='张无忌';
    
    MariaDB [s18]> select * from emp group by dep;
    +----+--------+--------+------+-----------+-----------+---------+
    | id | name   | gender | age  | dep       | city      | salary  |
    +----+--------+--------+------+-----------+-----------+---------+
    |  2 | jerry  | male   |   34 | 保安部    | 山东省    | 8000.00 |
    |  9 | 猪七   | female |   24 | 保洁部    | 北京      | 9000.00 |
    |  1 | tom    | male   |   24 | 教学部    | 河北省    | 8000.00 |
    +----+--------+--------+------+-----------+-----------+---------+
    
    此表是显示的每个部门的第一个人的信息,没有用处
    
    MariaDB [s18]> select dep from emp group by dep;
    +-----------+
    | dep       |
    +-----------+
    | 保安部    |
    | 保洁部    |
    | 教学部    |
    +-----------+
    
    MariaDB [s18]> select count(name) from emp group by dep;
    +-------------+
    | count(name) |
    +-------------+
    |           4 |
    |           1 |
    |           4 |
    +-------------+
    MariaDB [s18]> select count(*) from emp group by dep;    # 都可以
    使用聚合函数查看每个部门的总的人数
    
    MariaDB [s18]> select dep,count(*) from emp group by dep;
    +-----------+----------+
    | dep       | count(*) |
    +-----------+----------+
    | 保安部    |        4 |
    | 保洁部    |        1 |
    | 教学部    |        4 |
    +-----------+----------+
    
    每个部门具体的人数
    
    MariaDB [s18]> select dep,max(salary) from emp group by dep;
    +-----------+-------------+
    | dep       | max(salary) |
    +-----------+-------------+
    | 保安部    |    12000.00 |
    | 保洁部    |     9000.00 |
    | 教学部    |     9000.00 |
    +-----------+-------------+
    
    查看每个部门的最高工资
    
    MariaDB [s18]> select gender,count(*) from emp group by gender;
    +--------+----------+
    | gender | count(*) |
    +--------+----------+
    | male   |        7 |
    | female |        2 |
    +--------+----------+
    
    统计男生和女生的人数
    
    MariaDB [s18]> select city,avg(salary) from emp group by city;
    +-----------+--------------+
    | city      | avg(salary)  |
    +-----------+--------------+
    | 北京      | 10000.000000 |
    | 山东省    |  9000.000000 |
    | 河北省    |  7500.000000 |
    +-----------+--------------+
    
    统计每个省的员工的平均工资
    
    MariaDB [s18]> select city,avg(salary) from emp group by city having avg(salary) > 8000;
    +-----------+--------------+
    | city      | avg(salary)  |
    +-----------+--------------+
    | 北京      | 10000.000000 |
    | 山东省    |  9000.000000 |
    +-----------+--------------+
    查询平均工资大于8000的省份
    View Code

    查询条件顺序
    where
    group by
    having ---> 对平均分组后的内容进行再过滤
    order by
    limit

    MariaDB [s18]> select count(*) from emp;
    +----------+
    | count(*) |
    +----------+
    |        9 |
    +----------+
    
    查询公司所有员工的人数
    
    MariaDB [s18]> select avg(salary) from emp;
    +-------------+
    | avg(salary) |
    +-------------+
    | 8666.666667 |
    +-------------+
    
    求整个公司的平均薪水
    
    MariaDB [s18]> select * from emp order by salary;
    +----+-----------+--------+------+-----------+-----------+----------+
    | id | name      | gender | age  | dep       | city      | salary   |
    +----+-----------+--------+------+-----------+-----------+----------+
    |  5 | 张三      | male   |   24 | 教学部    | 河北省    |  6000.00 |
    |  7 | 王五      | male   |   38 | 教学部    | 河北省    |  7000.00 |
    |  1 | tom       | male   |   24 | 教学部    | 河北省    |  8000.00 |
    |  2 | jerry     | male   |   34 | 保安部    | 山东省    |  8000.00 |
    |  4 | 景丽阳    | female |   22 | 教学部    | 北京      |  9000.00 |
    |  8 | 赵六      | male   |   28 | 保安部    | 河北省    |  9000.00 |
    |  9 | 猪七      | female |   24 | 保洁部    | 北京      |  9000.00 |
    |  3 | peter     | male   |   28 | 保安部    | 山东省    | 10000.00 |
    |  6 | 李四      | male   |   32 | 保安部    | 北京      | 12000.00 |
    +----+-----------+--------+------+-----------+-----------+----------+
    
    MariaDB [s18]> select * from emp limit 2,4;
    +----+-----------+--------+------+-----------+-----------+----------+
    | id | name      | gender | age  | dep       | city      | salary   |
    +----+-----------+--------+------+-----------+-----------+----------+
    |  3 | peter     | male   |   28 | 保安部    | 山东省    | 10000.00 |
    |  4 | 景丽阳    | female |   22 | 教学部    | 北京      |  9000.00 |
    |  5 | 张三      | male   |   24 | 教学部    | 河北省    |  6000.00 |
    |  6 | 李四      | male   |   32 | 保安部    | 北京      | 12000.00 |
    +----+-----------+--------+------+-----------+-----------+----------+
    
    从第2条下面开始取,往下取4条
    
    MariaDB [s18]> select dep,group_concat(name) from emp group by dep;
    +-----------+-----------------------------+
    | dep       | group_concat(name)          |
    +-----------+-----------------------------+
    | 保安部    | jerry,peter,李四,赵六       |
    | 保洁部    | 猪七                        |
    | 教学部    | tom,景丽阳,张三,王五        |
    +-----------+-----------------------------+
    
    查看每个组的员工姓名
    View Code

    多表查询

    MariaDB [s18]> create table emp(
        ->     id int primary key auto_increment,
        ->     name varchar(20),
        ->     salary double(7,2),
        ->     dep_id int);
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [s18]> insert emp (name,salary,dep_id) values ('张三',8000,2),
        ->                                                ('李四',12000,1),
        ->                                                ('王五',5000,2),
        ->                                                ('赵六',8000,3),
        ->                                                ('猪七',9000,1),
        ->                                                ('周八',7000,4),
        ->                                                ('蔡九',7000,2);
    Query OK, 7 rows affected (0.01 sec)
    
    
    MariaDB [s18]> create table dep(
        ->     id int primary key auto_increment,
        ->     name varchar(20)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    
    MariaDB [s18]> insert into dep (name) values ('教学部'),
        ->                                       ('销售部'),
        ->                                       ('人事部');
    Query OK, 3 rows affected (0.01 sec)
    
    MariaDB [s18]> select * from emp;
    +----+--------+----------+--------+
    | id | name   | salary   | dep_id |
    +----+--------+----------+--------+
    |  1 | 张三   |  8000.00 |      2 |
    |  2 | 李四   | 12000.00 |      1 |
    |  3 | 王五   |  5000.00 |      2 |
    |  4 | 赵六   |  8000.00 |      3 |
    |  5 | 猪七   |  9000.00 |      1 |
    |  6 | 周八   |  7000.00 |      4 |
    |  7 | 蔡九   |  7000.00 |      2 |
    +----+--------+----------+--------+
    
    MariaDB [s18]> select * from dep;
    +----+-----------+
    | id | name      |
    +----+-----------+
    |  1 | 教学部    |
    |  2 | 销售部    |
    |  3 | 人事部    |
    +----+-----------+
    MariaDB [s18]> select * from emp,dep where emp.dep_id=dep.id;
    +----+--------+----------+--------+----+-----------+
    | id | name   | salary   | dep_id | id | name      |
    +----+--------+----------+--------+----+-----------+
    |  1 | 张三   |  8000.00 |      2 |  2 | 销售部    |
    |  2 | 李四   | 12000.00 |      1 |  1 | 教学部    |
    |  3 | 王五   |  5000.00 |      2 |  2 | 销售部    |
    |  4 | 赵六   |  8000.00 |      3 |  3 | 人事部    |
    |  5 | 猪七   |  9000.00 |      1 |  1 | 教学部    |
    |  7 | 蔡九   |  7000.00 |      2 |  2 | 销售部    |
    +----+--------+----------+--------+----+-----------+
    
    MariaDB [s18]> select dep.name,emp.name from emp,dep where emp.dep_id=dep.id and emp.name='张三';
    +-----------+--------+
    | name      | name   |
    +-----------+--------+
    | 销售部    | 张三   |
    +-----------+--------+

    查询张三所在部门的名称
    (此种方法并不是以后经常使用的方法,有专门的语法 inner join--内连接查询)

    MariaDB [s18]> select * from emp inner join dep on emp.dep_id=dep.id;
    +----+--------+----------+--------+----+-----------+
    | id | name   | salary   | dep_id | id | name      |
    +----+--------+----------+--------+----+-----------+
    |  1 | 张三   |  8000.00 |      2 |  2 | 销售部    |
    |  2 | 李四   | 12000.00 |      1 |  1 | 教学部    |
    |  3 | 王五   |  5000.00 |      2 |  2 | 销售部    |
    |  4 | 赵六   |  8000.00 |      3 |  3 | 人事部    |
    |  5 | 猪七   |  9000.00 |      1 |  1 | 教学部    |
    |  7 | 蔡九   |  7000.00 |      2 |  2 | 销售部    |
    +----+--------+----------+--------+----+-----------+
    
    MariaDB [s18]> select * from emp inner join dep on emp.dep_id=dep.id where emp.name='张三';
    +----+--------+---------+--------+----+-----------+
    | id | name   | salary  | dep_id | id | name      |
    +----+--------+---------+--------+----+-----------+
    |  1 | 张三   | 8000.00 |      2 |  2 | 销售部    |
    +----+--------+---------+--------+----+-----------+

    左外连接查询left join(以左边的表为准)

    MariaDB [s18]> select * from emp left join dep on emp.dep_id=dep.id;
    +----+--------+----------+--------+------+-----------+
    | id | name   | salary   | dep_id | id   | name      |
    +----+--------+----------+--------+------+-----------+
    |  1 | 张三   |  8000.00 |      2 |    2 | 销售部    |
    |  2 | 李四   | 12000.00 |      1 |    1 | 教学部    |
    |  3 | 王五   |  5000.00 |      2 |    2 | 销售部    |
    |  4 | 赵六   |  8000.00 |      3 |    3 | 人事部    |
    |  5 | 猪七   |  9000.00 |      1 |    1 | 教学部    |
    |  6 | 周八   |  7000.00 |      4 | NULL | NULL      |
    |  7 | 蔡九   |  7000.00 |      2 |    2 | 销售部    |
    +----+--------+----------+--------+------+-----------+
    比起inner join,多了  |  6 | 周八   |  7000.00 |      4 | NULL | NULL      |

    右外连接查询right join(以右边的表为准)

    MariaDB [s18]> select * from emp right join dep on emp.dep_id=dep.id;
    +------+--------+----------+--------+----+-----------+
    | id   | name   | salary   | dep_id | id | name      |
    +------+--------+----------+--------+----+-----------+
    |    1 | 张三   |  8000.00 |      2 |  2 | 销售部    |
    |    2 | 李四   | 12000.00 |      1 |  1 | 教学部    |
    |    3 | 王五   |  5000.00 |      2 |  2 | 销售部    |
    |    4 | 赵六   |  8000.00 |      3 |  3 | 人事部    |
    |    5 | 猪七   |  9000.00 |      1 |  1 | 教学部    |
    |    7 | 蔡九   |  7000.00 |      2 |  2 | 销售部    |
    +------+--------+----------+--------+----+-----------+

    完整性约束

    1.唯一约束--unique
    唯一约束可以有多个但索引列的值必须唯一,索引列的值允许有空值

    MariaDB [s18]> create table t1 (name varchar(20) unique);
    
    MariaDB [s18]> insert t1 values ('tom');
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [s18]> insert t1 values ('tom');
    ERROR 1062 (23000): Duplicate entry 'tom' for key 'name'
    
    创建唯一约束后就不能插入相同的内容了
    MariaDB [s18]> alter table t1 drop index name;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    
    MariaDB [s18]> insert t1 values ('tom');
    Query OK, 1 row affected (0.01 sec)
    
    MariaDB [s18]> insert t1 values ('tom');
    Query OK, 1 row affected (0.01 sec)
    
    删除唯一索引后就可以插入重复数据了
    MariaDB [s18]> alter table t1 add age int;
    Query OK, 3 rows affected (0.02 sec)               
    Records: 3  Duplicates: 0  Warnings: 0
    
    MariaDB [s18]> alter table t1 add constraint UK_t1_age unique (age);
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    2.自增约束
    MySQL每张表只能有1个自动增长字段,这个自动增长字段通常作为主键,也可以用作
    非主键使用,但是将自动增长字段当作非主键使用时必须为其添加唯一索引,否则系统报错

    MariaDB [s18]> create table t2 (
        ->         id int not null,
        ->         name varchar(20),
        ->         age int auto_increment);
    ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
    
    改为以下:
    
    MariaDB [s18]> create table t2 (
        ->         id int not null,
        ->         name varchar(20),
        ->         age int unique auto_increment);
    Query OK, 0 rows affected (0.01 sec)

    3.主键约束
    非空且唯一

    a.一张表不一定有主键
    b.一张表最多只能有一个主键
    c.表中如果没有设置主键,默认设置not null的字段为主键,此外,表中如果有多个not null的字段为主键,则
    按顺序将第一个设置为not null的字段设为主键
    d.主键一定是非空且唯一,但非空且唯一的字段不一定是主键
    e.主键类型不一定必须是整型

    MariaDB [s18]> create table t3(id int not null unique,name varchar(20));
    Query OK, 0 rows affected (0.01 sec)
    
    MariaDB [s18]> desc t3;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | NO   | PRI | NULL    |       |
    | name  | varchar(20) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+

    添加主键
    alter table table_name add primary key(字段名称,...)
    删除主键
    alter table table_name drop primary key;

    4.外键约束

    表与表的关系是两张表的关系


    一对多
    关联字段要设在在数据多的那张表
    主表:没有关联字段
    子表:有关联字段


    多对多
    只能通过第三张表来建立关系


    一对一
    关联字段可以设在任何一张表上
    将关联字段设置为unique

    复合主键
    主键含有一个以上的字段
    如果一列不能唯一区分一张表里的记录,可以用多个组合起来达到区分表记录的唯一性

    MariaDB [s18]> create table sc (
        ->             studentid int,
        ->             courseid int,
        ->             score int,
        ->             primary key (studentid,courseid)
        -> );
    
    
    修改
    alter table table_name add primary key (字段1,字段2...);
  • 相关阅读:
    若依问题解决(一)
    Java 将两个List转换为流合并List
    后端返回前端文本换行显示,只能在前端再转换
    Java Stream() 流根据对象属性去重
    vue 当前端传回后端,后端使用实体类接收数据显示报错
    js 中 getMonth() 获取的月份比现实少一个月
    vue连个数组对比
    JS链接跳转方法
    ElementUI--表格toggleRowSelection无法选中
    Linux 常用命令
  • 原文地址:https://www.cnblogs.com/Ryans-World/p/7524623.html
Copyright © 2020-2023  润新知