目录

MySQL-核心操作全解析用户-SHOWDMLDCL

MySQL 核心操作全解析(用户 + SHOW+DML+DCL)

MySQL 核心操作全解析(用户 + SHOW+DML+DCL)

基于你提供的实操笔记,我们将 MySQL 核心操作拆解为用户管理、SHOW 查询命令、DML 数据操作、TRUNCATE 与 DELETE 对比、DCL 权限控制五大模块,梳理语法逻辑、补充避坑提示,帮你系统性掌握 “用户 - 数据 - 权限” 的完整操作链路

一、MySQL 用户管理(创建 / 删除 / 登录)

MySQL 用户的核心标识是 ‘用户名’@‘主机’USERNAME@HOST),其中HOST用于限制用户的登录来源,是避免未授权访问的关键

1.1 用户的核心组成:USERNAME@HOST

HOST字段决定 “用户能从哪些主机连接 MySQL”,常见取值及含义:

HOST 取值含义示例
具体 IP 地址仅允许从该 IP 登录127.0.0.1(本地回环)、192.168.100.10(远程 IP)
%(通配符)允许从任意主机登录(谨慎使用,存在安全风险)'syf'@'%'
_(通配符)匹配单个字符(如'192.168.100._'允许 192.168.100 网段所有 IP 登录)'syf'@'192.168.100._'
localhost仅允许本地通过 “socket 文件” 登录(区别于127.0.0.1的 TCP 连接)'syf'@'localhost'

1.2 用户操作实战(DDL)

