数据库基本操作和常用命令
SQL语句分类
数据定义语言(DDL)
用来定数据库对象:数据库,表,列等。关键字create,alter,drop等
数据操作语言(DML)
用来对数据库中表的记录进行更新。关键字:insert,delete,update等
数据控制语言(DCL)
用来定义数据库的访问权限和安全级别,及创建用户。
数据查询语言(DQL)
用来查询数据库中表的记录。关键字:select,from,where等
SQL通用语法
SQL语句可以单行或多行书写,以分号结尾,可使用空格和缩进来增强语句的可读性
MySQL数据库的SQL语句不区分大小写
可以使用/**/的方式完成注释
数据表中的数据类型
MySQL中常使用的数据类型如下
整数类型
类型名称 | 说明 |
---|---|
tinyint | 很小的整数 |
smallint | 小的整数 |
mediumint | 中等大小的整数 |
int(integer) | 普通大小的整数 |
小数类型
类型名称 | 说明 |
---|---|
float | 单精度浮点数 |
double | 双精度浮点数 |
decimal(m,d) | 压缩严格的定点数 |
日期类型
类型名称 | 说明 |
---|---|
year | YYYY(1901~2155) |
time | HH:MM:SS(-838:59:59~838:59:59) |
date | YYYY-MM-DD(1000-01-01~9999-12-3) |
datetime | YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00~ 9999-12-31 23:59:59) |
timestamp | YYYY-MM-DD HH:MM:SS(19700101 00:00:01 UTC~2038-01-19 03:14:07UTC) |
文本、二进制类型
类型名称 | 说明 |
---|---|
CHAR(M) | M为0~255之间的整数 |
VARCHAR(M) | M为0~65535之间的整数 |
TINYBLOB | 允许长度0~255字节 |
BLOB | 允许长度0~65535字节 |
MEDIUMBLOB | 允许长度0~167772150字节 |
LONGBLOB | 允许长度0~4294967295字节 |
TINYTEXT | 允许长度0~255字节 |
TEXT | 允许长度0~65535字节 |
MEDIUMTEXT | 允许长度0~167772150字节 |
LONGTEXT | 允许长度0~4294967295字节 |
VARBINARY(M) | 允许长度0~M个字节的变长字节字符串 |
BINARY(M) | 允许长度0~M个字节的定长字节字符串 |
创建数据库操作
创建数据库
create database 数据库名 character set utf-8;
创建一个数据库名为“数据库名”的数据库并指定数据库中的数据编码为utf-8
查看数据库
show databases;/*查看数据库MySQL服务器中的所有数据库*/
show database 数据库名;/*查看某个数据库的定义信息*/
删除数据库
drop database 数据库名称;/*删除指定的数据库*/
其他的数据库操作命令
use 数据库名;/*切换其他数据库*/
查看正在使用的数据库
select database();
创建数据表格式
create table 表名(
字段名 类型(长度) 约束,
字段名 类型(长度) 约束
);
创建用户表
create table users(
uid INT,
uname varchar(20),
uaddress varchar(200)
)
约束
限制每一列能写什么数据,不能写什么数据
约束分为:主键约束,非空约束,唯一约束,外键约束。
主键约束
主键是用于标记当前记录的字段。他的特点是非空,唯一的。
在开发中一般情况下主键是不具备任何含义,只是用于标识当前记录。
格式:
1.在创建表时创建主键,在字段后面加上 primary key。
create table tablename(
id int primary key,
......
)
2.在创建表时创建主线,在表创建的最后来指定主键
create table tablename(
id int,
......
primary key (id)
)
3.删除主键:alter table 表名 drop primary key;
alter table sort drop primry key;
4.主键自动增长:一般主键是自增长的字段,不需要指定。
实现添加自增长语句,主键字段后加auto_increment(只适用MySQL)
常见表的操作
查看数据库中的所有的表
show tables;
查看表结构
desc table 表名;
删除表
drop table 表名;
修改表结构
修改表,添加列:
alter table 表名 add 列名 类型(长度)约束;
例如:为分类表添加一个新的字段为 分类描述 varchar(20)
alter table sort add sdesc varchar(20);
修改表,修改列的类型长度及约束:
alter table 表名 modify 列名 类型(长度) 约束;
例如:为分类表的分类名称字段进行修改,类型 varchar(50)添加约束 not null
alter table sort modify sname varchar(50) not null;
修改表,修改列名:
alter table 表名 change 就列名 新列名 类型(长度) 约束;
例如:为分类表的分类名称字段进行更换 更换为 snamesname varchar(30);
alter table sort change sname snamesname varchar(30);
修改表,删除列:
alter table 表名 drop 列名;
例如:删除分类表中snamesname这列
alter table sort drop snamesname;
修改表名
rename table 表名 drop 列名;
例如:为分类表sort改名成category
rename table sort to category;
修改表的字符集
salter table 表名 character set 字符集;
例如:为分类表category的编码表进行修改,修改成gbk
alter table category character set gbk;
数据表添加数据
基本语法:
insert into 表名 (列名1,列名2,列名3...) values (值1,值2,值3...);
例如:
insert into product (id,pname,price) values (1,'笔记本',5555.99);
insert into product (id,pname,price) values (2,'智能手机',99999);
添加数据格式,不考虑主键
insert into 表名(列名)values(值);
insert into product(pname,price) values('洗衣机',800);
添加数据格式,所有的值全给出
insert into 表名 values (值1,值2,值3···);-----向表中插入所有列
insert into product values (4,'微波炉',300.25)
添加数据格式,批量写入
insert into product(列名1,列名2,列名3) values (值1,值2,值3),(值1,值2,值3),(值1,值2,值3);
insert into product (pname,price) values ('智能机器人',25999.22),('彩色电视',1250.36),('沙发',58899.02);
更新数据
用来修改指定条件的数据,将满足条件的记录指定列修改为指定值
update 表名 set 字段名=值,字段名=值;
update 表名 set 字段名=值,字段名=值 where 条件;
注意:
列名的类型与修改的值要一致。
修改值的时候不能超过最大长度。
值如果是字符串或者日期需要加 ’ '。
例如:
将指定的sname字段中的值 修改成 日用品
update sort set sname = '日用品';
将sid为s002的记录中的 sname 改成 日用品
update sort set sname='日用品' where sid = 's002';
删除数据
语法:
-
delete from 表名 [where 条件];
或者
-
delete from 表名;
面试题:
删除表中多有记录是使用delete from 表名;还是用truncate table 表名;
删除方式:delete 一条一条删除,不清空auto_increment记录数。
truncate 直接将表删除,重新建表,auto_increment将置为零,重新开始。
例如:
delete from sort where sname = '日用品';
/*表数据清空*/
delete from sort;
数据表和测试数据准备
创建账务表
create table zhangwu(
id int primary key auto_increment, /*账务id*/
name varchar(200),/*账务名称*/
money double,
);
插入表记录
insert into zhangwu(id,name,money) values (1,'吃饭支出',247);
insert into zhangwu(id,name,money) values (2,'工资支出',12345);
insert into zhangwu(id,name,money) values (3,'服装支出',1000);
insert into zhangwu(id,name,money) values (4,'吃饭支出',325);
insert into zhangwu(id,name,money) values (5,'股票收入',8000);
insert into zhangwu(id,name,money) values (6,'打麻将支出',8000);
insert into zhangwu(id,name,money) values (7,null,5000);
数据的基本查询
查询指定字段信息
select 字段1,字段2,… from 表名;
select id,name from zhangwu;
查询表中所有字段
select * from 表名;
select * from zhangwu;
在实际的开发中,不推荐使用
原因:要查询的字段信息不明确,若字段数量较多,会导致查询速度很慢。
distinct用于去除重复记录
select distinct 字段 from 表名;
select distinct money from zhangwu;
别名查询,使用as关键字,as可以省略
别名可以给表中的字段,设置别名。当查询语句复杂时,使用别名可以极大的简便操作。
表别名格式:select * from 表名 as 别名; 或 select * from表名 别名;
列别名格式:select 字段名 as 别名 from 表名;或 select 字段名 别名 from 表名;
例如:
/*表别名:*/
select * from zhangwu zw;
select * from zhangwu as zw;
/*列别名*/
select money as m from zhangwu;
select money m from zhangwu;
在sql语句的操作中,可以直接对列进行运算
例如:将所有账务的金额+10000元显示
select pname,price+10000 from product;
数据的条件查询
条件查询
where语句表条件过滤。满足条件操作,不满足不操作,多用于数据的查询与修改。
格式
select 字段 from 表名 where 条件;
where条件的种类如下
比较运算符
> < <= >= = <> /*大于、小于、大于(小于)等于、不等于*/
between ... and ... /*显示在某一区间的值(含头含尾)*/
in(set) /*显示在in列表中的值,例如:in(100,200)*/
like 通配符 /*模糊查询,Like语句中有两个通配符:
% 用来匹配多个字符;例first_name like ‘a%’;
_ 用来匹配一个字符。例first_name like ‘a_’;*/
is null /*判断是否为空
is not null; 判断不为空*/
逻辑运算符
and /*多个条件同时成立*/
or /*多个条件任一成立*/
not /*不成立,例:where not(salary>100);*/
应用
查询所有吃饭支出记录
select * from zhangwu where name = '吃饭支出';
查询出金额大于10000的信息
select * from zhangwu where money > 10000;
查询出金额在2000-5000之间的账务信息
select * from zhangwu where money >= 2000 and money <= 5000;
select * from zhangwu where money between 2000 and 5000;
查询出金额是1000或5000或3000的商品信息
select * from zhangwu where money = 1000 or money = 5000 or money = 3500;
select * from zhangwu where money in (1000,5000,3500);
模糊查询
查询出账务名称包含“支出”的账务信息
select * from zhangwu where name like "%支出%";
查询出账务名称中是五个字的账务信息
select * from zhangwu where name like "_____";
查询账务名称不为null账务信息
select * from zhangwu where name is not null;
select * from zhangwu where not (name is null);
排序查询
通过order by 语句,可以将查询出的结果进行排序。放置在select语句的最后。
select * from 表名 order by 字段 asc; /*asc升序(默认),desc(降序)*/
查询账务表,价格进行升序(降序)
select * from zhangwu order by zmoney asc;
select * from zhangwu order by zmoney desc;
查询账务表,查询所有支出,对金额降序排列
/*先过滤条件where查询结果再排序*/
select * from zhangwu where zname like "%支出%" order by zmoney desc;
聚合函数
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
count:统计指定列不为null的记录行数;
sum:计算指定列的数值和;
max:计算指定列的最大值;
min:计算指定列的最小值;
avg:计算指定列的平均值;
查询统计账务表中,一共有多少条数据
select count (*) as 'count' from zhangwu;
对账务表查询,对所有金额求和计算
select sum (zmoney) from zhangwu;
求和,统计所有支出的总金额
select sun (zname) from zhangwu where zname like "%收入%";
max函数,对某列数据,获取最大值
select max (zmoney) from zhangwu;
avg函数,计算一个列所有数据的平均数
select avg (zmoney) from zhangwu;
分组查询
分组查询是指使用group by字句对查询信息进行分组
例如:
我们要统计出zhanguw表中所有分类账务的总数量,这时就需要使用group by 来对zhangwu表中的账务信息根据parent进行分组操作。
select 字段1,字段2,字段3... from 表名 group by 字段 having 条件;
分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。
having和where的区别
having是在分组后对数据进行过滤
where是在分组前对数据进行过滤
having后面可以使用分组函数(统计函数)
where后面不可以使用分组函数。
对zname内容进行分组查询求和,但是只要支出
select sum (zmoney) as 'getsum',zname from zhangwu where zname like "%支出%" group by zname order by getsum desc;
对zname内容进行分组查询求和,但是只要支出, 显示金额大于5000
select sum (zmoney) as 'getsum',zname from zhangwu where zname like "%支出%" group by zname having getsum > 5000;