文章目录
SQL分类
Sql语句分类:
数据定义语言(DDL):负责创建、修改、删除表、索引、视图、函数、存储过程和触发器等对象;
数据查询语言(DQL):负责数据表记录的查询;
数据操纵语言(DML):负责数据库中数据的插入、修改、删除等操作;
事务控制语言(TCL):事务提交,事务回滚;
数据控制语言(DCL):用来授予和撤销用户权限。
DDL(Data Definition Language)
DDL是SQL中负责数据结构定义与数据库对象定义的语言,是SQL 指令中的一个子集。
DDL常用关键字:create、alter、drop
# 向表中添加字段列
ALTER TABLE 表名 ADD COLUMN 列名 数据类型;
alter table web_zcgl_article add column `cos_url` varchar(1024) DEFAULT NULL COMMENT '腾讯云cos存储路径';
DQL(Data Query Language)
数据查询语言,常用关键字select等
DML(Data Manipulation Language)
数据操纵语句,用于新增、删除、更新和查询数据库记录,对数据库中数据表的记录做操作。
DML常用关键字:insert、delete、udpate、也包括select 等。
TCL(Transactional Control Language)
事务控制语言
关键字:commit ,rollback;
DCL(Data Control Language)
数据控制语句,用于控制数据库的许可和访问级别的语句。
这些语句定义了数据库、表、字段、用户的访问权限和安全级别,
语句关键字包括 grant、revoke 等。
主要是DBA用来管理系统中的对象权限时所使用,一般开发人员很少使用。
常用命令
show命令
show database
查看系统中有哪些数据库,sql语句以 “;”结束才会被执行,show tables;查看数据库下有哪些数据表;
show tables from database;
查看数据库下有哪些表
show create table 表名
查看表的创建语句
source命令
source命令用于导入sql脚本,linux和windows都是通用的
source sql脚本路径
windows的dos窗口执行source命令,有的可视化工具虽然也有一键导入sql脚本的功能,但是它们有文件大小的限制,使用dos命令则没有大小限制,几个G的sql脚本都能导入。
linux下执行命令
数据类型
varchar和char
varchar(最长255)
1.可变长度字符串;
2.比较智能,节省空间;
3.根据实际存储数据,动态分配存储空间;
比如varchar(10),最大长度是10个空间,当你存储“lei”这个数据时,就只动态得分配3个长度的空间
优点:节省空间
缺点:需要动态分配空间,速度慢
char(最长255)
1.固定长度的字符串;
2.不管实际存储的数据的长度是多少,都统一分配定义好的长度,
比如char(10),你存储一个字母a也是分配10个长度的存储空间
缺点:使用不恰当的时候,可能会导致空间的浪费
优点:不需要动态分配空间,速度快
varchar和char怎么选
varchar和char我们应该怎么选?
性别字段因为只有男女两种类型,且都是固定长度的字符串,所以选char
姓名字段因为每个人的名字长度不一样,所以选择varchar
int和bigint
int(最长11)
int 数字中的整数型,等同于java的int
bigint 数字中的长整型,等同于java中的long
float和double
float 单精度浮点型数据
double 双精度浮点数据
date和datetime
date:短日期类型(年月日)
datetime:长日期类型(年月日时分秒)
clob
Clob(Character Large Object)
字符大对象
最多可以存储4G的字符串,比如:一篇文章,一个摘要,一个说明等
超过255个字符的都要采用clob字符大对象来存储
blob
Blob(Binary Large OBject)
二进制大对象,
专门用来存储图片、声音、视频等流媒体数据
往BLOB类型的字段上插入数据的时候,例如插入图片、视频等时,需要使用IO流才行
分组函数
count():计数
count(*)和count(1)的效果是一样的,统计数据表的总记录行数。
count(某个字段)统计的是这个字段中不为null个数总和。
例如:select count(comm) from emp结果是4,而count(*)是14
mysql> select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)
mysql> select count(COMM) from emp;
+-------------+
| count(COMM) |
+-------------+
| 4 |
+-------------+
1 row in set (0.00 sec)
mysql> select count(*) from emp;
+----------+
| count(*) |
+----------+
| 14 |
+----------+
1 row in set (0.00 sec)
连接查询
连接查询的语法分类:
SQL92:(1992年发布的标准,老语法,有的老DBA还在使用)
SQL99:(1999年的语法了),后面还有新版本发布,SQL2003、SQL2006、SQL2008等
内连接
内连接取的是两张表的交集
内连接:
1.等值连接
2.非等值连接
3.自连接
等值连接
等值连接:最大的特点是:条件是等量关系
案例:查询每个员工的部门名称,要求显示员工名和部门名
SQL92:
select e.ENAME, d.DNAME
from emp e, dept d
where e.deptno = d.deptno;
SQL99:
select e.ENAME, d.DNAME
from emp e
join dept d
on e.deptno = d.deptno;
结论:
SQL99语法优于SQL92
1.SQL92将多表的连接条件和where杂糅在一起,如果后期再有过滤条件只能在where后拼接and
2.SQL99多表使用on关键字做连接条件,后期如有其他的过滤条件,可以直接使用where,
3.SQL99的语法结构更清晰,表的连接条件和后来的where过滤条件分离了
非等值连接
非等值连接:最大的特点是:连接条件中的关系是非等量关系
案例:找出每个员工姓名,工资,工资等级
select e.ENAME, e.SAL, s.GRADE
from emp e
join salgrade s
on e.SAL between s.LOSAL and s.HISAL
自连接
自连接:最大的特点是:一张表看做两张表,自己连接自己。
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。
select e1.EMPNO,e1.ENAME,e1.MGR,e2.ENAME as '领导'
from emp e1
join emp e2
on e1.MGR = e2.EMPNO
外连接
外连接:
外连接是除了满足条件的记录查询出来,再将其中一张表的记录全部查询出来,
另一张表如果没有与之匹配的记录,自动模拟出null与其匹配。
表的别名
表的别名有什么好处?
第一:执行效率高
第二:可读性好
多表查询
案例1:找出每个员工的部门名称以及工资等级
select e.ENAME, d.DNAME, s.GRADE
from emp e
join dept d on e.DEPTNO = d.DEPTNO
join salgrade s on e.SAL between s.LOSAL and s.HISAL
案例2:查出每个员工的部门名称、工资等级、以及上级领导
select e.ENAME, d.DNAME, s.GRADE, e2.EMPNO, e2.ENAME
from emp e
join dept d on e.DEPTNO = d.DEPTNO
join salgrade s on e.SAL between s.LOSAL and s.HISAL
left join emp e2 on e.MGR = e2.EMPNO