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); -- 因为存在自增,所以可以写nullinsert 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: 0mysql> 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-存放了数据表的索引。