ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL核心技术部分基础

2021-09-10 20:01:50  阅读:132  来源: 互联网

标签:name 核心技术 employees 基础 查询 MySQL department id select


目录

为什么要学习数据库

        数据库的好处

        数据库的概念

MySQL

        优点

        MySQL服务的启动和停止

        MySQL服务的登录和退出

        MySQL的常见命令

        MySQL的语法规范

基本功能——查询

        基础查询

                查询表中的单个字段

                查询表中的多个字段

                查询表中的所有字段

                查询常量值

                查询表达式

                查询函数

                起别名             

                去重

                +的作用

        条件查询

                按条件表达式筛选

                按逻辑表达式筛选

                模糊查询

        排序查询

                添加筛选条件

                按表达式排序

                按别名排序

                按函数排序

                按多个字段排序

        分组查询

                 简单分组查询

                添加分组前筛选

                添加分组后筛选

                按表达式或函数分组

                按多个字段分组

        连接查询

                sql92标准

                sql99标准

        子查询            

                放在where或having后

                放在select后    

                放在from后

                放在exists后

        分页查询

        联合查询

总结:


为什么要学习数据库

        数据库的好处

                ·实现数据持久化
                ·使用完整的管理系统统一管理,易于查询

        数据库的概念

                DB:数据库(database):存储数据的“仓库”。它保存了一系列有组织的数据

                DBMS:数据库管理系统(Database Management System)。数据库是通过DBMS创建和操作的容器,常见的数据库管理系统:MySQL、Oracle、DB2、SqlServer。

                SQL:结构化查询语言(Structure Query Language):专门用来与数据库通信的语言。

MySQL

        优点

                ·成本低:开放源代码,一般可以免费试用
                ·性能高:执行很快
                ·简单:很容易安装和使用        

        MySQL服务的启动和停止

                ·方式一
                   计算机——右击管理——服务
                ·方式二
                    通过管理员身份运行
                    net start 服务名(启动服务)
                    net stop 服务名(停止服务)

        MySQL服务的登录和退出

                ·方式一
                    通过mysql自带的客户端
                    只限于root用户
                ·方式二
                    通过windows自带的客户端登录
                    mysql  (-h 主机名 -P 端口号) -u用户名 -p密码 (括号里面如果是localhost可不写)

                ·退出
                    exit或Ctrl+C

        MySQL的常见命令

                1.查看当前所有的数据库
                    show databases;
                2.打开指定的库
                    use 库名
                3.查看当前库的所有表
                    show tables;
                4.查看其他库的所有表
                    show tables from 库名
                5.创建表
                    create tables 表名(
                        列名 列类型,
                        列名 列类型,
                        ···
                );
                6.查看表结构
                    desc 表名;
                7.查看服务器的版本
                    方式一
                        登录到mysql服务端
                        select version();
                    方式二
                        没有登录到mysql服务端
                        mysql --version
                        或
                        mysql --V

        MySQL的语法规范

                ·不区分大小写,但建议关键字大写,表名、列名小写
                ·每条命令最好用分号结尾
                ·每条命令根据需要,可以进行缩进或换行
                ·注释
                    单行注释:#注释文字
                    单行注释:-- 注释文字
                    多行注释:/* 注释文字 */

基本功能——查询

        基础查询

                查询表中的单个字段

                        如:

	SELECT last_name FROM employees;

                查询表中的多个字段

                        如:

	SELECT last_name,salary,email FROM employees;

                查询表中的所有字段

                        如:

	SELECT * FROM employees;

                查询常量值

                        如:

	SELECT 100;
	SELECT 'john';

                注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要

                查询表达式

                        如:

SELECT 100%98;

                查询函数

                        如:

	SELECT VERSION();

                起别名             

                        ·好处
                            1、便于理解
                            2、如果要查询的字段有重名的情况,使用别名可以区分开来

                        ·方式一:使用as
                            

SELECT 100%98 AS 结果;
SELECT last_name AS 姓,first_name 名 FROM employees;

                        ·方式二:使用空格
                            

SELECT last_name 姓,first_name 名 FROM employees;

                        ·特殊情况
                            当起的别名有空格,#等特殊字符,要用双引号括起来
                            

SELECT salary AS "out put" FROM employees;

                去重

                        如:

SELECT DISTINCT department_id FROM employees;

                +的作用

                        ·java中的+
                            1、运算符,两个操作数都为数值型
                            2、连接符,只要有一个操作数为字符串
                        ·mysql中的+
                            仅仅只有一个功能:运算符

