Mysql-数据库基本概、SQL语句、面试题

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                

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值