SQL知识点
数据库和表的概念
数据库的概念
数据库的概念是存储数据的容器(可对比仓库来理解)
表的概念
表的概念是真正的存储单元
数据库与表的关系
数据库与表是一对多的关系,一个库里通常维护了多个表(好比如一个仓库有多个货架)
SQL
概念:
- SQL是结构化语言
- SQL是用于访问和处理数据库的标准计算机语言
作用:
3. 创建数据库、表等数据库对象
4. 数据库记录的增、删、改、查
创建数据库
语法:
create database 数据库名称; (注意末尾需要加英文下的分号)
# 例如创建一个名为text数据库
create database text;
创建表
语法:
create table <表名>(<字段名1> <类型1>,<字段名2> <类型2>,…<字段名n> <类型n>) DEFAULT CHARSET=utf8;
# 例如创建一个名为student的表
create table student(
id int not null PEIMARY key auto_increment,
name varchar(100),
sex varchar(12),
class_id int(11),
create_date datetime,
update_date datetime
)DEFAULT CHARSET=utf8;
常见字段类型
每种字段都有自己的类型,例如整型、浮点型、字符型、时间类型、日期类型等。
- 整型
tinyint:占1个字节,取值范围为-128~127
int:占4个字节,取值范围为-2147483648~2147473647 - 浮点型
float(m,d):单精度浮点型,32bit,m代表总位数,d代表小数位,例如99.99声明类型为float(4,2)
double(d,m):双精度浮点型,64bit,m代表总位数,d代表小数位
decimal(m,d):m代表总位数,d代表小数位,用于精度要求非常高的计算中且存储值不会超过m,小数点后不超过d位
区别:双精度类型能表示的小数的精确值更高 - 字符串型
char(n):n个字符,最多225个字符,固定长度
varchar(n):n个字符,最多65535个字符,可变长度 - 时间和日期类型
date:日期,格式(yyyy-mm-dd,如2020-04-01)
time:时间,格式(hh:mm:ss,例如16:15:28)
datetime:日期时间,格式(yyyy-mm-dd hh:mm:ss,例如2020-04-01 16:17:23)
主键
概念:
- 主键字段存储的值不能重复,因此主键可以唯一标识一行数据
- 一个表只能有一个主键
- 主键是非必须的,也就是说一个表可以不声明主键字段
语法:
<字段名> <类型> primary key;
# 例如创建一个学生表,id不能为空且为自动递增并设置为主键
# 自动递增为auto_increment
create table student(id int not null PEIMARY key auto_increment);
插入数据
- 插入一条数据,对所有字段都赋值
语法:
insert into <表名> values (值A,值B,…值n);
# 例如对member表插入数据
insert into member values(1,'text1','123456');
- 插入一条数据,只对一部分字段赋值
语法:
insert into <表名> (字段A,字段B,…字段n) values (值A,值B,…值n);
# 例如对member表插入数据
insert into member(name,pwd) values('text1','123456');
- 批量插入,一次插入多条数据
语法:
insert into <表名> (字段A,字段B,…字段n) values (值A,值B,…值n),(值A,值B,…值n),(值A,值B,…值n)…;
# 例如对member表插入数据
insert into member(id,name,pwd) values(1,'text1','123456'),
(2,'text2','123321'),
(3,'text3','123456');
修改表数据
- 修改一个表里的所以数据
语法:
update 表名 set 字段名1=新值1,字段名2=新值2…;
# 例如更新member表的所有paw为123456
update member set paw='123456'
- 修改一个表里满足某些条件的那一部分数据
语法:
update 表名 set 字段名1=新值1,字段名2=新值2… where 条件表达式1 and(or) 条件表达式2…;(一般or用的比较多)
# 例如更新member表名字为text2和test3的paw为123456
update member set paw='123456' where name = 'text2' or name = 'test3'
# 例如更新member表paw为123456且姓名为text1的手机号码为13512345678
update member set mobilephone='13512345678' where name = 'text1' and paw = '123456';
删除数据库或表
- 删除数据库,并将数据库内的所有表和数据一并删除
语法:
drop database 数据库名称;
# 例如删除testdb的数据库
drop database testdb;
- 删除数据表,并将表内的所有数据和结构一并删除
语法:
drop table 表名;
# 例如删除testtable的数据表
drop table testtable;
drop删除结构且删除数据,需慎用
- 删除表内的所有数据,但不删除表的结构
语法:
delete from 表名;
# 例如清空testtable表
delete from testteble;
- 删除一个表内满足某些条件的数据
语法:
delete from 表名 where 条件1 and(or) 条件2…;(一般用or比较多)
# 例如删除testtable表里名为text2的数据
delete from testteble where name = 'text2';
delete只会删除表内的数据,不会删除表和库即不会删除结构
查询表数据
单表查询
- 不加条件进行查询
语法:
select <字段1,字段2…字段n> from <表名>; - 查询所有字段
语法:
select * from <表名>; - 按条件进行查询
select <字段1,字段2…字段n> from <表名> where 表达式A and(or) 表达式B and(or) 表达式N;
多表查询
语法:
select <表名1.字段1,表名2.字段2…> from <表名1>,<表名2> where <表名1.id=表名2.id>;
# 例如有text1和text2两张表
select * from text1,text2 where text1.id = text2.id;
连接查询
- 内连接(inner join)
# 例如有A、B两张表
select A.name,B.name from A inner join B on A.id = B.u_id;
- 左连接(left join)
# 例如有A、B两张表
select A.name,B.name from A left join B on A.id = B.u_id;
## 例如有A、B、C三张表
select * from A LEFT JOIN B on A.id = B.u_id LEFT JOIN C on B.class = C.class;
- 右连接(right join)
# 例如有A、B两张表
select A.name,B.name from A right join B on A.id = B.u_id;
对查询结果进行排序
语法:
select … from … order by 需要排序的字段A asc(desc),字段B asc(desc)…;
asc为升序
desc为降序
select * from A where class = '初三一班' order by code; # 默认为升序
select * from A where class = '初三一班' order by code desc; # 降序
查询的多种用法
in和not in
语法:
select … from 表名 where 条件 in(not in) 数据集;
# 例如查询id为1000,2000,3000的用户信息
select * from A where id in(1000,2000,3000);
# 例如查询id不为1000,2000,3000的用户信息
select * from A where id not in(1000,2000,3000);
模糊查询like
- 条件字段的值以任意字符串开头,以XX结尾的值
select <字段1,字段2…字段n> from <表名> where <条件字段> like ‘%XX’; - 条件字段的值以XX开头,以任意字符串结尾
select <字段1,字段2…字段n> from <表名> where <条件字段> like ‘XX%’; - 条件字段的值包含了XX
select <字段1,字段2…字段n> from <表名> where <条件字段> like ‘%XX%’;
select * from A where name like '%小%'; # 不论是在左中右都会查询出来
统计count()
语法:
select <字段1,count(字段2),…字段n> from <表名>;
select id,name,count(code),class from A;
分组group by
语法:
select 查询字段 from 表名 group by 分组字段 having 过滤条件;
# 将class_num进行分组的条件下再将小于十的过滤出来
select name,count(code) from A group by class_num having class_num <10;
去重distinct
语法:
select distinct 字段名 from 表名;
# 对相同的编号num进行去重
select distinct num from A;
两者之间between
语法:
select … from 表名 where 条件字段 between 数值A and 数值B;
# 查询用户编号为10到20的用户信息
select * from A where id >= 10 and id <= 20;
select * from A where id between 10 and 20;
分页limit
语法:
select … from 表名 limit m,n;
# 取索引从10开始取5条记录
select * from A limit 10,5; # 从10开始11~15
常用数值相关函数
最大值max:select max(amount) from text;
最小值min:select min(amount) from text;
平均值avg:select avg(amount) from text;
求和sum:select sum(amount) from text;
select语句查询结构
select…from…where…group by…having…order by…limit…
子查询
概念:可以把一条sql语句的执行结果作为一个新的数据
select * from A where id in (select id from B where id < 5);