SELECT 100+90;(两个操作数都为数值型,则做加法运算)
SELECT '123'+90;(只要其中一方为字符型,试图将字符型数值转换为数值型,如果转换成功,则继续做加法运算)
SELECT 'john'+90;(如果转换失败,则将字符型数值转换为0)
SELECT null+10;只要其中一方为null,则结果肯定为null

        条件查询

                按条件表达式筛选

                        条件运算符:> < = <> >= <=

                        如

查询部门编号不等于90号的
                            SELECT
                                last_name,
                                department_id
                            FROM
                                employees
                            WHERE
                                department_id<>90;

                按逻辑表达式筛选

                        逻辑运算符:and or not

                        ·如

查询部门编号不是在90到110之间,或者工资高于15000的员工信息
                            SELECT
                                *
                            FROM
                                employees
                            WHERE
                                NOT(department_id>=90 AND department_id<=110) OR salary>15000;

                模糊查询

                        like

                                ·特点
                                    一般和通配符搭配使用,可以判断字符型或数值型
                                 通配符:
                                    % 任意多个字符,包含0个字符
                                    _ 任意单个字符

                                例子1
                                    

查询员工名中第三个字符为n,第五个字符为l的员工名和工资
                                    SELECT
                                        last_name,
                                        salary
                                    FROM
                                        employees
                                    WHRER
                                        last_name LIKE '__n_l%';

                                例子2
                                    

查询员工名中第二个字符为_的员工名
                                    SELECT
                                        last_name
                                    FROM
                                        employees
                                    WHERE
                                last_name LIKE '_$_%' ESCAPE '$';(ESCAPE这里表示$充当转义符/)

                        between and

                                ·特点:
                                    1、使用between and 可以提高语句的简洁度
                                    2、包含临界值
                                    3、两个临界值不要调换顺序

                                例子:

    SELECT
        *
    FROM
        employees
    WHERE
        employee_id BETWEEN 100 AND 120;

                        in

                                ·特点:
                                    1、使用in提高语句简洁度
                                    2、in列表的值类型必须一致或兼容

                                例子

查询员工的工种编号是IT_PROG、AD_VP、AD_PRES的一个员工名和工种编号
                                    SELECT
                                        last_name,
                                        job_id
                                    FROM
                                        employees
                                    WHERE
                                        job_id IN('IT_PROT','AD_VP','AD_PRES');

                        is null

                                ·功能
                                    判断某字段或表达式是否为null,如果是,则返回1,否则返回0
                                ·特点
                                    =或<>不能用于判断null值
                                    is null或is not null 可以判断null值

                                例子
 

查询没有奖金的员工名和奖金率
                                    SELECT
                                        last_name,
                                        commission_pct
                                    FROM
                                        employees
                                    WHERE
                                        commission_pct IS NULL;

        排序查询

                添加筛选条件

                        如:

查询部门编号>=90的员工信息,按入职时间的先后进行排序
	SELECT *
	FROM employees
	WHERE department_id>=90
	ORDER BY hiredate ASC;

                按表达式排序

                        如:

按年薪的高低显示员工的信息和年薪
	SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
	FROM employees
	ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC

                按别名排序

                        如:

按年薪的高低显示员工的信息和年薪
	SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
	FROM employees
	ORDER BY 年薪 DESC;

                按函数排序

                        如:

按姓名的长度显示员工的姓名和工资
	SELECT LENGTH(last_name) 字节长度,last_name,salary
	FROM employees
	ORDER BY LENGTH(last_name) DESC;

                按多个字段排序

                        如:

查询员工信息,要求先按工资排序,再按员工编号降序
	SELECT *
	FROM employees
	ORDER BY salary ASC,employee_id DESC;

        分组查询

                ·语法
                    select 分组函数,列(要求出现在group by的后面)
                    from 表
                    【where 筛选条件】
                    group by 分组的列表
                    【order by 子句】
                ·注意:
                    查询列表必须特殊,要求是分组函数和group by后出现的字段

                ·特点


                    2、group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数(用得较少)
                    3、也可以添加排序(排序放在整个分组查询的最后)

                 简单分组查询

                        如:

查询每个工种的最高工资
	select max(salary),job_id
	from employees
	group by job_id;

                添加分组前筛选

                        如:

查询邮箱中包含a字符的,每个部门的平均工资
	select avg(salary),department_id
	from employees
	where email like '%a%'
	group by department_id;

                添加分组后筛选

                        如:

