在平时开发中主要使用DQL(数据查询语句),但在使用DQL之前,一般的操作:
登录数据库 --> 创建数据库 --> 选择数据库 --> 插入(导入)数据 --> 删库跑路(哈哈)
mysql -uroot -pxxxxx; --> create database sail; --> use sail; --> source D:\sail.sql --> drop databse sail;
还有一些常用操作,如下所示:
查看所有数据库: show databases;
查看对应数据库下所有的表:show tablse;
查看表结构:desc tableName;
SQL分类:
简称 | 代表关键字 |
---|---|
DQL Data Query Language |
select |
DML Data Manipulation Language |
insert、 delete 、 update |
DDL Data Denifition Language |
create、 drop、 alter |
TCL Trasactional Control Language |
commit、 rollback |
DCL Data Control Language |
grant、 revoke |
毋庸置疑DQL是最重要的一部分,而这里有很多常用过滤语句,一个select语句的执行过程如下所示:
select
*
from
xxxx
where
xxxx
group by
xxxx
having
xxxx
order by
xxxx
MySQL中的DQL
每个DQL的执行顺序不可改变,严格遵守以上询句的执行顺序:
1) from:将硬盘上的表文件加载到内存
2) where:将符合条件的数据行摘取出来,生成一张新的临时表
3) group by:根据列中的数据种类,将当前临时表划分成若干个新的临时表
4) having:可以过滤掉group by生成的符合条件的临时表
5) select:对当前临时表进行整列读取
6) order by: 对select生成的临时表,重新排序,生成临时表
7) limit:对最终生成的临时表的数据行,进行分页。
其中使用到的关键字有:where(条件查询)、having(筛选)、group by(分组)、order by(排序)、limit(限制结果数)其中数条件查询使用的最多,其支持的运算符有:
运算符 | 说明 |
---|---|
= | 等于 select empno,ename,sal from emp where sal = 5000; 为字符串时使用''或“” |
<>或!= | 不等于 select empno,ename,sal from emp where sal <> 5000; |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
between … and …. | 两个值之间,等同 >= and <= select ename from emp where ename between “A” and "F"; select empno,ename,sal from emp where sal >= 1600 and sal <= 3000; |
is null | 为null(is not null 不为空) select empno,ename,comm from emp where comm = null; () select empno,ename,comm from emp where comm is null; () |
and | 并且 |
or | 或者 select * from emp where sal>1800 and (deptno=20 or deptno=30); |
in | 包含,相当于多个or(not in不在这个范围中) |
not | not可以取非,主要用在is 或in中 select ename,job from emp where job in ('SALESMAN','MANAGER'); |
like | like称为模糊查诟,支持%或_,%匹配任意个字符,_匹配一个字符 select ename from emp where ename like'M%'; |
order by 排序 (order by asc/order by desc)
系统默认升序 oder by asc
如果存在 where 子句,那么 order by 必须放到where之后。
group by 分组查询
group by 的DQL询句中,select 询句后面只能能跟分组函数+参与分组的字段;
如果使用了 order by ,order by 必须放到 group by后面;
提到了group by,则需要提提他的号搭档having,having对分组的数据再迚行过滤;
下面看下having和where的关系
1) where 和 having 都是为了完成数据的过滤,它们后面都是添加条件;
2) where 是在 group by之前前完成过滤;
3) having 是在 group by 之后完成过滤;
为了使用方便,MySQL为我们提供了一些常用函数,如下表所示:
函数 | 含义 |
---|---|
Lower | 转为小写 select lower(ename) as ename from emp; |
upper | 转为大写 select upper(ename) as ename from emp; |
substr | 取子串(substr(被截取的字符串,起始下标,截取的长度)) select substr(ename,2,1) from emp; |
length | 取长度 select ename,length(ename) as nameLength from emp; |
trim | 去空格 select * from emp where job = trim(' manager '); |
str_to_date | 将字符串转换成日期 select ename,hiredate from emp where hiredate = str_to_date(‟02-20-1981‟,‘%m-%d-%Y’ ); |
date_format | 格式化日期 |
format | 设置千分位 |
round | 四舍五入 |
rand() | 生成随机数 |
Ifnull | 可以将null转换成一个具体值 select ename,ifnull(comm,0) from emp; |
case…when…then…else…end | case job when ‘MANAGER’ then sal * 1.1 when ‘SALESMAN’ then sal * 1.5 else sal end case使用 |
注:count()与count(filed的区别*
1、 count(*)表示叏得当前查诟表所有记录
2、 count(字段名称),丌会统计为 null 的记录
多表的查询
公司中表的结构一般满足三级范式,这也导致数据不是存储在一张表中,而是在多张表中,所以会出现连接查询,也称为跨表查询。提到连接查询就不得不提到笛卡尔积。主要有:
内连接,关键字为inner(可忽略)
外连接
左连接,关键字 left join
右连接,关键字 right join
注:连接过程中不推荐使用where
select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;()
多张表的查询语法:
select
xxxx
from
A表
join
B表
on
连接条件1
join
C表
on
连接条件2;
子查询
还有一种经常使用的查询,称为子查询,常用结构如下:
from …(select)…
where …(select)…
示例:
select ename,sal from emp where sal > avg(sal); ()
select ename,sal from emp where sal > (select avg(sal) from emp);()
联合查询,关键字为union
分页查询,关键字limit,如查询i页时,使用如下:
limit (i-1)*pageSize, pageSize
MySQL中的DML
DML在平时也会使用到,但要求不高。
首先,建表,在建表前先连接下字段类型
数据类型 | 占用字节数 | 描述 |
---|---|---|
char | char(n) | 定长字符串,存储空间大小固定 使用 char(2)来表示类型 VARCH AR(3)表示存储的数据长度不能超过3个字符长度 |
varchar | varchar(n) | 变长字符串,存储空间等 数据空间 叧包含英文字符的字符串 CHAR(3) 表示存储的数据长度丌能超过3个字符长度 |
int | 4 个字节 | 表示整型, 比如自增 ID 和表示數量 INT(3)表示最大可以存储999 |
bigint | 8 个字节 | 表示长整型,比如自增(数量比较大的情况下) |
float(有效数字位数,小数位) | float(有效数字位数,小数位) | 数值型 FLOAT(7,2)表示7个有效数字,2个有效小数位 |
double(有效数字位数,小数位) | double(有效数字位数,小数位) | 数值型 DOUBLE(7,2)表示7个有效数字,2个有效小数位 |
date | 8 字节 | 表示日期和时间 实际开发中,常用字符串代替日期类型 |
BLOB | Binary Large Object | (二进制大对象)专门存储图片、视频、声音等数据 |
CLOB | Character Large Object | (字符大对象)可存储超大文本,可存储4G+字符串 |
其它….. | 其它….. | 其它….. |
语句 | 注意点 |
---|---|
create table t_dg_student ( id INT(10) not null, name varchar(256), sex(1), birth DATE, email VARCHAR(128) unique(name, email), constraint t_user_pk primary key(id) ); |
1) 表格名称最好以 t_ 戒 tbl_ 开始,增强可读性 2) VARCHAR长度最好是2的倍数,方便存储中文 3)约束 not null, 4)unique(name, email),也可以写到字段后 5)约束名称可以不写constraint t_user_pk |
drop table t_fck; | 库中不存在, 则会报错 drop table if exists t_fck; |
insert into t_student(name,email) values('yangwei','ywdreamgo@163.com'); insert into t_student(no,name,birth) values(1,'Jack',str_to_date('1980-10-19','%Y-%m-%d')); |
插入 |
show create table t_student; | 查看建表语句 |
create table emp1 as select * from emp; | 复制表 |
alter table t_student add tel varchar(10); | 新增字段 |
alter table t_student modify tel varchar(20); | 修改字段类型 |
alter table t_student drop tel; | 删除字段 |
INSERT INTO tableName1 SELECT columnName1,columnName2,… FROM tableName2; | 将查询结果查到表中 |
update t_student set name = 'zhangsan',email = 'zhangsan@126.com' where no = 3; | 修改数据 |
delete from t_student where no = 3; | 删除数据 |
CREATE USER username IDENTIFIED BY 'password'; | 创建用户 |
grant all privileges on dbname.tbname to 'username'@'login ip' identified by 'password' with grant option; | 1) dbname=表示所有数据库 2) tbname=表示所有表 3) login ip=%表示任何ip 4) password为空,表示不需要密码即可登录 5) with grant option; 表示该用户还可以授权给其他用户 |
还有外键的概念,现在使用的不多
注:常用系统表在information_schema中
主键会自动添加索引
网友评论