(1)创建用户
  • 语法:CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';

  • 示例(创建允许从任何主机登录的用户syf,密码redhat):

    mysql> create user 'syf'@'192.168.100.%' identified by 'redhat';
    Query OK, 0 rows affected (0.00 sec)
    [root@syf2 ~]# mysql -usyf -h 192.168.100.10 -p
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 3
    Server version: 5.7.37 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MySQL [(none)]> exit
    Bye
    2)用户登录(命令行)
    • 语法:mysql -u用户名 -h主机IP -p-h需与用户的HOST匹配,否则登录失败)
    • 示例(用syf登录):
    [root@syf ~]# mysql -usyf -h192.168.100.10 -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 15
    Server version: 5.7.37 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2022, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> 
    (3)删除用户
    • 语法:DROP USER '用户名'@'主机';(必须指定完整的USERNAME@HOST,否则可能删错)
    • 示例:
    mysql> drop user 'syf'@'192.168.100.%';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select User,Host from mysql.user;
    +---------------+-----------+
    | User          | Host      |
    +---------------+-----------+
    | mysql.session | localhost |
    | mysql.sys     | localhost |
    | root          | localhost |
    +---------------+-----------+
    3 rows in set (0.00 sec)

    二、SHOW 系列命令:MySQL 的 “查看工具集”

    SHOW 命令用于查询 MySQL 的系统信息、库表结构、配置参数等,是日常运维和开发的高频工具。按用途分类如下:

    2.1 查看系统基础信息

    命令用途关键说明
    SHOW CHARACTER SET;查看 MySQL 支持的所有字符集推荐用utf8mb4(支持中文、emoji,utf8实际是utf8mb3,不支持 emoji)
    SHOW ENGINES;查看当前 MySQL 支持的存储引擎默认引擎是InnoDB(支持事务、外键),MyISAM不支持事务,仅用于历史场景

    2.2 查看库表相关信息

    命令用途示例结果说明
    SHOW DATABASES;查看所有数据库包含系统库(information_schema元数据、mysql权限库、sys管理库)和自定义库(如sy
    SHOW TABLES;查看当前数据库的所有表需先执行USE 数据库名;(如USE sy;
    SHOW TABLES FROM 数据库名;不切换数据库,直接查看指定库的表示例:SHOW TABLES FROM sy;(查看sy库的表)
    DESC [数据库名.]表名;(或DESCRIBE查看表结构(字段名、类型、约束等)字段Null列显示YES表示允许 NULL,Key列显示PRI表示主键
    SHOW CREATE TABLE 表名;查看表的完整创建语句(含引擎、字符集)可用于复制表结构(如迁移表时直接复用 SQL)
    SHOW TABLE STATUS LIKE '表名'\G查看表的详细状态(行数、创建时间等)\G表示按行显示结果(避免字段过多换行混乱),Rows列显示表中记录数

    三、DML 操作:数据的 “增删改查”(核心)

    DML(Data Manipulation Language)是针对表中数据的操作,核心是INSERT(增)、SELECT(查)、UPDATE(改)、DELETE(删),必须在 “切换到数据库 + 存在表” 的前提下执行

    1. 首先创建表结构(CREATE TABLE

    根据表中字段(idnameage)和数据特征,创建表的 SQL 语句如下:

    -- 创建 shenyi 表
    mysql> use sy;
    Database changed
    mysql> create table shenyi(
        -> id int primary key auto_increment,
        -> name varchar(50) not null,
        -> age int);
    Query OK, 0 rows affected (0.01 sec)
    字段说明:
    • id:整数类型,设为主键(PRIMARY KEY)且自增(AUTO_INCREMENT),确保每条记录唯一,插入时无需手动指定。
    • name:字符串类型(VARCHAR(50)),NOT NULL 表示姓名不能为空。
    • age:整数类型(INT),未加 NOT NULL,允许存储 NULL(如 lisi 的年龄)。

    2. 插入示例数据(INSERT INTO

    创建表后,插入查询结果中的 7 条记录:

    mysql> insert into shenyi (name,age) values
        -> ('tom',20),
        -> ('jerry',23),
        -> ('shenyi',25),
        -> ('sean',28),
        -> ('zhangshan',26),
        -> ('zhangshan',20),
        -> ('lisi',null);
    Query OK, 7 rows affected (0.01 sec)
    Records: 7  Duplicates: 0  Warnings: 0

    3. 验证结果

    mysql> select * from shenyi;
    +----+-----------+------+
    | id | name      | age  |
    +----+-----------+------+
    |  1 | tom       |   20 |
    |  2 | jerry     |   23 |
    |  3 | shenyi    |   25 |
    |  4 | sean      |   28 |
    |  5 | zhangshan |   26 |
    |  6 | zhangshan |   20 |
    |  7 | lisi      | NULL |
    +----+-----------+------+
    7 rows in set (0.00 sec)

    只查询name字段的所有值(不显示idage):

    包含重复值zhangshan(出现 2 次),说明表中允许同名记录,这也解释了后续按name筛选时需要结合age的原因

    mysql> select name from shenyi;
    +-----------+
    | name      |
    +-----------+
    | tom       |
    | jerry     |
    | shenyi    |
    | sean      |
    | zhangshan |
    | zhangshan |
    | lisi      |
    +-----------+
    7 rows in set (0.00 sec)
    排序查询(ORDER BY

    升序(ORDER BY age)

    age从小到大排列,NULL值(最小)排在最前,之后按20→23→25→26→28顺序排列,与表中数据完全匹配

    mysql> select * from shenyi order by age;
    +----+-----------+------+
    | id | name      | age  |
    +----+-----------+------+
    |  7 | lisi      | NULL |
    |  1 | tom       |   20 |
    |  6 | zhangshan |   20 |
    |  2 | jerry     |   23 |
    |  3 | shenyi    |   25 |
    |  5 | zhangshan |   26 |
    |  4 | sean      |   28 |
    +----+-----------+------+
    7 rows in set (0.00 sec)

    降序(ORDER BY age DESC)

    age从大到小排列,最大的28排在最前,依次递减,NULL值(最大)排在最后,逻辑与升序完全相反

    mysql> select * from shenyi order by age desc;
    +----+-----------+------+
    | id | name      | age  |
    +----+-----------+------+
    |  4 | sean      |   28 |
    |  5 | zhangshan |   26 |
    |  3 | shenyi    |   25 |
    |  2 | jerry     |   23 |
    |  1 | tom       |   20 |
    |  6 | zhangshan |   20 |
    |  7 | lisi      | NULL |
    +----+-----------+------+
    7 rows in set (0.01 sec)
    限制结果行数(LIMIT
    • LIMIT 2:取排序后前 2 条记录(升序中是NULL和第一个20

      mysql> select * from shenyi order by age limit 2;
      +----+------+------+
      | id | name | age  |
      +----+------+------+
      |  7 | lisi | NULL |
      |  1 | tom  |   20 |
      +----+------+------+
      2 rows in set (0.00 sec)
    • LIMIT 1,2LIMIT 偏移量, 行数,偏移量从 0 开始。这里偏移 1(跳过第 1 条NULL),取后面 2 条,即两个age=20的记录(id=1 和 id=6)

      mysql> select * from shenyi order by age limit 1,2;
      +----+-----------+------+
      | id | name      | age  |
      +----+-----------+------+
      |  1 | tom       |   20 |
      |  6 | zhangshan |   20 |
      +----+-----------+------+
      2 rows in set (0.00 sec)
    4. 条件筛选(WHERE
    • age >= 25:筛选age不小于 25 的记录,对应25、26、28三个值,共 3 条

      mysql> select * from shenyi where age >= 25;
      +----+-----------+------+
      | id | name      | age  |
      +----+-----------+------+
      |  3 | shenyi    |   25 |
      |  4 | sean      |   28 |
      |  5 | zhangshan |   26 |
      +----+-----------+------+
      3 rows in set (0.00 sec)

      age >= 25 AND name = ‘zhangshan’:多条件筛选,需同时满足 “年龄≥25” 和 “姓名为 zhangshan”。表中zhangshan`有两条记录(id=5:26 岁;id=6:20 岁),仅 id=5 符合条件

      mysql> select * from shenyi where age >= 25 and name='zhangshan';
      +----+-----------+------+
      | id | name      | age  |
      +----+-----------+------+
      |  5 | zhangshan |   26 |
      +----+-----------+------+
      1 row in set (0.00 sec)

      age BETWEEN 23 and 28:等价于age >=23 AND age <=28,包含23、25、26、28四个值,共 4 条记录

      mysql> select * from shenyi where age between 23 and 28;
      +----+-----------+------+
      | id | name      | age  |
      +----+-----------+------+
      |  2 | jerry     |   23 |
      |  3 | shenyi    |   25 |
      |  4 | sean      |   28 |
      |  5 | zhangshan |   26 |
      +----+-----------+------+
      4 rows in set (0.00 sec)

      age IS NOT NULL/age IS NULL:专门针对NULL值的筛选,分别返回 6 条非空记录和 1 条空值记录(id=7)

      mysql> select * from shenyi where age is not null;
      +----+-----------+------+
      | id | name      | age  |
      +----+-----------+------+
      |  1 | tom       |   20 |
      |  2 | jerry     |   23 |
      |  3 | shenyi    |   25 |
      |  4 | sean      |   28 |
      |  5 | zhangshan |   26 |
      |  6 | zhangshan |   20 |
      +----+-----------+------+
      6 rows in set (0.00 sec)
      
      mysql> select * from shenyi where age is null;
      +----+------+------+
      | id | name | age  |
      +----+------+------+
      |  7 | lisi | NULL |
      +----+------+------+
      1 row in set (0.00 sec)

    3.1 INSERT:插入数据

    • 语法:

      INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...);

      支持单条插入(1 个VALUES)和多条插入(多个VALUES用逗号分隔)

      示例(插入数据到sy.shenyi表):

      -- 单条插入
      INSERT INTO shenyi (id, name, age) VALUES (1, 'tom', 20);
      -- 多条插入(更高效,减少IO)
      INSERT INTO shenyi (id, name, age) 
      VALUES (2, 'jerry', 23), (3, 'shenyi', 25), (7, 'lisi', NULL);

      ⚠️ 注意:字段顺序需与VALUES顺序一致;允许 NULL 的字段(如age)可直接写NULL(无需加引号);非 NULL 字段(如idname)必须填写值,否则报错

    3.2 SELECT:查询数据(最复杂也最常用)

    SELECT`是 DML 的核心,支持按条件过滤、排序、限制结果数量,语法:
    `SELECT 字段列表 FROM 表名 [WHERE 条件] [ORDER BY 字段 排序方式] [LIMIT 偏移量, 数量];
    (1)字段列表表示法
    表示符含义示例
    *查询所有字段(开发中尽量避免,效率低)SELECT * FROM shenyi;
    字段1, 字段2仅查询指定字段(推荐,减少数据传输)SELECT name, age FROM shenyi;
    字段 AS 别名给字段起别名(方便阅读)SELECT name AS 用户名, age AS 年龄 FROM shenyi;
    (2)WHERE 条件:过滤数据
    条件类型操作符 / 关键字示例(查询shenyi表)
    比较运算>, <, >=, <=, =, !=SELECT * FROM shenyi WHERE age >= 25;(年龄≥25)
    范围匹配BETWEEN 最小值 AND 最大值(闭区间)SELECT * FROM shenyi WHERE age BETWEEN 23 AND 28;(23≤age≤28)
    NULL 判断IS NULL(空)、IS NOT NULL(非空)SELECT * FROM shenyi WHERE age IS NULL;(年龄未填写)
    逻辑组合AND(且)、OR(或)、NOT(非)SELECT * FROM shenyi WHERE age >=25 AND name='zhangshan';(年龄≥25 且姓名是 zhangshan)
    模糊匹配LIKE(配合%/_SELECT * FROM shenyi WHERE name LIKE 'zhang%';(姓名以 zhang 开头)
    (3)ORDER BY:排序
    • 默认升序(ASC),显式指定DESC为降序;
    • NULL 值排序规则:升序时 NULL 排在最前,降序时 NULL 排在最后(如用户示例中ORDER BY age DESClisi的 NULL 排在最后);
    • 示例:SELECT * FROM shenyi ORDER BY age DESC;(按年龄降序)。
    (4)LIMIT:限制结果数量
    • 语法 1:LIMIT N(取前 N 条记录)—— 示例:LIMIT 2(取前 2 条);
    • 语法 2:LIMIT 偏移量, N(跳过前 “偏移量” 条,取 N 条)—— 示例:LIMIT 1, 2(跳过第 1 条,取第 2-3 条);
    • 用途:分页查询(如第 1 页LIMIT 0,10,第 2 页LIMIT 10,10)。

    3.3 UPDATE:修改数据

    • 语法:UPDATE 表名 SET 字段1=新值1, 字段2=新值2, ... [WHERE 条件];
    • 示例(将lisi的年龄改为 30):
    mysql> update shenyi set age = 30 where name = 'lisi';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from shenyi;
    +----+-----------+------+
    | id | name      | age  |
    +----+-----------+------+
    |  1 | tom       |   20 |
    |  2 | jerry     |   23 |
    |  3 | shenyi    |   25 |
    |  4 | sean      |   28 |
    |  5 | zhangshan |   26 |
    |  6 | zhangshan |   20 |
    |  7 | lisi      |   30 |
    +----+-----------+------+
    7 rows in set (0.00 sec)

    ⚠️ 致命风险:如果不加 WHERE 条件,会修改表中所有记录(如UPDATE shenyi SET age=30;会把所有用户的年龄改为 30),生产环境必须先写SELECT验证条件,再执行UPDATE

    3.4 DELETE:删除数据

    • 语法:DELETE FROM 表名 [WHERE 条件];

    • 示例:

      -- 删除单条记录(id=7的记录)
      mysql> delete from shenyi where id = 7;
      Query OK, 1 row affected (0.00 sec)
      mysql> select * from shenyi;
      +----+-----------+------+
      | id | name      | age  |
      +----+-----------+------+
      |  1 | tom       |   20 |
      |  2 | jerry     |   23 |
      |  3 | shenyi    |   25 |
      |  4 | sean      |   28 |
      |  5 | zhangshan |   26 |
      |  6 | zhangshan |   20 |
      +----+-----------+------+
      6 rows in set (0.00 sec)
    -- 删除所有记录(不加WHERE,谨慎!)
    mysql> delete from shenyi;
    Query OK, 6 rows affected (0.00 sec)
    
    mysql> select * from shenyi;
    Empty set (0.00 sec)

记录删除,表结构依然存在:

  mysql> desc shenyi;
  +-------+-------------+------+-----+---------+----------------+
  | Field | Type        | Null | Key | Default | Extra          |
  +-------+-------------+------+-----+---------+----------------+
  | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
  | name  | varchar(50) | NO   |     | NULL    |                |
  | age   | int(11)     | YES  |     | NULL    |                |
  +-------+-------------+------+-----+---------+----------------+
  3 rows in set (0.00 sec)

⚠️ 注意:DELETE FROM 表名;会删除表中所有数据,但保留表结构(字段、约束等),且删除的记录可通过事务回滚恢复(若开启事务)

四、TRUNCATE vs DELETE:清空表数据的区别

用户示例中提到了TRUNCATE,它与DELETE都能清空数据,但核心差异极大,生产环境需严格区分:

对比维度DELETETRUNCATE
操作对象逐行删除记录直接释放表的数据页(不逐行删除)
事务支持支持(可通过ROLLBACK回滚恢复数据)不支持(删除后无法恢复,属于 DDL 操作)
执行速度慢(逐行记录日志)快(仅释放数据页,日志量少)
自增 ID 重置不重置(删除后新增记录,自增 ID 继续递增)重置(删除后新增记录,自增 ID 从 1 开始)
外键约束限制可删除有外键引用的表数据(需满足外键规则)不能删除有外键引用的表数据(直接报错)
语法形式DML 操作(DELETE FROM 表名;DDL 操作(TRUNCATE TABLE 表名;,TABLE 可省略)

⚠️ 选择建议:

  • 需恢复数据 / 保留自增 ID:用DELETE FROM 表名 WHERE 条件;
  • 无需恢复数据 / 追求速度(如测试环境清空表):用TRUNCATE 表名;
  • 有外键关联的表:只能用DELETE,不能用TRUNCATE

示例:

mysql> select * from shenyi;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  8 | tom       |   20 |
|  9 | jerry     |   23 |
| 10 | shenyi    |   25 |
| 11 | sean      |   28 |
| 12 | zhangshan |   26 |
| 13 | zhangshan |   20 |
| 14 | lisi      | NULL |
+----+-----------+------+
7 rows in set (0.00 sec)

mysql> truncate shenyi;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from shenyi;
Empty set (0.00 sec)

mysql> desc shenyi;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | NO   |     | NULL    |                |
| age   | int(11)     | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

五、DCL 操作:权限的 “授予与回收”

DCL(Data Control Language)用于管理用户的操作权限,确保不同用户只能访问自己权限范围内的库表,核心是GRANT(授权)、REVOKE(回收权限)、FLUSH PRIVILEGES(刷新权限)

5.1 GRANT:授予权限

  • 语法:`GRANT 权限类型 ON 操作对象 TO ‘用户名’@‘主机’ [IDENTIFIED BY ‘密码’] [WITH GRANT OPTION]
    各部分含义:

    1. 权限类型ALL(所有权限)、SELECT(查询)、INSERT(插入)、UPDATE(修改)、DELETE(删除)等
    2. 操作对象:
      • *.*:所有数据库的所有表(超级权限,仅给管理员)
      • 数据库名.*:指定数据库的所有表(如sy.*表示sy库的所有表)
      • 数据库名.表名:指定数据库的指定表(如sy.chenyu
    3. IDENTIFIED BY '密码':若用户不存在,可直接创建用户并授权(MySQL 5.7 + 支持,8.0 + 需先创建用户再授权)
    4. WITH GRANT OPTION:允许被授权用户将自己的权限转授给其他用户(不建议给普通用户,存在权限扩散风险)
  • 示例:

    -- 授权shenyi从localhost登录,拥有所有库表的所有权限
    GRANT ALL ON *.* TO 'shenyi'@'localhost' IDENTIFIED BY 'redhat';
    -- 授权shenyi从192.168.100.10登录,仅拥有cy库所有表的所有权限
    GRANT ALL ON sy.* TO 'shenyi'@'192.168.100.10' IDENTIFIED BY 'redhat';
    -- 授权shenyi从任意主机登录(%),拥有所有库表的所有权限(生产环境禁用%)
    GRANT ALL ON *.* TO 'shenyi'@'%' IDENTIFIED BY 'redhat';

5.2 查看权限

  • 查看当前登录用户的权限:SHOW GRANTS;
  • 查看指定用户的权限:SHOW GRANTS FOR '用户名'@'主机';
    示例:SHOW GRANTS FOR 'shenyi'@'localhost';(查看chenyu在 的权限)

5.3 REVOKE:回收权限

  • 语法:REVOKE 权限类型 ON 操作对象 FROM '用户名'@'主机';

  • 示例(回收shenyi在 192.168.100.10 的所有权限):

    REVOKE ALL ON *.* FROM 'shenyi'@'192.168.100.10';

5.4 FLUSH PRIVILEGES:刷新权限

  • 原理:MySQL 启动时会将mysql库的授权表(如userdb)加载到内存,GRANT/REVOKE通常会自动刷新内存,但特殊情况(如手动修改授权表数据)需手动刷新
  • 语法:FLUSH PRIVILEGES;
  • 场景:回收权限后若立即生效,可执行此命令(用户示例中回收权限后执行了该命令)

1.搭建mysql服务略
2.创建一个以你名字为名的数据库,并创建一张表student,该表包含三个字段(id,name,age),表结构如下:

mysql> create database shenyi;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| shenyi             |
| sy                 |
| sys                |
+--------------------+
6 rows in set (0.01 sec)

mysql> use shenyi;
Database changed
mysql> create table student(
    -> id int(11) primary key auto_increment,
    -> name varchar(100) not NULL,
    -> age tinyint(4));
Query OK, 0 rows affected (0.02 sec)

3.查看下该新建的表有无内容(用select语句)

mysql> select * from student;
Empty set (0.00 sec)

mysql> desc student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | NO   |     | NULL    |                |
| age   | tinyint(4)   | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.04 sec)

4.往新建的student表中插入数据(用insert语句),结果应如下所示:

mysql> insert into student(name,age) values
    -> ('tom',20),
    -> ('jerry',23),
    -> ('shenyi',25),
    -> ('sean',28),
    -> ('zhangshan',26),
    -> ('zhangshan',20),
    -> ('lisi',NULL),
    -> ('chenshuo',10),
    -> ('wangwu',3),
    -> ('qiuyi',15),
    -> ('qiuxiaotian',20);
Query OK, 11 rows affected (0.00 sec)
Records: 11  Duplicates: 0  Warnings: 0

mysql> select * from student;
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
|  1 | tom         |   20 |
|  2 | jerry       |   23 |
|  3 | shenyi      |   25 |
|  4 | sean        |   28 |
|  5 | zhangshan   |   26 |
|  6 | zhangshan   |   20 |
|  7 | lisi        | NULL |
|  8 | chenshuo    |   10 |
|  9 | wangwu      |    3 |
| 10 | qiuyi       |   15 |
| 11 | qiuxiaotian |   20 |
+----+-------------+------+
11 rows in set (0.00 sec)

5.修改lisi的年龄为50

mysql> update student set age=50 where name='lisi';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from student;
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
|  1 | tom         |   20 |
|  2 | jerry       |   23 |
|  3 | shenyi      |   25 |
|  4 | sean        |   28 |
|  5 | zhangshan   |   26 |
|  6 | zhangshan   |   20 |
|  7 | lisi        |   50 |
|  8 | chenshuo    |   10 |
|  9 | wangwu      |    3 |
| 10 | qiuyi       |   15 |
| 11 | qiuxiaotian |   20 |
+----+-------------+------+
11 rows in set (0.00 sec)

6.以age字段降序排序

mysql> select * from student order by age desc;
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
|  7 | lisi        |   50 |
|  4 | sean        |   28 |
|  5 | zhangshan   |   26 |
|  3 | shenyi      |   25 |
|  2 | jerry       |   23 |
|  1 | tom         |   20 |
|  6 | zhangshan   |   20 |
| 11 | qiuxiaotian |   20 |
| 10 | qiuyi       |   15 |
|  8 | chenshuo    |   10 |
|  9 | wangwu      |    3 |
+----+-------------+------+
11 rows in set (0.00 sec)

7.查询student表中年龄最小的3位同学跳过前2位

mysql> select * from student order by age limit 2,3;
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
| 10 | qiuyi       |   15 |
|  1 | tom         |   20 |
| 11 | qiuxiaotian |   20 |
+----+-------------+------+
3 rows in set (0.00 sec)

8.查询student表中年龄最大的4位同学

mysql> select * from student order by age desc limit 4;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  7 | lisi      |   50 |
|  4 | sean      |   28 |
|  5 | zhangshan |   26 |
|  3 | shenyi    |   25 |
+----+-----------+------+
4 rows in set (0.00 sec)

9.查询student表中名字叫zhangshan的记录

mysql> select * from student where name='zhangshan';
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  5 | zhangshan |   26 |
|  6 | zhangshan |   20 |
+----+-----------+------+
2 rows in set (0.01 sec)

10.查询student表中名字叫zhangshan且年龄大于20岁的记录

mysql> select * from student where name='zhangshan' and age > 20;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  5 | zhangshan |   26 |
+----+-----------+------+
1 row in set (0.00 sec)

11.查询student表中年龄在23到30之间的记录

mysql> select * from student where age between 23 and 30;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  2 | jerry     |   23 |
|  3 | shenyi    |   25 |
|  4 | sean      |   28 |
|  5 | zhangshan |   26 |
+----+-----------+------+
4 rows in set (0.00 sec)

12.修改wangwu的年龄为100

mysql> update student set age=100 where name='wangwu';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from student;
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
|  1 | tom         |   20 |
|  2 | jerry       |   23 |
|  3 | shenyi      |   25 |
|  4 | sean        |   28 |
|  5 | zhangshan   |   26 |
|  6 | zhangshan   |   20 |
|  7 | lisi        |   50 |
|  8 | chenshuo    |   10 |
|  9 | wangwu      |  100 |
| 10 | qiuyi       |   15 |
| 11 | qiuxiaotian |   20 |
+----+-------------+------+
11 rows in set (0.00 sec)

13.删除student中名字叫zhangshan且年龄小于等于20的记录

mysql> delete from student where name='zhangshan' and age<=20;
Query OK, 1 row affected (0.01 sec)

mysql> select * from student;
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
|  1 | tom         |   20 |
|  2 | jerry       |   23 |
|  3 | shenyi      |   25 |
|  4 | sean        |   28 |
|  5 | zhangshan   |   26 |
|  7 | lisi        |   50 |
|  8 | chenshuo    |   10 |
|  9 | wangwu      |  100 |
| 10 | qiuyi       |   15 |
| 11 | qiuxiaotian |   20 |
+----+-------------+------+
10 rows in set (0.00 sec)

14.创建表course表,要求如下

mysql> create table course(
    -> id int(3) primary key,
    -> course_name varchar(100));
Query OK, 0 rows affected (0.00 sec)

mysql> desc course;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id          | int(3)       | NO   | PRI | NULL    |       |
| course_name | varchar(100) | YES  |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

15、为course表插入数据

mysql> insert into course values
    -> (1,'Java'),
    -> (2,'MySQL'),
    -> (3,'Python'),
    -> (4,'Go'),
    -> (5,'C++');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select *from course;
+----+-------------+
| id | course_name |
+----+-------------+
|  1 | Java        |
|  2 | MySQL       |
|  3 | Python      |
|  4 | Go          |
|  5 | C++         |
+----+-------------+
5 rows in set (0.00 sec)

16、创建student123表,要求如下:

mysql> create table student123(
    -> id int(3) primary key,
    -> name varchar(100),
    -> age int(3),
    -> sex varchar(10),
    -> height int(3),
    -> course_id int(3),
    -> constraint st123_courseid_course_id foreign key (course_id) references course(id));
Query OK, 0 rows affected (0.01 sec)

17、为student123表插入数据如下:

mysql> insert into student123 values
    -> (1,'Dany',25,'man',160,1),
    -> (2,'Green',23,'man',158,2),
    -> (3,'Henry',23,'woman',185,1),
    -> (4,'Jane',22,'man',162,3),
    -> (5,'Jim',24,'woman',175,2),
    -> (6,'John',21,'woman',172,4),
    -> (7,'Lily',22,'man',165,4),
    -> (8,'Susan',23,'man',170,5),
    -> (9,'Thomas',22,'woman',178,5),
    -> (10,'Tom',23,'woman',165,5);
Query OK, 10 rows affected (0.01 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> select * from student123;
+----+--------+------+-------+--------+-----------+
| id | name   | age  | sex   | height | course_id |
+----+--------+------+-------+--------+-----------+
|  1 | Dany   |   25 | man   |    160 |         1 |
|  2 | Green  |   23 | man   |    158 |         2 |
|  3 | Henry  |   23 | woman |    185 |         1 |
|  4 | Jane   |   22 | man   |    162 |         3 |
|  5 | Jim    |   24 | woman |    175 |         2 |
|  6 | John   |   21 | woman |    172 |         4 |
|  7 | Lily   |   22 | man   |    165 |         4 |
|  8 | Susan  |   23 | man   |    170 |         5 |
|  9 | Thomas |   22 | woman |    178 |         5 |
| 10 | Tom    |   23 | woman |    165 |         5 |
+----+--------+------+-------+--------+-----------+
10 rows in set (0.00 sec)