通用语法及分类
SQL通用语法
SQL语句可以单行或多行书写,以分号结尾。
SQL语句可以使用空格/缩进来增强语句的可读性。
MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
注释:
- 单行注释:- - 注释内容或 # 注释内容(MySQL特有)
- 多行注释:/ * 注释内容 * /
SQL分类
DDL
数据库操作
查询所有数据库 : SHOW DATABASES;
查询当前数据库 :SELECT DATABASE();
创建 : CREATE DATABASE [IF NOT EXISTS]数据库名[DEFAULT CHARSET 字符集] [COLLATE 排序规则];
删除 : DROP DATABASE[IF EXISTS]数据库名;
使用 :USE 数据库名;
表操作-查询
查询当前数据库所有表 :SHOW TABLES;
查询表结构 :DESC 表名;
查询指定表的建表语句 :SHOW CREATE TABLE 表名;
表操作-创建
CREATE TABLE 表名( 字段1 字段1类型[COMMENT 字段1注释], 字段2 字段2类型[COMMENT 字段2注释], 字段3 字段3类型[COMMENT 字段3注释], ...... 字段n 字段n类型[COMMENT 字段n注释] )[COMMENT 表注释];
[...]为可选参数,最后一个后面没有逗号。
表操作-数据类型
分类 | 类型 | 大小 | 有符号(SUGNED)范围 | 无符号(UNSIGNED)范围 | 描述 |
数值类型 | TINYINT | 1byte | (-128,127) | (0,255) | 小整数值 |
SMALLTNT | 2bytes | (-32768,32767) | (0,65535) | 大整数值 | |
MEDIUMINF | 3bytes | (-8388608,8388607) | (0.16777215) | 大整数值 | |
INT或INTEGER | 4bytes | (-2147483648,2147483647) | (0,4294967295) | 大整数值 | |
BIGINT | 8bytes | (-2^63,2^63-1) | (0,2^64-1) | 极大整数值 | |
FLOAT | 4bytes | (-3.402823466E+38,3.402823466351E+38) | 0和(1.75494351E-38,3.402823466351E+38) | 单精度浮点数值 | |
DOUBLE | 8bytes | (-1.7976931348623157E+308,1.7976931348623157E+308) | 0和(2.2250738585072014E-308,1.7976931348623157E+308) | 双精度浮点数值 | |
DECIMAL | 依赖于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 | 1000-01-01 00:00:01至2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值,时间戳 |
案例:设计一张员工信息表,要求如下:
- 编号(纯数字)
- 员工工号(字符串类型,长度不超过10位)
- 员工姓名(字符串类型,长度不超过10位)
- 性别(男/女,存储一个汉字)
- 年龄(正常人年龄,无负数)
- 身份证号(身份证号码为18位,身份证有可能带有X)
- 入职时间(取值年月日即可)
代码:
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'员工表';
控制台效果如图所示:
表操作-修改
添加字段: ALTERTABLE 表名 ADD 字段名 类型(长度)[COMMENT 注释] [约束];
案例:为emp表增加一个新字段“昵称”为nickname,类型为varchar(20)
alter table emp add nickname varchar(20);
控制台效果如图所示:
修改数据类型 ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
修改字段字段名和字段类型:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度)[COMMENT 注释] [约束];
案例:将emp表的nickname字段修改为username,类型改为varchar(30)
alter table emp change nickname username varchar(30) comment'用户名';
控制台运行效果如图所示:
要先选择好数据库在进行更改。
删除字段:ALTER TABLE 表名 DROP 字段名;
案例:将emp表中的username字段删除:
alter table emp drop username;
控制台效果如图所示:
修改表名:ALTER TABLE 表名 RENAME TO 新表名;
案例:将emp表的表名改为employee
alter table emp rename to employee;
控制台效果如图所示:
表操作-删除
删除表:DROP TABLE[IF EXISTS]表名;
删除指定表,并重新创建该表:TRUNCATE TABLE 表名;
注意:删除表的同时数据也会被删除。
DML
介绍
DML三个关键字:
- 添加数据(INSERT)
- 修改数据(UPDATE)
- 删除数据(DELETE)
-- 小练习
/*
创建员工表employee,字段如下:
id(员工编号),name(员工名字),gender(员工性别),salary(员工薪资)
*/
create table if not exists employee( id int, name varchar(20), gender varchar(5), salary double );
运行效果如图所示:
/*
张三、男、2000
李四、男、2002
王五、女、2003
*/
insert into employee(id,name,gender,salary) values(1001,'张三','男',2000), (1002,'李四','男',2002), (1003,'王五','女',2003);
运行效果如图所示:
-- 将所有员工薪水改为5000元
update employee set salary = 5000;
运行效果如图所示:
-- 将姓名为‘张三’的员工薪水修改为3000元
update employee set salary = 3000 where name = '张三';
运行效果如图所示:
-- 将姓名为‘李四’的员工薪水修改为4000元,gender修改为女
update employee set salary = 4000, gender = '女' where name = '李四';
运行效果如图所示:
-- 将王五的薪水在原有的基础上增加1000元
update employee set salary = salary + 1000 where name = '王五';
运行效果如图所示:
MySQL约束
概念
约束实际上就是表中数据的限制条件。
作用
表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复。
分类
- 主键约束(primary key)PK
- 自增长约束(auto_increment)
- 非空约束(not null)
- 唯一性约束(unique)
- 默认约束(default)
- 零填充约束(zerofill)
- 外键约束(foreign key)FK
MySQL约束-主键约束
概念
- MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中尽快的找到某一行。
- 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。
- 每个表最多只允许一个主键。
- 主键约束的关键字是:primary key。
- 当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
操作-添加单列主键
/*
-- 在create table语句中,通过primary key关键字来指定主键
*/
-- 在定义字段的同时指定主键 create table emp1( eid int primary key, name varchar(20), deptId int, salary double );
运行效果如图所示:
-- 在定义字段之后在指定主键 create table emp2( eid int, name varchar(20), deptId int, salary double, primary key(eid) );
运行效果如图所示:
操作-添加多列主键(联合主键)
所谓的联合主键,就是这个主键是由一张表中多个字段组成的。
注意:
- 当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。
- 一张表只能有一个主键,联合主键也是一个主键。
实现:
create table emp3( name varchar(20), deptId int, salary double, primary key(name,deptId) );
运行效果如图所示:
操作-修改表结构添加主键
-- 添加单列主键
create table emp4( eid int, name varchar(20), deptId int, saraly double ); alter table emp4 add primary key(eid);
运行效果如图所示:
-- 添加多列主键
create table emp5( eid int, name varchar(20), deptId int, saraly double ); alter table emp5 add primary key(name,deptId);
运行效果如图所示:
操作-删除主键约束
alter table emp1 drop primary key;
运行效果如图所示:
MySQL约束-自增长约束
概念:
在MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户数据了,而由数据系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
-- 自增长约束
create table t_user1( id int primary key auto_increment, name varchar(20) ); insert into t_user1 values(null,'张三'); insert into t_user1(name) values('李四');
运行效果如图所示:
特点
- 默认情况下,auto_increment的初始值是1,每新增一条记录,字段值自动加1.
- 一个表中只能有一个字段使用auto_increment约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
- 约束的字段必须具备NOT NULL属性。
- 约束的字段只能是整数类型。
- 约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。
-- 指定自增长的初始值
-- 创建表时指定 create table t_user2( id int primary key auto_increment, name varchar(20) )auto_increment = 100; insert into t_user2 values(null,'张三'); insert into t_user2 values(null,'张三');
运行效果如图所示:
-- 创建表之后指定 create table t_user3( id int primary key auto_increment, name varchar(20) ); alter table t_user3 auto_increment = 200; insert into t_user3 values(null,'张三'); insert into t_user3 values(null,'张三');
运行效果如图所示:
delete from t_user1; insert into t_user1 values(null,'张三'); insert into t_user1 values(null,'李四');
运行效果如图所示:
注意:使用delete删除表内数据之后,再次加入数据时自增长段会在上次的基础上进行赋值。
truncate t_user1; insert into t_user1 values(null,'张三'); insert into t_user1 values(null,'李四');
运行效果如图所示:
注意:使用truncate删除表内元素,再次加入数据时会从初始值开始。
MySQL约束-非空约束
概念
MySQL非空约束值字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
操作-添加非空约束
-- 创建表时指定 create table t_user6( id int, name varchar(20) not null, address varchar(20) not null );
-- 创建表之后指定 create table t_user7( id int, name varchar(20), address varchar(20) ); alter table t_user7 modify name varchar(20) not null; alter table t_user7 modify address varchar(20) not null;
-- 删除非空约束 alter table t_user7 modify name varchar(20); alter table t_user7 modify address varchar(20);
MySQL约束-唯一约束
概念
唯一约束是指所有记录中字段的值不能重复出现。
操作-添加唯一约束
-- 创建表时指定 create table t_user8( id int, name varchar(20), phone_number varchar(20) unique );
注意:在唯一约束中,null与任何值都不相同包括自己。
MySQL约束-默认约束
create table t_user9( id int, name varchar(20), address varchar(20) default '北京' ); insert into t_user9(id,name) values(1001,'张三');
运行效果如图所示:
create table t_user10( id int, name varchar(20), address varchar(20) ); alter table t_user10 modify address varchar(20) default'深圳'; insert into t_user10(id,name) values(1001,'张三');
运行效果如图所示:
-- 删除默认约束
alter table t_user10 modify address varchar(20) default null; insert into t_user10(id,name) values(1002,'李四');
运行效果如图所示:
DQL
概念
- 数据库管理系统一个重要功能就是数据查询,数据查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示。
- MySQL提供了功能强大、灵活的语句来实现这些操作。
- MySQL数据库使用select语句来查询数据。
数据准备
-
创建数据库和表
-- 创建数据库 create database mydb2; use mydb2; -- 创建商品表 create table product( pid int primary key auto_increment, pname varchar(20) not null, price double, category_id varchar(20) );
- 添加数据
insert into product values(null,'海尔洗衣机',5000,'c001'); insert into product values(null,'美的冰箱',3000,'c001'); insert into product values(null,'格力空调',5000,'c001'); insert into product values(null,'九阳电饭煲',5000,'c001'); insert into product values(null,'啄木鸟衬衣',300,'c002'); insert into product values(null,'恒源祥西裤',800,'c002'); insert into product values(null,'花花公子夹克',440,'c002'); insert into product values(null,'劲霸休闲裤',266,'c002'); insert into product values(null,'海澜之家卫衣',180,'c002'); insert into product values(null,'杰克琼斯运动裤',430,'c002'); insert into product values(null,'兰蔻面霜',300,'c003'); insert into product values(null,'雅诗兰黛精华水',200,'c003'); insert into product values(null,'香奈儿香水',350,'c003'); insert into product values(null,'SK-II神仙水',350,'c003'); insert into product values(null,'资生堂粉底液',180,'c003'); insert into product values(null,'老北京方便面',56,'c004'); insert into product values(null,'良品铺子海带丝',17,'c004'); insert into product values(null,'三只松鼠坚果',88,'c004');
-- 查询所有的商品
select* from product;
运行效果如图所示:
-- 查询商品名和商品价格
select pname,price from product;
运行效果如图所示:
-- 去掉重复值
select distinct price from product;
-- 将所有商品加10元进行显示
select pname, price + 10 new_price from product;
运行效果如图所示:‘’
-- 查询商品名称为“海尔洗衣机”商品的所有信息
select * from product where pname='海尔洗衣机';
-- 查询价格为800的商品
select * from product where price=800;
-- 查询价格不是800的商品
select * from product where price!=800; select * from product where price<>800; select * from product where not(price=800);
-- 查询商品价格大于等于60元的所有商品
select * from product where price>=60;
-- 查询商品价格在200到1000的所有商品
select * from product where price between 200 and 1000; select * from product where price>=200 and price<=1000; select * from product where price>=200 && price<=1000;
-- 查询商品价格是200或800的所有商品
select * from product where price in(200,800); select * from product where price=200 or price=800; select * from product where price=200 || price=800;
-- 查询含有"裤"字的所有商品
select * from product where pname like '%裤%';
-- 查询以“海”字开头的所有商品
select * from product where pname like '海%';
-- 查询第二个字为“蔻”的所有商品
select * from product where pname like '_蔻%';
-- 查询category_id为null的商品
select * from product where category_id is null;
-- 查询category_id不为null的商品
select * from product where category_id is not null;
-- 使用least求最小值
select least(10,5,20) as small_number; select least(10,null,20) as small_number; --如果数值有null那么结果为null
-- 使用greatest求最大值
select greatest(10,5,20) as big_number;
-- 使用价格排序(降序)
select * from product order by price desc;
-- 在价格排序(降序)的基础上,以分类排序(排序)
select * from product order by price desc,category_id asc;
-- 显示商品的价格(去重复),并排序(降序)
select distinct price from product order by price desc;
/*
count() 统计指定列不为null的记录行数;
sum()计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
max()计算指定列的最大值,如果指定列为字符串类型,那么使用字符串排序运算;
min()计算指定列的最小值,如果指定列为字符串类型,那么使用字符串排序运算;
avg()计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
*/
-- 查询商品的总条数
select count(*) from product;
运行效果如图所示:
-- 查询价格大于200商品的总条数
select count(pid) from product where price > 200;
运行效果如图所示:
-- 查询分类为'c001'的所有商品的总和
select sum(price) from product where category_id = 'c001';
运行效果如图所示:
-- 查询商品的最大价格
select max(price) from product;
运行效果如图所示:
-- 查询商品的最小价格
select min(price) from product;
运行效果如图所示:
-- 查询最大价格与最小价格
select max(price) max_price,min(price) min_price from product;
运行效果如图所示:
-- 查询分类为'c002'所有商品的平均价格
select avg(price) from product where category_id = 'c002';
运行效果如图所示:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码