实用 SQL 语句
前言
文章沿着设计一个假想的应用 awesome_app
为主线,从零创建修改数据库,表格,字段属性,索引,字符集,默认值,自增,增删改查,多表查询,内置函数等实用 SQL 语句。收藏此文,告别零散又低效地搜索经常使用的 SQL 语句。所有 SQL 都在 MySQL 下通过验证,可留着日后回顾参考,也可跟着动手一起做,如果未安装 MySQL 可参考 《macOS 安装 mysql》 (windows 安装大同小异)。
1. 创建
1.1 创建数据库
语法:create database db_name
示例:创建应用数据库 awesome_app
1 | create database `awesome_app` |
1.2 创建表格
语法:create table table_name ( … columns )
示例:创建用户表 users
1 | create table `users` |
1.3 创建索引
语法:create index index_name on table_name (column_name)
示例:为用户 id
创建索引 idx_id
1 | create index `idx_id` on `users` (`id`) |
1.4 为已存在的列创建主键
更常用的方式是在创建表语句所有列定义的后面添加一行
primary key (column_name)
。
语法:alter table table_name add primary key (column_name)
示例:将用户 id
设为主键
1 | alter table users add primary key (`id`) |
1.5 为已存在的列创建自增约束
更常用的方式是在创建表语句中添加自增列
id int not null auto_increment
。
1 | alter table `users` modify `id` int not null auto_increment |
2. 插入
语法:
- insert into table_name values (value1, value2, …)
- insert into table_name (column1, column2, …) values (value1, value2, …)
示例:新增注册用户
1 | insert into `users` values (1, 'ken', 'http://cdn.awesome_app.com/path/to/xxx/avatar1.jpg', curdate()) |
3. 修改
3.1 修改数据记录
语法:
- update table_name set column=new_value where condition
- update table_name set column1=new_value1,column2=new_value2,… where condition
示例:
1 | update `users` set `regtime`=curdate() where `regtime` is null |
3.2 修改数据库字符集为 utf8
1 | alter database `awesome_app` default character set utf8 |
3.3 修改表字符集为 utf8
1 | alter table `users` convert to character set utf8 |
3.4 修改表字段字符集为 utf8
1 | alter table `users` modify `name` char(10) character set utf8 |
3.5 修改字段类型
1 | alter table `users` modify `regtime` datetime not null |
3.5 修改字段默认值
1 | alter table `users` alter `regtime` set default '2019-10-12 00:00:00' |
4. 删除
4.1 删除数据记录
语法:delete from table_name where condition
示例:删除用户名未填写的用户
1 | # 先增加一条用户名为空的用户 |
4.2 删除数据库
1 | drop database if exists `awesome_app` |
4.3 删除表
1 | drop table if exists `users` |
4.4 清空表中所有数据
这个操作相当于先 drop table
再 create table
,因此需要有 drop
权限。
1 | truncate table `users` |
4.5 删除索引
1 | drop index `idx_id` on `users` |
5. 查询
5.1 语法
1 | SELECT |
5.2 单表查询
5.2.1 准备数据:
1 | insert into users (`name`, `avatar`) values |
5.2.2 查询所有列
1 | mysql> select * from users; |
5.2.3 查询指定列
1 | mysql> select id,name from users; |
5.2.4 查询不重复记录
1 | mysql> select distinct name,avatar from users; |
5.2.5 限制查询行数
查询前几行
1 | mysql> select id,name from users limit 2; |
查询从指定偏移(第一行为偏移为0)开始的几行
1 | mysql> select id,name from users limit 2,3; |
5.2.6 排序
1 | # 正序 |
5.2.7 分组
增加城市字段
1 | alter table `users` add `city` varchar(10) comment '用户所在城市' after `name`; |
按城市分组统计用户数
1 | mysql> select city, count(name) as num_of_user from users group by city; |
5.3 多表关联查询
5.3.1 准备数据
1 | create table if not exists `orders` |
5.3.2 join
join
用于在多个表中查询相互匹配的数据。
1 | mysql> select `users`.`name` as `user_name`, `orders`.`title` as `order_title` from `users`, `orders` where `orders`.`user_id`=`users`.`id`; |
inner join
内部连接。效果与 join
一样 , 但用法不同,join
使用 where
,inner join
使用 on
。
1 | mysql> select `users`.`name` as `user_name`, `orders`.`title` as `order_title` from `users` inner join `orders` on `orders`.`user_id`=`users`.`id`; |
left join
左连接。返回左表所有行,即使右表中没有匹配的行,不匹配的用 NULL
填充。
1 | mysql> select `users`.`name` as `user_name`, `orders`.`title` as `order_title` from `users` left join `orders` on `orders`.`user_id`=`users`.`id`; |
right join
右连接。和 left join
正好相反,会返回右表所有行,即使左表中没有匹配的行,不匹配的用 NULL
填充。
1 | mysql> select `groups`.`title` as `group_title`, `users`.`name` as `user_name` from `groups` right join `users` on `users`.`group_id`=`groups`.`id`; |
5.3.3 union
union
用于合并两个或多个查询结果,合并的查询结果必须具有相同数量的列,并且列拥有形似的数据类型,同时列的顺序相同。
1 | mysql> (select `id`, `title` from `groups`) union (select `id`, `title` from `orders`); |
6. 函数
6.1 语法
select function(column) from table_name
6.2 合计函数(Aggregate functions)
合计函数的操作面向一系列的值,并返回一个单一的值。通常与 group by
语句一起用。
函数 | 描述 |
---|---|
avg(column) | 返回某列的平均值 |
count(column) | 返回某列的行数(不包括 NULL 值) |
count(*) | 返回被选行数 |
first(column) | 返回在指定的域中第一个记录的值 |
last(column) | 返回在指定的域中最后一个记录的值 |
max(column) | 返回某列的最高值 |
min(column) | 返回某列的最低值 |
sum(column) | 返回某列的总和 |
6.3 标量函数(Scalar functions)
函数 | 描述 |
---|---|
ucase(c) | 转换为大写 |
lcase(c) | 转换为小写 |
mid(c, start[, end]) | 从文本提取字符 |
len(c) | 返回文本长度 |
instr(c, char) | 返回在文本中指定字符的数值位置 |
left(c, number_of_char) | 返回文本的左侧部分 |
right(c, number_of_char) | 返回文本的右侧部分 |
round(c, decimals) | 对数值指定小数位数四舍五入 |
mod(x, y) | 取余(求模) |
now() | 返回当前的系统日期 |
format(c, format) | 格式化显示 |
datediff(d, date1, date2) | 日期计算 |