查询哪个部门的员工个数>2
	select count(*),department_id
	from employees
	group by department_id
	having count(*)>2;

                按表达式或函数分组

                        如:

按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
	select count(*) c,length(last_name) len_name
	from employees
	group by len_name
	having c>5;

                按多个字段分组

                        如:

查询每个部门每个工种的员工的平均工资
	select avg(salary), department_id,job_id
	from employees
	group by job_id,department_id;

        连接查询

                sql92标准

                        等值连接                       

                                 例子1

查询女神名和对应的男神名
    select name,boyName
    from boys,beauty
    where beauty.boyfriend_id=boys.id;

                                ·为表起别名
                                    1、提高语句的简洁度
                                    2、区分多个重名的字段

                                    注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定

                                        例子2

查询员工名、工种号、工种名
    select e.last_name,e.job_id,j.job_title
    from employees as e,jobs as j
    where e.'job_id'=j.'job_id';

                                ·可以加筛选
                                        例子3

    查询有奖金的员工名、部门名
        select last_name,department_name,commission_pct
        from employees e,departments d
        where e.'department_id'=d.'department_id'
        and e.'commission_pct' is not null;

                        非等值连接

                                例子

查询员工的工资和工资级别
    select salary,grade_level
    from employees e,job_grades g
    where salary between g.'lowest_sal' and g.'highest_sal' ;

                        自连接                

                                例子

查询员工名和上级的名称
	select e.employee_id,e.last_name,m.employee_id,m.last_name
	from employees e,employees m
	where e.'manager_id'=m.'employee_id';

                sql99标准

                     内连接

                        ·语法
                            select 查询列表
                            from 表1 别名
                            inner join 表2 别名
                            on 连接条件;

                        等值连接      

                                ·特点
                                    1、可以添加排序、分组、筛选
                                    2、innner可以省略
                                    3、筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
                                   4、inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集

                                例子1

查询哪个部门的员工个数>3的部门名和员工个数,并按个数排序
    select count(*),department_name
    from employees e
    inner join departments d
    on e.'department_id'=d.'department_id'
    group by department_name
    having count(*)>3
    order by count(*) desc;

                                例子2

    查询员工名、部门名、工种名,并按部门名降序
    select last_name,department_name,job_title
    from employees e
    inner join departments d on e.'department_id'=d.'department_id'
    inner join jobs j on e.'job_id'=j.'job_id'
    order by department_name desc;

                        非等值连接

                                例子

	查询工资级别的个数>20的个数,并且按工资级别降序
	select count(*),grade_level
	from employees e
	join job_grades g
	on e.'salary' between g.'lowest_sal' and g.'highest_sal'
	group by grade_level
	having count(*)>20
	order by grade_level desc;

                        自连接

                                例子

	查询姓名中包含字符k的员工的名字、上级的名字
	select e.last_name,m.last_name
	from employees e
	join employees m
	on e.'manager_id'=m.'employee_id'
	where e.'last_name' like '%k%';

                     外连接 

                        ·应用场景
                            用于查询一个表中有,另一个表没有的记录
                        ·特点
                            1、外连接的查询结果为主表中的所有记录
                                如果从表中有和它匹配的,则显示匹配的值
                                如果从表中没有和它匹配的,则显示null
                                外连接查询结果=内连接结果+主表中有而从表没有的记录
                            2、左外连接,left join左边的是主表
                                  右外连接,right join右边的是主表
                            3、左外和右外交换两个表的顺序,可以实现同样的效果
                            4、全外连接=内连接的结果+表1中有但表2没有的+表2有但表1没有的

                        左外连接 

                                例子

查询哪个部门没有员工
	select d.*,e.employee_id
	from departments d
	left outer join employees e
	on d.'department_id' = e.'department_id'
	where e.'employee_id' is null;

                        右外连接

                                例子

