1. SQL 分类
SQL 根据功能分为以下几类:
**DDL **: 定义数据库对象(库、表、列、索引等)
- 常用语句:
CREATE
,DROP
,ALTER
,RENAME
,TRUNCATE
- 示例:
CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL );
- 常用语句:
**DML **: 操作数据库记录
- 常用语句:
INSERT
,DELETE
,UPDATE
,SELECT
- 示例:
INSERT INTO t_user (name) VALUES ('Alice');
- 常用语句:
**DQL **: 数据查询
- 常用语句:
SELECT
- 示例:
SELECT * FROM t_user WHERE age > 20;
- 常用语句:
**DCL **: 控制数据库访问权限
- 常用语句:
GRANT
,REVOKE
- 示例:
GRANT SELECT ON db_name.* TO 'user'@'localhost';
- 常用语句:
2. SQL 语句书写规范
- SQL 语句不区分大小写,但建议关键字大写。
- 字符串常量区分大小写。
- 每条 SQL 语句以
;
结尾。 - 使用空格和缩进提高可读性。
- 注释:
- 多行注释:
/* 注释内容 */
- 单行注释:
-- 注释内容
或# 注释内容
- 多行注释:
3. 数据库操作
- 创建数据库:
#创建数据库 CREATE DATABASE 数据库名称; # 创建数据库,同时指定编码 create database db_name default charset="utf8mb4"; create database school DEFAULT CHARACTER SET utf8mb4; create database school DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 查询当前数据库是哪个数据库 select database(); 查看数据库版本 SELECT VERSION(); 查看当前用户 SELECT USER(); 查看所有用户 SELECT User,Host,Password FROM mysql.user; 注意:在 MySQL 5.7 及以上版本中,mysql.user 表中的 password 字段已经被移除,取而代之的是 authentication_string 字段。因此,如果你想查看用户的密码信息,需要使用 authentication_string 字段。 SELECT user, host, authentication_string FROM mysql.user; # 查看创建的数据库 show create databsse 数据库名称;
- 删除数据库:
DROP DATABASE 数据库名;
- 查看数据库编码:
SHOW VARIABLES LIKE 'character%';
character_set_client:MySQL客户机字符集。
character_set_connection:数据通信链路字符集,当MySQL客户机向服务器发送请求时,请求数据以
该字符集进行编码。
character_set_database:数据库字符集。
character_set_filesystem:MySQL服务器文件系统字符集,该值是固定的binary。
character_set_results:结果集的字符集,MySQL服务器向MySQL客户机返回执行结果时,执行结果以
该字符集进行编码。
character_set_server:MySQL服务实例字符集。
character_set_system:元数据(字段名、表名、数据库名等) 的字符集,默认值为utf8。
- 切换数据库:
USE db_name;
4. 数据库表操作
创建表:
-- 语法结构 create table [if not exists] t_name ( # 定义表结构 字段名称1 类型 [约束条件], 字段2 类型 [约束条件], …… 字段n 类型 [约束条件] ); /** 创建一个用户表 用户的姓名 用户的年龄 用户的性别 用户的地址 用户的电话**/ create table t_user ( id int, name varchar(50), age int, gender char(5), address varchar(255), tel char(11) ); # 查询表中的数据 select * from t_user; # 插入数据 insert into t_user values(1, "张三", 16, '男', "四川成都", "110");
删除表:
DROP TABLE t_user;
查看表结构:
DESC t_user;
5. 数据类型
数值型:
INT
: 整数FLOAT
: 单精度浮点数DOUBLE
: 双精度浮点数DECIMAL
: 精确小数
字符串型:
CHAR
: 定长字符串VARCHAR
: 变长字符串TEXT
: 长文本数据BLOB
: 二进制大对象
日期和时间型:
DATE
: 日期(YYYY-MM-DD)DATETIME
: 日期和时间(YYYY-MM-DD HH:MM:SS)TIMESTAMP
: 时间戳(从 1970-01-01 开始的秒数)
6. 数据库约束
- 主键约束: 唯一标识一条记录
案列:id INT PRIMARY KEY
create table t_user( id int, name varchar(50)); # 插入数据测试 insert into t_user values(1, "张三"); insert into t_user values(1, "张三"); select * from t_user; drop table t_user; create table t_user( id int primary key, -- 主键约束 name varchar(50) ); # 插入数据测试 insert into t_user values(1, "张三"); insert into t_user values(1, "张三"); insert into t_user values(null, "张三"); insert into t_user values(2, "张三"); drop table t_user; create table t_user( id int primary key auto_increment, -- 主键约束 name varchar(50) ); # 插入数据测试 insert into t_user values(1, "张三"); insert into t_user values(1, "张三"); insert into t_user values(null, "张三"); insert into t_user values(2, "张三"); insert into t_user(name) value("张三"); -- 主键还存在一种写法 create table t_user( id int auto_increment, -- 主键约束 name varchar(50), primary key(id) );
唯一约束: 确保字段值唯一
email VARCHAR(100) UNIQUE
案例:
唯一性约束条件确保所在的字段或者字段组合不出现重复值 唯一性约束条件的字段允许出现一个NULL 同一张表内可建多个唯一约束 唯一约束可由多列组合而成 建唯一约束时MySQL会为之建立对应的索引——唯一索引。 如果不给唯一约束起名,该唯一约束默认与列名相同。 CREATE TABLE tb_student( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(18) UNIQUE -- 唯一约束 ); CREATE TABLE tb_student( id INT AUTO_INCREMENT, NAME VARCHAR(18), -- 唯一约束 PRIMARY KEY(id), unique(name) );
非空约束: 字段值不能为空
name VARCHAR(50) NOT NULL
案例:
create table t_user( id int primary key auto_increment, name varchar(50) unique not null, age int default 18 , password varchar(255) not null ); insert into t_user values(1, "张三", 20, "123456"); -- 报错 insert into t_user(name, age) values("李四", 18); insert into t_user values(null, "王二", 16); -- 因为存在自增,所以可以写null insert into t_user(name, age, password) values("刘帅哥", 18, "123456"); insert into t_user(name, password) values("张三", "123456");
默认值约束: 字段的默认值
age INT DEFAULT 18
案例:
create table t_user( id int primary key auto_increment, name varchar(50) unique, age int default 18 -- 默认值约束 ); insert into t_user values(1, "刘二", 20); insert into t_user(name, age) values("刘帅哥", 18); insert into t_user values(null, "刘欧巴", 16); -- 因为存在自增,所以可以写null insert into t_user values(default, "刘文理", 16); -- 因为存在自增,所以可以写默认 insert into t_user(name) values("张三"); insert into t_user(name) values("李四");
外键约束: 关联其他表的主键
FOREIGN KEY (class_id) REFERENCES classes(id)
检查约束: 确保字段值符合条件(MySQL 8.0+)
age INT CHECK (age >= 18)
案例:
create table t_stu( id int primary key auto_increment, name varchar(50) not null unique, age int check(age >= 18), # gender char(2) check(gender in ("男", "女")) gender enum("男", "女") ); insert into t_stu value(null, "zs", 20, "女"); insert into t_stu value(null, "lisi", 10, "女"); insert into t_stu value(null, "lisi", 18, "女"); insert into t_stu value(null, "ww", 28, "哈");
7. 修改表的结构
在sql中,也提供了动态修改表结构的sql功能。
使用alter
指令,实现对数据库对象的结构的调整和修改。
修改列类型
ALTER TABLE 表名 MODIFY 列名 列类型; -- 注意存在值的情况,类型不一定能成功
增加列
ALTER TABLE 表名 ADD 列名 列类型;
删除列
ALTER TABLE 表名 DROP 列名;
列改名
ALTER TABLE 表名 CHANGE 旧列名 新列名 列类型;
更改表名
ALTER TABLE 表名 RENAME 新表名;
RENAME TABLE 表名 TO 新表名;
案例:
alter table t_user add mark int default 0;
alter table t_user modify mark varchar(10);
alter table t_user modify mark int;
alter table t_user add test int;
alter table t_user drop test;
alter table t_user change test address varchar(255);
alter table t_user rename user;
rename table user to t_user;
8. 复制表的内容
复制一个表结构的实现方法有两种
方法一:在create table语句的末尾添加like子句,可以将源表的表结构复制到新表中,语法格式如下。
create table 新表名 like 源表
方法二:在create table语句的末尾添加一个select语句,可以实现表结构的复制,甚至可以将源表的表
记录拷贝到新表中。下面的语法格式将源表的表结构以及源表的所有记录拷贝到新表中。
create table 新表名 select * from 源表
方法三:如果已经存在一张机构一致的表,复制数据
insert into 表 select * from 原表;
案例:
mysql> create table user like t_user;
Query OK, 0 rows affected (0.06 sec)
mysql> show tables;
+----------------------+
| Tables_in_db_chengke |
+----------------------+
| t_stu |
| t_user |
| user |
+----------------------+
3 rows in set (0.00 sec)
mysql> desc user;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | UNI | NULL | |
| age | int | YES | | 18 | |
| password | varchar(255) | NO | | NULL | |
| mark | varchar(10) | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
mysql> select * from user;
Empty set (0.00 sec)
mysql> select * from t_user;
+----+-----------+------+----------+-----------+---------+
| id | name | age | password | mark | address |
+----+-----------+------+----------+-----------+---------+
| 1 | 张三 | 20 | 123456 | 0 | NULL |
| 2 | 刘帅哥 | 18 | 123456 | 0 | NULL |
| 3 | 张三 | 18 | 123456 | 0 | NULL |
| 4 | hehe | 20 | 122 | 张三 | NULL |
+----+-----------+------+----------+-----------+---------+
4 rows in set (0.00 sec)
mysql> create table user select * from t_user;
Query OK, 4 rows affected (0.04 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> show tables;
+----------------------+
| Tables_in_db_chengke |
+----------------------+
| t_stu |
| t_user |
| user |
+----------------------+
3 rows in set (0.00 sec)
mysql> select * from user;
+----+-----------+------+----------+-----------+---------+
| id | name | age | password | mark | address |
+----+-----------+------+----------+-----------+---------+
| 1 | 张三 | 20 | 123456 | 0 | NULL |
| 2 | 刘帅哥 | 18 | 123456 | 0 | NULL |
| 3 | 张三 | 18 | 123456 | 0 | NULL |
| 4 | hehe | 20 | 122 | 张三 | NULL |
+----+-----------+------+----------+-----------+---------+
4 rows in set (0.00 sec)
mysql> desc user;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | NO | | 0 | |
| name | varchar(50) | NO | | NULL | |
| age | int | YES | | 18 | |
| password | varchar(255) | NO | | NULL | |
| mark | varchar(10) | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
create table user select id, name, mark from t_user;
-- 将查询的数据快速插入到表中
insert into user select * from user;
8. 数据库字典
由information_schema数据库负责维护
tables-存放数据库里所有的数据表、以及每个表所在数据库。
schemata-存放数据库里所有的数据库信息
views-存放数据库里所有的视图信息。
columns-存放数据库里所有的列信息。
triggers-存放数据库里所有的触发器。
routines-存放数据库里所有存储过程和函数。
key_column_usage-存放数据库所有的主外键
table_constraints-存放数据库全部约束。
statistics-存放了数据表的索引。