- 一、库相关
- 1. 查询所有数据库
- 2.创建数据库并指定字符集为UTF-8
- 3. 查询数据库详情
- 4. 删除数据库
- 5. 使用数据库
- 二、表相关(操作数据必须保证已经使用了某个数据库)
- 1. 查询所有表
- 2. 创建表
- 3. 复制表
- 4. 查询表信息
- 5. 查询表字段
- 6. 修改表名
- 7. 删除表
- 8.添加表字段
- 9. 删除表字段
- 10. 修改表字段
- 三、数据相关(操作数据必须保证已经使用了某个数据库并且已经准备好了保存数据的表)
- 1.向表中插入数据
- 2. 查询数据
- 3. 修改数据
- 4. 删除数据
- 四、其他
- 1.数据类型
- 2. 模糊查询 like
- 3.去重 distinct
- 4. is null & is not null
- 5. and & or
- 6. 比较运算符 > < >= <= = !=和<>
- 7. 两者之间 between ... and ...
- 8. in关键字
- 9. 排序 order by
- 10. 分页查询
- 11. 别名
- 12. 聚合函数
- 13. 数值计算 + - * / %
格式:show databases;
举例:
show databases;2.创建数据库并指定字符集为UTF-8
格式:create database 数据库名 character set utf8;
UTF-8字符集:
-
目前utf8和utf8mb3一样,代表的是 用3个字节表示一个字符 (mb3=most byte 3)
-
utf8mb4最多不超过4个字节表示一个字符(设计数据库时如果想要允许用户使用特殊符号(Emoji表情等),最好使用utf8mb4编码来存储)
举例:
create database hero_db character set utf8;3. 查询数据库详情
格式:show create database 数据库名;
举例:
show create database hero_db;4. 删除数据库
格式:drop database 数据库名;
举例:
drop database hero_db;5. 使用数据库
格式:use 数据库名;
举例:
use hero_db;二、表相关(操作数据必须保证已经使用了某个数据库) 1. 查询所有表
格式:show tables;
show tables;2. 创建表
格式:create table 表名 (字段名1 类型,字段名2 类型,…);
举例:
create table hero(name varchar(10) not null,job varchar(10) not null,price int not null);3. 复制表
-
复制表结构及数据到新表
格式:create table 新表名 select * from 源表名 ;
举例:
create table hero_new as select * from hero ;
-
只复制表结构到新表
格式1: create table 新表名 like 源表名;
格式2: create table 新表名 select * from 源表名 where 1=2;
举例1:
create table hero_new like hero;
举例2:
create table hero_new select * from hero where 1=2;
-
复制表1的数据到表2(假设两个表结构一样)
格式:insert into 表2 select from 表1*
insert into hero_new select * from hero;
-
复制表1的数据到表2(假设两个表结构不一样)
格式:insert into 表2(字段名1,字段名2,…) SELECt 字段名1,字段名2,… from 表1
insert into hero_new(name,price) SELECt name,price from hero
格式:show create table 表名;
举例:
show create table hero;5. 查询表字段
格式:desc 表名;
举例:
desc hero;6. 修改表名
格式:rename table 原表名 to 新表名;
举例:
rename table hero to hero_new;7. 删除表
格式:drop table 表名;
举例:
drop table hero;8.添加表字段
-
最后面添加
格式: alter table 表名 add 字段名 类型;
举例:
alter table hero add job varchar(5);
-
最前面添加
格式: alter table 表名 add 字段名 类型 first;
举例:
alter table hero add id int first;
-
在某字段后面添加
格式:alter table 表名 add 字段名 类型 after 字段名;
alter table hero add gender varchar(5) after name;
格式:alter table 表名 drop 字段名;
举例:
alter table hero drop gender;10. 修改表字段
格式: alter table 表名 change 原名 新名 新类型;
举例:
alter table hero change name hero_name varchar(10);三、数据相关(操作数据必须保证已经使用了某个数据库并且已经准备好了保存数据的表) 1.向表中插入数据
-
全表插入
格式:insert into 表名 values(值1,值2);
举例:
insert into hero values('薇恩','射手'); -
指定字段插入
格式:insert into 表名(字段名1,字段名2)values(值1,值2);
举例:
insert into hero(name,job)values('弗拉基米尔','法师');
-
查询满足条件的指定字段信息
格式:select 字段信息 from 表名 where 条件;
举例:
select name from hero where price > 6300;
-
查询全部字段**(阿里java开发手册禁止使用*作为查询字段)**
格式:select * from 表名 ;
举例:
select * from hero;
格式:update 表名 set 字段名1 = 值1,字段名2 = 值2,… where 条件;
举例:
update hero set price = 1350,gender = '女' where name ='妮蔻';4. 删除数据
格式:delete from 表名 where 条件;
举例:
delete from hero where name = '阿克尚';四、其他
下面测试会用到如下表:
| 数据类型 | 描述 |
|---|---|
| CHARACTER(n) | 字符/字符串。固定长度 n。 |
| VARCHAr(n) 或 CHARACTER VARYING(n) | 字符/字符串。可变长度。最大长度 n。 |
| BINARY(n) | 二进制串。固定长度 n。 |
| BOOLEAN | 存储 TRUE 或 FALSE 值 |
| VARBINARY(n) 或 BINARY VARYING(n) | 二进制串。可变长度。最大长度 n。 |
| INTEGER§ | 整数值(没有小数点)。精度 p。 |
| SMALLINT | 整数值(没有小数点)。精度 5。 |
| INTEGER | 整数值(没有小数点)。精度 10。 |
| BIGINT | 整数值(没有小数点)。精度 19。 |
| DECIMAL(p,s) | 精确数值,精度 p,小数点后位数 s。例如:decimal(5,2) 是一个小数点前有 3 位数,小数点后有 2 位数的数字。 |
| NUMERIC(p,s) | 精确数值,精度 p,小数点后位数 s。(与 DECIMAL 相同) |
| FLOAT§ | 近似数值,尾数精度 p。一个采用以 10 为基数的指数计数法的浮点数。该类型的 size 参数由一个指定最小精度的单一数字组成。 |
| REAL | 近似数值,尾数精度 7。 |
| FLOAT | 近似数值,尾数精度 16。 |
| DOUBLE PRECISION | 近似数值,尾数精度 16。 |
| DATE | 存储年、月、日的值。 |
| TIME | 存储小时、分、秒的值。 |
| TIMESTAMP | 存储年、月、日、小时、分、秒的值。 |
| INTERVAL | 由一些整数字段组成,代表一段时间,取决于区间的类型。 |
| ARRAY | 元素的固定长度的有序集合 |
| MULTISET | 元素的可变长度的无序集合 |
| XML | 存储 XML 数据 |
通配符:
_ 表示任意的单个字符
% 表示零个或多个字符串
[] 表示括号内所列字符中的一个(类似正则表达式)
[^] 表示不在括号所列之内的单个字符
建议: 在查询的时候尽量不要在前面加_ ,% 等字符,导致不会走索引,而是全表扫描
举例:
-
查询名字第二个字是恩的数据
select * from hero where name like '_恩%';
查询结果为:
-
查询名字以卡开头的数据
select * from hero where name like '卡%';
查询结果为:
-
查询名字为张1,张2,...,张9的数据
select * from hero where name like '张[0123456789]';
select * from hero where name like '张[0-9]';
-
查询名字不为'赵一','钱一','孙一','李一'的数据
select * from hero where name like '[^赵钱孙李]一';
distinct用于返回唯一不同的值
格式:select distinct 字段名1,字段名2,…from 表名;(distinct必须放在开头)
举例:
查询英雄表中所有不同的职业
select distinct job from hero;
查询结果为:
假如 “hero” 表中的 “skin_owner” 列是可选的.这意味着如果在 “skin_owner” 列插入一条不带值的记录,“skin_owner” 列会使用 null 值保存.
那么我们如何测试 null值呢?
无法使用比较运算符来测试 null值,比如 =,< 或 <>.
我们必须使用 is null和 is not null操作符.
-
查询皮肤拥有者(skin_owner)不为空的英雄信息
select * from hero where skin_owner is not null;
查询结果为:
-
查询皮肤拥有者(skin_owner)为空的英雄信息
select * from hero where skin_owner is null;
查询结果为:
and和 or运算符用于基于一个以上的条件对记录进行过滤.
如果第一个条件和第二个条件都成立,则 and运算符显示一条记录.
如果第一个条件和第二个条件中只要有一个成立,则 or运算符显示一条记录.
格式:select 字段列表 from 表名 where 条件1 and/or 条件2;
-
查询工作(job)是坦克并且价格(price)是6300的英雄信息
select * from hero where job = '坦克' and price = 6300;
查询结果为:
-
查询价格等于500或者工作是法师的英雄信息
select * from hero where price = 500 or job = '法师';
查询结果为:
常用的比较运算符有 >(大于) ,<(小于), >=(大于等于),<=(小于等于),=(等于),!=(不等于),<>(不等于),其中 != 和 <> 两者意义相同,但<>可移植性优于!=.
比较运算符常常与 where在一起使用,where用于逻辑判断,where后面写判断的条件,满足条件的语句会被筛选出来.
-
查询价格小于等于3150的英雄信息
select * from hero where price <= 3150;
查询结果为:
-
查询价格不等于6300的英雄信息
select * from hero where price <> 6300;
查询结果为:
between … and … 操作符用于选取介于两个值之间的数据范围内的值。
这些值可以是数值、文本或者日期。
格式:select 字段列表 from 表名 where 字段名 between 值1 and 值2;
举例:
查询价格在3150到6300之间的英雄信息
select * from hero where price between 3150 and 6300;
查询结果为:
in 操作符允许在where子句中规定多个值。
格式:select 字段列表 from 表名 where字段名 in (值1,值2,…);
举例:
查询工作是刺客和射手的英雄信息
select * from hero where job in ('刺客','射手')
查询结果为:
9. 排序 order byorder by 关键字用于对结果集按照一个列或者多个列进行排序。
order by 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 desc 关键字。
格式:select 字段列表 from 表名 order by 字段名 asc(升序,默认的)/desc(降序);
举例:
查询全部英雄信息按照价格降序排序
select * from hero order by price desc;
查询结果为:
limit子句用于限制查询结果返回的数量
格式:select 字段列表 from 表名 order by 字段名 limit x,y;
x:跳过的条数(x为0时,可以直接写为limit y)
y:请求的条数(每页的条数)
*x=(请求的页数-1)y
举例:
-
查询价格最低的英雄信息
select * from hero order by price limit 1;
查询结果为:
-
按照价格降序排序,查询第5页的2条数据
select * from hero order by price desc limit 8,2;
查询结果为:
格式1: select 字段名 as “需要设置的别名” from 表名;
格式2: select 字段名 “需要设置的别名” from 表名;
格式3: select 字段名 需要设置的别名 from 表名;
举例:
select name,skin_owner 皮肤拥有者 from hero;
查询结果为:
-
平均值
格式:avg(字段名)
举例:
查询工作是坦克的英雄的平均价格
select avg(price) from hero where job = '坦克';
查询结果为:
-
最大值
格式:max(字段名)
举例:
查询所有英雄的最高价格
select max(price) from hero;
查询结果为:
-
最小值
格式:min(字段名)
举例:
查询所有英雄的最低价格
select min(price) from hero;
查询结果为:
-
求和
格式:sum(字段名)
举例:
查询所有英雄的总价格
select sum(price) from hero;
查询结果为:
-
计数
格式:count(*)
举例:
查询价格为6300的英雄数量
select count(*) from hero where price = 6300;
查询结果为:
| 数值运算符 | |
|---|---|
| + | 加法运算 |
| - | 减法运算 |
| * | 乘法运算 |
| / | 除法运算 |
| % | 取余运算 |
举例:
-
查询工作是刺客的英雄价格打8折之后的价格
select name,job,price*0.8 折后价格 from hero where job = '刺客';
查询结果为:
-
给价格低于6300的英雄每人涨价500块
update hero set price = price + 500 where price < 6300;
修改之后查询结果为:
文章到这里就先结束了,后面还会更新SQL基础(二),希望能帮助到各位大佬。如果文章有需要改进的地方还请各位大佬斧正。



