浅学SQL

MySQL数据库

·关系型数据库(RDBMS)
概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。

特点:
使用表存储数据,格式统一,便于维护。
使用SQL语言操作,标准统一,使用方便。

启动:
net start mysql80
net stop mysql80

MySQL客户端连接:
mysql [-h 127.0.0.1][-p 3306] -u root -p

MySQL数据模型:数据库、表

SQL通用语法

  1. 语句可单行或多行写,以;结尾
  2. 可以使用空格或缩进增加可读性,数量不限
  3. 不区分大小写,关键字建议用大写
  4. 注释:

SQL分类

分类 全称 说明
DDL Data Definition Language 数据定义语言,用来定义数据库对象(数据库、表、字段)
DML Data Manipulation Language 数据操作语言,用来对数据库表中的数据进行增删改
DQL Data Query Language 数据查询语言,用来查询数据库中表的记录
DCL Data Control Language 数据控制语言,用来创建数据库用户、控制数据库的访问权限

例如:
id name age gender
1 Lorem. 28
2 Magnam. 68
3 Saepe! 32

DDL

DDL-数据库操作(可以小写)
·查询
查询所有数据库

SHOW DATABASES;

show databases;

查询当前数据库

SELECT DATABASE();

select database();

·创建

CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE排序规则];

create database if not exists xxxx default charset utf8mb4;

·删除

drop database [ if exists ] 数据库名;

drop database if exists xxxx;

·使用

Use 数据库名;

use xxxx;

DDL-表操作-查询:
·查询当前数据库所有表

show tables;

show tables;

·查询表结构:

DESC 表名;


·查询指定表的建表语句:

show create table 表名:

DDL-表操作-创建:

create table 表名(
      字段1 字段1类型 [comment 字段1注释],
      字段2 字段2类型 [comment 字段2注释],
      字段3 字段3类型 [comment 字段3注释],
      ……
      字段n 字段n类型 [comment 字段n注释]
)[comment 表注释];

最后一个字段后面没有,

创建这个表:
id name age gender
1 Lorem. 28
2 Magnam. 68
3 Saepe! 32

命令行:
mysql> use hello;
Database changed
mysql> create table user(
    -> id int comment'编号',
    -> name varchar(50) comment'姓名',
    -> age int comment'年龄',
    -> gender varchar(1) comment'性别'
    -> )comment'用户表';
Query OK, 0 rows affected (0.03 sec)

mysql> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| user            |
+-----------------+
1 row in set (0.00 sec)

mysql> desc user;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int         | YES  |     | NULL    |       |
| name   | varchar(50) | YES  |     | NULL    |       |
| age    | int         | YES  |     | NULL    |       |
| gender | varchar(1)  | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> show create table user;
+-------+--------------------------------------------------------------------------------+
| Table | Create Table                                                             |
+-------+--------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `id` int DEFAULT NULL COMMENT '编号',
  `name` varchar(50) DEFAULT NULL COMMENT '姓名',
  `age` int DEFAULT NULL COMMENT '年龄',
  `gender` varchar(1) DEFAULT NULL COMMENT '性别'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表' |
+-------+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)
DDL-表操作-数据类型:
数值类型、字符串类型、日期时间类型
分类 类型 大小 有符号(SIGNED)范围 无符号(UNSIGNED)范围 描述
数值类型 TINYINT 1 byte (-128, 127) (0, 255) 小整数值
SMALLINT 2 bytes (-32768, 32767) (0, 65535) 大整数值
MEDIUMINT 3 bytes (-8388608, 8388607) (0, 16777215) 大整数值
INT或INTEGER 4 bytes (-2147483648, 2147483647) (0, 4294967295) 大整数值
BIGINT 8 bytes (-2^63, 2^63-1) (0, 2^64-1) 极大整数值
FLOAT 4 bytes (-3.402823466 E+38, 3.402823466351 E+38) 0 和 (1.175494351 E-38, 3.402823466 E+38) 单精度浮点数值
DOUBLE 8 bytes (-1.7976931348623157 E+308, 1.7976931348623157 E+308) 0 和 (2.2250738585072014 E-308, 1.7976931348623157 E+308) 双精度浮点数值
DECIMAL 依赖于M(精度)和D(标度)的值 依赖于M(精度)和D(标度)的值 依赖于M(精度)和D(标度)的值 小数值(精确定点数)

分类 类型 大小 描述
字符串类型 CHAR 0 - 255 bytes 定长字符串
VARCHAR 0 - 65535 bytes 变长字符串
TINYBLOB 0 - 255 bytes 不超过255个字符的二进制数据
TINYTEXT 0 - 255 bytes 短文本字符串
BLOB 0 - 65535 bytes 二进制形式的长文本数据
TEXT 0 - 65535 bytes 长文本数据
MEDIUMBLOB 0 - 16777215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0 - 16777215 bytes 中等长度文本数据
LONGBLOB 0 - 4294967295 bytes 二进制形式的极大文本数据
LONGTEXT 0 - 4294967295 bytes 极大文本数据

