Day1 数据库基础

关系性数据库

关系型数据库管理系统(RDBMS)是应用最广泛的一种数据库管理系统,关系型数据库管理系统以表、字段和记录等结构来组织数据。表用来保存数据,每个表由一组字段来定义其结构,记录则是表中的一条数据。

结构化查询语言(SQL)

对数据库操作的普通话

结构化查询语言分类

  • 数据查询语言(DQL:Data Query Language):语句主要包括SELECT,用于从表中检索数据。
  • 数据操作语言(DML:Data Manipulation Language):语句主要包括INSERT,UPDATE和DELETE,用于添加,修改和删除表中的行数据。
  • 事务处理语言(TPL:Transaction Process Language): 语句主要包括COMMIT和ROLLBACK,用于提交和回滚。
  • 数据控制语言(DCL:Data Control Language):语句主要包括GRANT和REVOKE,用于进行授权和收回权限。
  • 数据定义语言(DDL:Data Definition Language):语句主要包括CREATE、DROP、ALTER,用于定义、销毁、修改数据库对象

Dos命令

dir列出所有文件
cls清屏
cd path路径

cd E:\PHP\phpstudy_pro\Extensions\MySQL5.7.26\bin
  • 链接数据库库命令
    mysql -hlocalhost -uroot - p

mysql 常用命令

  • show databases 显示所有数据库
  • use 数据库名 使用该数据库 use door
  • quit 退出数据库

基本查询语句

官方格式

SELECT [] 
select 列名 from 表名;
select deptno, dname, loc from dept;
  • 算术运算符
    让emp表中所有员工的工资 + 200,同时显示之前的工资和加薪之后的工资

  • select sal + 200 from emp;

  • select sal * 1.2 from emp;


    image.png
  • 员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的年薪所得(不考虑奖金部分,年薪的试用期6个月的月薪+转正后6个月的月薪)

select ename, (sal*6+sal*1.2*6
) from emp;
  • 空值NULL
    任何运算符和NULL运算都是空值
select ename, sal*12+comm from emp;
image.png

列别名

使用列别名的方法

  • 方式1: 列名 列别名(空格)
  • 方式2: 列名 AS 列别名 (AS)
    以下三种情况列别名两侧需要添加双引号
  • 有空格的时候
  • 有特殊字符的时候
select ename 员工, sal 工资, comm 奖金 from emp;
image.png
select ename "员工 工人",sal 工资 from emp;
image.png
select ename 员工姓名, sal 工资收入, ifnull(comm) 奖金, sal*6+sal*1.2*6+ifnull(comm,0) 总收入 from emp;
image.png

知识点

  • nvl(列,值)如果列为空 ,那么给予相对于的值(oracle)特有

  • ifnull(列,值 ) 如果列为空 ,那么给予相对于的值(mysql)

  • select distinct deptno from emp; 清除重复行

    image.png

显示表结构

  • desc emp;


    image.png

where 语句

where 语句 可以作为查询的限定条件
格式: 在from之后

  • select ename , hiredate,deptno from emp where deptno = 30 ;
    image.png
  • varchar
    select ename, sal, hiredate, job from emp where job = 'manager';
    select ename, sal, hiredate, job from emp where job = "manager";
    image.png

在sql中字符串一般用单引号,双引号值用来放在单引号中

  • date类型

select * from emp where hiredate > '1982-01-01';

image.png

<> !=都为不等于

  • 查询职位为SALESMAN的员工编号、职位、入职日期。
    查询1985年12月31日之前入职的员工姓名及入职日期。
    查询部门编号不在10部门的员工姓名、部门编号

select empno , job, hiredate from emp where job = 'salesman';

image.png

select ename 员工姓名, hiredate 入职日期 from emp where hiredate >'1985-12-31 ';

image.png

select ename 员工姓名 , deptno 部门编号 from emp where deptno != 10;

image.png

执行顺序 先走from 然后筛选where 最后select

  • 特殊比较符


    image.png
  • select ename 入职日期, hiredate 入职日期 from emp where hiredate between '1982-01-23' and '1987-05-23
    image.png
  • select ename 员工姓名, deptno 部门编号 from emp where sal between 3000 and 5000;
    image.png
  • select ename 员工姓名, deptno 部门编号 from emp where deptno between 10 and 20;
    image.png
  • select ename 员工姓名 , empno 员工编号 from emp where mgr in (7902,7566,7788);
    image.png

模糊查询LIKE :

  • select * from emp where ename like 'M%';
  • select * from emp where ename like '_M%';
  • select * from emp where ename like '%M%';

%是匹配前后所有有M的 _ 只是一个占位符_M表示第二位是M的

  • select * from emp where job like 'MAN@_%'escape'@';

escape '...' 把什么字符设置为转义符号。

IS NULL 运算符

判断比较的值是否为null

查询名字以w开头。
select ename 员工姓名 from emp where ename like 'W%';
名字底数第二个字母为T的人
select ename 员工姓名 from emp where ename like '%T_ ';
查询奖金为NULL的人
select ename 员工姓名, IFNULL(COMM,0) 奖金 from emp where comm IS NULL;``

逻辑运算符