查询哪个部门没有员工
	select d.*,e.employee_id
	from employees e
	right outer join departments d
	on d.'department_id' = e.'department_id'
	where e.'employee_id' is null;

                     交叉连接

                        ·就是笛卡尔乘积

                        例子

 select b.*,bo.*
 from beauty b
 cross join boys bo;  

        子查询            

                ·含义
                    出现在其他语句中的select语句,称为子查询或内查询
                    外部的查询语句,称为主查询或外查询

                ·分类
                    按子查询出现的位置:
                        select后面:
                            仅仅支持标量子查询
                        from后面:
                            支持表子查询
                        where或having后面
                            标量子查询(单行,重点)
                            列子查询(多行,重点)
                            行子查询
                        exists后面(相关子查询)
                            表子查询
                    按结果集的行列数不同:
                        标量子查询(结果集只有一行一列)
                        列子查询(结果集只有一列多行)
                        行子查询(结果集有一行多列)
                        表子查询(结果集一般为多行多列

                放在where或having后

                        1、标量子查询(单行子查询)
                        2、列子查询(多行子查询)
                        3、行子查询(多行多列)

                        ·特点
                            1、子查询放在小括号内
                            2、子查询一般放在条件的右侧
                            3、标量子查询,一般搭配着单行操作符使用,如> < >= <= = <>
                            列子查询,一般搭配着多行操作符使用,如in、any/some、all
                            4、子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果

                                例子(标量子查询)

查询最低工资大于50号部门最低工资的部门id和其最低工资
    select min(salary),department_id
    from employees
    group by department_id
    having min(salary)>(
        select min(salary)
        from employees
        where department_id=50
);

                                例子(列子查询)

返回其他工种中比job_id为'IT_PROG'工种任一工资低的员工的员工号、姓名、job_id以及salary
    select last_name,employee_id,job_id,salary
    from employees
    where salary<any(
        select distinct salary
        from employees
        where job_id='IT_PROG'
)and job_id<>'IT_PROG';

                                例子(行子查询)

    查询员工编号最小并且工资最高的员工信息
    select*
    from employees
    where employee_id=(
        select min(emoployee_id)
        from employees
)and salary=(
        select max(salary)
        from employees
)

                放在select后    

                        ·仅仅支持标量子查询

                                例子

    查询每个部门的员工个数
    select d.*,(
        select count(*)
        from employees e
        where e.department_id=d.department_id
)个数
    from departments d;

                放在from后

                        ·将子查询结果充当一张表,要求必须起别名

                                例子

    查询每个部门的平均工资
    select ag_dep.*,g.'grade_level'
    from(
        select avg(salary) ag,department_id
        from employees
        group by department_id
)ag_dep
    inner join job_grades g
    on ag_dep.ag between lowest_sal and highest_sal;

                放在exists后

                        ·语法
                            exists(完整的查询语句)
                            结果:
                            1或0

                        例子

    查询有员工的部门名
    select department_name
    from departments d
    where exists(
        select*
        from employees e
        where d.'department_id'=e.'department_id'
);

        分页查询

                ·应用场景
                    当要显示的数据,一页显示不全,需要分页提交sql请求

                ·语法
                    select 查询里诶博爱
                    from 表
                    【join type join 表2
                    on 连接条件
                    where 筛选条件
                    group by 分组字段
                    having 分组后的筛选
                    order by 排序的字段】
                    limit 【offset】,size;

                    offset 表示要显示条目的起始索引(起始索引从0开始)
                    size 表示要显示的条目个数

                ·特点
                    1、limit语句放在查询语句的最后
                    2、公式:要显示的页数page,每页的条目数size
                        select 查询列表
                        from 表
                        limit(page-1)*size,size;

                例子1

    查询前五条员工信息
    select *
    from employees
    limit 5;

                例子2

    查询第11条-第25条
    select *
    from employees 
    limit 10,15;

                例子3

    有奖金的员工信息,并且工资较高的前10名显示出来
    select *
    from employees
    where commission_pct is not null
    order by salary desc
    limit 10;

        联合查询

                 ·union 联合 合并:将多条查询语句的结果合并成一个结果

                 ·语法
                    查询语句1
                    union
                    查询语句2
                    union

                ·应用场景
                    要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时

                ·特点
                    1、要求多条查询语句的查询列数是一致的!
                    2、要求多条查询语句的查询的每一列的类型和顺序最好一致
                    3、union关键字默认去重,如果使用union all 可以包含重复项
                例子

    查询中国用户中男性的信息以及外国用户中年男性的用户信息
    select id,cname,csex from t_ca where csex='男'
    union
    select t_id,tName,tGender from t_ua where tGender='male';

总结:

        博主才学习完mysql里的查询相关的语句知识,发现mysql的知识特别多,而且对于博主这种第一次接触mysql的小白,感觉特别绕,需要通过以后多做mysql的查询面试题来提高熟练度。

标签:name,核心技术,employees,基础,查询,MySQL,department,id,select
来源: https://blog.csdn.net/zhangtianba222/article/details/120222918

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有