MySql教程

MySQL核心技术部分基础

本文主要是介绍MySQL核心技术部分基础,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

为什么要学习数据库

        数据库的好处

        数据库的概念

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的查询面试题来提高熟练度。

这篇关于MySQL核心技术部分基础的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!