AND OR NOT
可以和 between and , like , in , is null一起使用

运算符的优先级

image.png
  • 排序

order by 语句

select  Distinct ename from where ... order by
select * fro
m emp order by ename;

排序规则 数字升序 由小到大 desc 逆序 放在最后
字母 A - Z

日期 小到大


执行顺序
先 from 后 where 在 select 最后order by

LIMIT语句

select 数据 FROM 数据源
LIMIT [start,]length;

说明: 接受一个或两个参数 一个参数从0返回n行 ,两个参数从开始返回length个

select * from emp limit 5,2;

LIMIT 在 order by 后面

多表链接

语法:

SELECT    table1.column, table2.column
FROM    table1, table2
WHERE    table1.column1 = table2.column2;

select * from emp, dept;

笛卡尔积:第一个表的所有行和第二个表的所有行都产生连接。
行数相乘,把所有情况列举出来
为了避免笛卡尔积的产生 , 我们在WHERE中列举条件

等值连接

select * from emp, dept where emp.deptno = dept.deptno;
image.png
  • select empno , ename, emp.deptno, loc from emp,dept where dept .deptno = emp.deptno and loc like 'new%';
    在前面打上表名能提高性能

限制歧义列名

  • 在用到多个表时可以使用表名作前缀来限定列;
  • 通过使用表前缀可以提高性能;
  • 通过使用列的别名可以区分来自不同表但是名字相同的列;

使用别名

表起完别名后,只能用别名

  • select e.ename 员工列表, e.job 工作, d.dname what from emp e, dept d where e.deptno = d.deptno;
  • 写一个查询,显示所有员工姓名,部门编号,部门名称。
    select e.ename 员工姓名, e.deptno 部门编号, d.dname 部门名称 from emp e, dept d where e.deptno = d.deptno;
  • 写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金
    select e.ename 员工姓名, ifnull(e.comm,0) 奖金, d.loc 工作地点 from emp e, dept d where e.deptno = d.deptno and d.loc = 'chicago ';
  • 写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
    select e.ename 员工姓名, d.loc 工作地点 from emp e, dept d where e.deptno = d.deptno and e.ename like '%a% ';

非等值连接

select * from emp e, salgrade s where e.sal between s.losal and s.hisal;

多表连接写法分析

  • 查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序。
    select e.empno 员工编号, ename 员工姓名,e.sal 工资,s.grade 工资等级,d.loc 所在工作城市 from emp e, dept d, salgrade s where (e.deptno = d.deptno) and (e.sal between s.losal and s.hisal) order by s.grade
    image.png

自连接

自己和自己连接

  • 查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号。
    

select w.ename 员工列表,w.empno 员工编号 , m.ename 领导列表, m.empno 领导编号 from emp w ,dept d, emp m where w.mgr = m.empno and w.deptno = d.deptno and d.loc in('new york','chicago') ;

交叉连接

创建一个员工表的交叉连接
就是笛卡尔积
select e.empno, e.ename, d.dname from emp e cross join dept d;

自然连接

相比于等值连接, 等值连接直接指明连接条件,自然连接是自己赵(两个表字段名相同,自动添加) 。自然连接无法控制用哪些字段连接.
select e.empno, e.ename, d.dname from emp e natural join dept d;

外连接

  • 左外连接
    左外连接以FROM句中的左边表为基表,该表所有
    select e.ename,e.deptno,d.dname from emp e left outer join dept d on e.deptno = d.deptno
  • 右外连接
    select e.ename,e.deptno,d.dname from emp e right outer join dept d on e.deptno = d.deptno

联系

  • 创建一个员工表和部门表的交叉连接。
    select * from emp cross join dept;

  • 使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期
    select e.ename 员工姓名, d.dname 部门名称, hiredate 入职日期 from emp e natural join dept d where hiredate > '1980-05-01';

    image.png

  • 使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
    select w.ename 员工姓名, m.ename 经理姓名 from emp w left outer join emp m on w.mgr = m.empno;

    image.png

  • 使用右连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来
    select w.ename 员工姓名, m.ename 经理姓名 from emp w right outer join emp m on m.empno = w.mgr ;

image.png
  • 显示员工SMITH的姓名,部门名称,直接上级名称
    select w.ename , m.ename , d.dname from emp w , emp m , dept d where (d.deptno = w.deptno ) and(w.mgr = m.empno) and (w.ename ='smith');

    image.png

  • 显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。
    select e.ename 员工姓名, d.dname 部门名称, e.sal 工资, s.grade 工资级别 from emp e, dept d, salgrade s where (d.deptno = e.deptno) and ((e.sal > s.losal) and (e.sal < s.hisal)) and (s.grade > '4 ');

    image.png

  • 显示员工KING和FORD管理的员工姓名及其经理姓名。
    select w.ename 管理员名称, m.ename 下属名称 from emp w left outer join emp m on w.empno = m.mgr where w.ename in ('king','ford');

    image.png

  • 显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早。
    select w.ename 员工姓名 , w.hiredate, m.ename 经理姓名, m.hiredate from emp w, emp m where w.mgr = m.empno and w.hiredate < m.hiredate;

    image.png

你可能感兴趣的:(Day1 数据库基础)