分类 类型 大小 范围 格式 描述
日期类型 DATE 3 1000 - 01 - 01 至 9999 - 12 - 31 YYYY - MM - DD 日期值
TIME 3 - 838:59:59 至 838:59:59 HH:MM:SS 时间值或持续时间
YEAR 1 1901 至 2155 YYYY 年份值
DATETIME 8 1000 - 01 - 01 00:00:00 至 9999 - 12 - 31 23:59:59 YYYY - MM - DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970 - 01 - 01 00:00:01 至 2038 - 01 - 19 03:14:07 YYYY - MM - DD HH:MM:SS 混合日期和时间值,时间戳

案例:根据需求创建表(设计合理的数据类型、长度)
设计一张员工信息表,要求如下:
1. 编号(纯数字)
2. 员工工号(字符串类型,长度不超过10位)
3. 员工姓名(字符串类型,长度不超过10位)
4. 性别(男/女,存储一个汉字)
5. 年龄(正常人年龄,不可能存储负数)
6. 身份证号(二代身份证号均为18位,身份证中有X这样的字符)
7. 入职时间(取值年月日即可)
mysql> create table emp(
    ->  id int comment '编号',
    ->  workno varchar(10) comment'工号',
    ->  name varchar(10) comment'姓名',
    ->  gender char(1) comment'性别',
    ->  age tinyint unsigned comment'年龄',
    ->  idcard char(18) comment'身份证号',
    ->  entrydate date comment'入职时间'
    -> )comment'员工表';
Query OK, 0 rows affected (0.03 sec)

mysql>  desc emp;
+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id        | int              | YES  |     | NULL    |       |
| workno    | varchar(10)      | YES  |     | NULL    |       |
| name      | varchar(10)      | YES  |     | NULL    |       |
| gender    | char(1)          | YES  |     | NULL    |       |
| age       | tinyint unsigned | YES  |     | NULL    |       |
| idcard    | char(18)         | YES  |     | NULL    |       |
| entrydate | date             | YES  |     | NULL    |       |
+-----------+------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
    
    
DDL-表操作-修改:
添加字段

alter table 表名 add 字段名 类型(长度)[comment注释] [约束];


案例:为emp表增加一个新的字段“昵称”为nickname,类型varchar(20)
alter table emp add nickname varchar(20) comment'昵称';
mysql> alter table emp add nickname varchar(20) comment'昵称';
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc emp;
+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id        | int              | YES  |     | NULL    |       |
| workno    | varchar(10)      | YES  |     | NULL    |       |
| name      | varchar(10)      | YES  |     | NULL    |       |
| gender    | char(1)          | YES  |     | NULL    |       |
| age       | tinyint unsigned | YES  |     | NULL    |       |
| idcard    | char(18)         | YES  |     | NULL    |       |
| entrydate | date             | YES  |     | NULL    |       |
| nickname  | varchar(20)      | YES  |     | NULL    |       |
+-----------+------------------+------+-----+---------+-------+
8 rows in set (0.00 sec)


修改数据类型

alter table 表名 modify 字段名 新数据类型(长度);


修改字段名和字段类型

alter table 表名 change 旧字段名 新字段名 类型(长度)[comment注释] [约束];


案例:将emp表的nickname字段修改为username,类型为varchar(30)
mysql> alter table emp change nickname username varchar(30) comment'用户名';
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc emp;
+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id        | int              | YES  |     | NULL    |       |
| workno    | varchar(10)      | YES  |     | NULL    |       |
| name      | varchar(10)      | YES  |     | NULL    |       |
| gender    | char(1)          | YES  |     | NULL    |       |
| age       | tinyint unsigned | YES  |     | NULL    |       |
| idcard    | char(18)         | YES  |     | NULL    |       |
| entrydate | date             | YES  |     | NULL    |       |
| username  | varchar(30)      | YES  |     | NULL    |       |
+-----------+------------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
DDL-表操作-修改:
删除字段:

alter table 表名 drop 字段名;

案例:将emp表的字段username删除
mysql> alter table emp drop username;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc emp;
+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id        | int              | YES  |     | NULL    |       |
| workno    | varchar(10)      | YES  |     | NULL    |       |
| name      | varchar(10)      | YES  |     | NULL    |       |
| gender    | char(1)          | YES  |     | NULL    |       |
| age       | tinyint unsigned | YES  |     | NULL    |       |
| idcard    | char(18)         | YES  |     | NULL    |       |
| entrydate | date             | YES  |     | NULL    |       |
+-----------+------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
    
修改表名:

alter table 表名 rename to 新表名;(to可以省略)

案例:将emp的表名修改成employee
mysql> alter table emp rename to employee;
Query OK, 0 rows affected (0.03 sec)

mysql> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| employee        |
| user            |
+-----------------+
2 rows in set (0.00 sec)
    
删除表

drop table [if exists]表名


删除指定表,并重新创建该表

truncate table 表名;

mysql> drop table employee;
Query OK, 0 rows affected (0.02 sec)

mysql> truncate table user;
Query OK, 0 rows affected (0.04 sec)

mysql> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| user            |
+-----------------+
1 row in set (0.00 sec)
总结:
  1. DDL-数据库操作:

    show databases;
    create databases 数据库名;
    use 数据库名;
    Select database();
    drop database 数据库名;

  2. DDL-表操作:

    show tables;
    create table表名(字段 字段类型, 字段 字段类型);
    desc 表名;
    show create table 表名;
    alter table 表名 add/modify/change/drop/rename to...;
    drop table 表名;

DML

DQL

DCL