美文网首页
mysql学习笔记(更新中).md

mysql学习笔记(更新中).md

作者: Minimal__ | 来源:发表于2020-01-03 17:09 被阅读0次

    mysql初级学习笔记.md

    标签(空格分隔): mysql mysql初级


    mysql介绍

    DB:database,存储数据的仓库,保存了一些列有组织比较规范的数据。
    DBMS:数据库管理系统 Database management system,数据库是通过DBMD创建和操作的容器。(mysql、oracle(oracle公司)、DB2(IBM公司,处理海量数据有优势)、sqlserver)
    SQL:结构化查询语言(structure query language)专门用来与数据库通信的语言。

    SQL特点:
    1.几乎所有的DBMS都支持SQL。
    2.简单易学
    3.虽然简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。

    mysql的安装与使用

    • mysql数据库隶属于mysql AB公司,总部位于瑞典,后被(08年被sun收购,之后又被oracle收购)oracle收购。

    • 优点:

      • 开放源代码,一般可以免费使用
      • 性能高
      • 简单:容易安装和使用
    • DBMS分类:

      • 基于公布各项文件系统的DBMS(ACCESS)
      • 基于客户机--服务器的DBMS(mysql、oracle、sqlserver)
    • 社区办

    • 企业版(收费)

    windows平台下载:http://dev.mysql.com/downloads/mysql

    目前版本:
    5.5、5.6、5.7、8.0(测试版)

    mysql的启动与停止

    • linux
      • centos7:systemctl start mysqld systemctl enable mysqld systemctl status mysqld
      • centos6:service mysqld start service mysqld status/stop
    • windows
      • 命令行方式(管理员运行命令提示符):net stop mysql57 net start mysql57

    mysql的登录与退出

    • 登录
      • mysql -uroot -h127.0.0.1 -P3306 -p (需要将mysql加入全局环境变量)
      • -u 后接用户名
      • -h 后接主机ip
      • -P后接端口号
      • -p后接密码,如果连写不能有空格。
    • 退出
      • exit

    mysql的常见命令

    • show databases; 查看存在的库
    • use msyql; 使用指定数据库
    • show tables; 查看存在的表
    • show tables from mysql;查看指定库中的表
    • select database();查看目前所在的库
    • create table stuinfo(id int,name varchar(20)); 创建表,并指定内容
    • desc stuinfo;查看表结构
    • select * from stuinfo;查看表中数据
    • insert into stuinfo(id,name) values(1,'join');插入数据
    • update stuinfo set name='lilei' where id=1 修改stuinfo表中id=1的name字段
    • delete stuinfo where id=1
    • select version(); 查看当前数据库版本
    • mysql --version 或 mysql -V查看当前数据库版本

    mysql的语法规范

    • 1.不区分大小写,建议关键字大写,表明,列明小写。
    • 2.每条命令使用分号结尾。(\G结尾也行。)
    • 3.每条命令根据需要可以进行缩进、换行,建议关键字在一行。
    • 4.注释:
      • 单行注释:#注释文字
      • 单行注释:--空格(sqlserver中--后没有空格)
      • 多行注释:/*注释内容/*

    mysql图形管理工具

    • navicat
      • 支持云同步
    • SQLyog
      • 轻巧不需要破解,仅本地

    DQL语言学习

    • 基础查询
    #进阶1:基础查询
    /*
    语法:
    select 查询列表 from 表名;
    
    1.查询列表可以是:表中的字段、常量值、表达式、函数、等等
    2.查询结果是一个虚拟的表格
    
    */
    
    #1.查询表中的单个字段
    SELECT last_name FROM employees;
    
    #2.查询表中的多个字段
    SELECT last_name,salary,email FROM employees;
    SELECT USER,HOST,passowrd FROM mysql.user; #常用
    
    #3.查询表中给的所有字段
    #方式一:
    SELECT * FROM employees;
    
    #方式二:
    SELECT `first_name`,
        `last_name`,
        `manage_id`
    FROM
        employees;
        
    #4.查询常量值
    SELECT 100;
    SELECT 'join';
    
    #5.查询表达式
    SELECT 100%98;
    
    #6.查询函数
    SELECT VERSION();
    
    #7.为字段起别名
    /*
    ①  便于理解
    ②  如果查询字段有重名的情况,可以使用别名来区分
    */
    #方式一:
    SELECT 100%98 AS 结果;
    SELECT last_name AS 姓,first_name AS 名 FROM employees;
    #方式二:
    SELECT last_name 姓,first_name 名 FROM employees;
    SELECT salary AS "out put" FROM employees;
     
    #8.去重
    #案例:查询员工表中涉及到的所有的部门编号(关键字中加入DISTINCT)
    SELECT DISTINCT department_id FROM employees;
    
    #9. + 号的作用
    /*
    mysql中的加号只有一个功能:运算符
    SELECT 100+90 AS 和;
    SELECT '123'+90; #有其中一方为字符型,试图将字符型数值转换成数值型,如果成功,继续做加法运算,如果转换失败,则将字符型的数值转换成0
    SELECT null+123; #只要其中一方为null则结果为null。
    */
    #案例:员工名和姓连接成一个字段,并显示为 姓名
    SELECT last_name+first_name AS 姓名  FROM employees;  #结果为0
    SELECT CONCAT(last_name,first_name)  AS 姓名  FROM employees;
    SELECT IFNULL(commission_pct,0) AS 奖金率,commission_pct FROM employees; #判断奖金率是否为null,如果是null返回0,注意IFNULL函数的使用
    SELECT CONCAT (`first_name`,',',`last_name`,',',`job_id`,',',IFNULL(commission_pct,0)) AS out_put FROM employees; 
    
    • 条件查询
    #进阶2.条件查询
    /*
    语法
    SELECT 
        查询列表 
    FROM    
        表名 
    WHERE   
        筛选条件;
        
    执行顺序:先from 后where最后select
    分类:
        一、按条件表达式筛选
            条件运算符:> < = != <> >= <=
        二、按逻辑表达式筛选
            作用:用于连接条件表达式
            逻辑运算符:& || ! and or not
        三、模糊查询
             like 、between and 、 in 、 is null     
    */
    #一、按条件表达式筛选
    #案例1:查询员工工资>12000的员工信息
    SELECT * FROM employees WHERE salary>12000;
    #案例2:查询部门编号不等于90的员工名和部门编号
    SELECT last_name,department_id FROM employees WHERE department_id<>90;
    #二、按逻辑表达式筛选
    #案例1:查询工资在10000到20000之间的员工名,工资以及奖金
    SELECT last_name,salary,commission_pct FROM employees WHERE salary>=10000 AND salary<=20000;
    #案例2:部门编号不是在90到110之间,或者工资高于15000的员工。
    SELECT * FROM employees WHERE NOT(department_id>=90 AND department_id<=110) OR salary>15000;
    #三、模糊查询
    /*
    like
    特点:一般和通配符搭配使用
        通配符:
            %:包含任意多个字符
            _:任意单个字符
    between and
    in
    is null     
    */
    #1.like
    #案例1:查询员工名中包含字符a的员工信息
    SELECT * FROM employees WHERE last_name LIKE '%a%';  #mysql中使用%代表通配符
    #案例2:查询员工名中第三个字符为n,第五个字符为l的员工名和工资
    SELECT last_name,salary FROM employees WHERE last_name LIKE '__n_l%';
    #案例3:查询员工名中第二个字符为下划线的员工名
    SELECT last_name FROM employees WHERE last_name LIKE '_\_%'; #转义字符还可以 LIKE '_$_%' ESCAPE '$';说明$是转义字符
    
    #2.between and
    /*
    ①  使用between and可以提高语句简洁度
    ②  包含临界值
    ③  临界值不要调换顺讯
    */
    #案例1:员工编号在100到120之间的所有员工信息
    SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
    
    #3. in关键字
    /*
    含义:判断某字段的值是否属于in列表中的某一项
    特点:
        1.使用in提高语句建解读
        2.in列表中的值类型必须统一或兼容
        3.列表中不支持通配符
    */
    #案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
    SELECT last_name,job_id FROM employees WHERE job_id IN ('IT_PROG','AD_VP','AD_PRES') 
    
    #4. IS NULL的使用(判断NULL值)
    */
    =或<>不能判断null值
    IS NULL 可以判断NULL值
    */
    #案例1:没有奖金的员工名和奖金率
    SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NULL;
    
    SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
    
    # 安全等于 <=>,判断是否等于
    #案例1:没有奖金的员工名和奖金率
    SELECT last_name,commission_pct FROM employees WHERE commission_pct <=> NULL;
    
    #案例2:查询工资为12000的员工信息
    SELECT last_name,salary FROM employees WHERE salary <=> 12000;
    
    # IS NULL 和 <=>
    /*
    IS NULL:仅仅可以判断NULL值
    <=>:既可以判断NULL值有可以判断普通的数值,但是可读性较低
    */
    
    #案例3:查询员工号176的员工姓名和部门号和年薪
    SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees;
    
    
    #测试题1讲解:https://www.youtube.com/watch?v=H_2TJ7tq_Lc&list=PLmOn9nNkQxJHvSwmwwnH3oInxIr7HIZ8U&index=37
     
    
    • 排序查询
    #进阶3:排序查询
    /*
    引入
        SELECT * FROM employees;
    语法:
        SELECT 查询条件 FROM 表 [WHERE 筛选条件] order by 排序条件 [asc|desc];
    特点:
        1. asc 代表升序、DESC代表降序
        如果不写默认升序
        2.ORDER BY子句中可以支持单个字段、多个字段、表达式、函数、别名
        3.ORDER BY子句一般是放在查询语句的最后面,limit子句除外
    */
    #案例1:查询员工信息,要求员工工资从高到底
    
    SELECT * FROM employees ORDER BY salary DESC;
    
    #案例2:查询部门编号大于等于90的员工信息,按入职时间的先后排序
    
    SELECT * FROM employees WHERE department_id >=90 ORDER BY hiredate ASC;
    
    #案例3:按年薪的高低显示员工信息和年薪 。按表达式排序
    
    SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
    
    #案例4:按年薪的高低显示员工信息和年薪 。【按表达式排序】
    
    SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees ORDER BY 年薪DESC;
    
    #案例5:按姓名的长度显示员工的姓名和公司【按函数排序】
    
    SELECT LENGTH(last_name) 字节长度,last_name,salary FROM employees ORDER BY LENGTH(last_name) DESC;
    
    #案例6:查询员工信息,先按员工工资排序再按员工编号排序。【按多个字段排序】
    
    SELECT * FROM emploees ORDER BY salary ASC,employee_id DESC;
    
    #习题1:查询员工姓名和部门号和年薪,按年薪降序,按姓名升序
    SELECT last_name,demartment_id,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 DESC,last_name ASC;
    
    #习题2:选择工资不在8000到17000员工的姓名和工资,按工资降序
    SELECT last_name,salary FROM employees NOT BETWEENT 8000 AND 17000 ORDER BY salary DESC;
    
    #习题3:查询邮箱中包含e的员工信息,并按照员工的字节数降序排序,再按部门号升序排序
    SELECT * FROM employees WHERE email LIKE '%e%' ORDER BY LENGTH(email) DESC,departmant_id ASC;
    
    • 常见函数
    #进阶4:常见函数
    /*
    概念:类似java中的方法,将一组逻辑语句封装在方法体重,对外暴露方法名
    好处:1.实现了实现细节 2.提高了代码的重用性
    调用:SELECT 函数名(实参列表) [FROM 表];
    特点:  
        1.叫什么(函数名)
        2.干什么(函数功能)
    分类:
        1.单行函数:例如 CONCAT、LENGTH、IFNULL等
        2.分组函数
            功能:做统计使用,又称为聚合函数、统计函数、组函数
    */
    
    #一、字符函数
    #length 获取参数值的字节个数
    SHOW VARIABLES LIKE '%char%'; #先查看下目前的字符集
    SELECT LENGTH('荆浩') AS 中文字节长度;
    
    #2.concat 拼接字符串
    SELECT CONCAT(last_name,'_',first_name) AS 姓名 FROM employees;
    
    #3.upper、lower
    SELECT UPPER('join');
    SELECT LOWER('JOIN');
    
    #实例:将名变大写,姓变小写。
    SELECT CONCAT(UPPER(last_name),'_',LOWER(first_name)) AS 姓名 FROM employees;
    
    #4.substr、substring
    #注意:sql语言中索引都是从1开始
    #截取从索引处后面所有的字符
    SELECT SUBSTR('李莫愁爱上了陆展元',7) AS OUTPUT;
    #截取从指定索引处指定字符长度的字符,下例中截取长度为3的字符长度
    SELECT SUBSTR('李莫愁爱上了陆展元',1,3) AS output;
    
    #案例:将姓名中首字符大写,其他字符小写,再拼接在一起
    SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(first_name,2))) AS OUTPUT FROM employees;
    
    #5.instr 返回子串第一次出现的索引,如果找不到返回0
    
    SELECT INSTR('杨不悔爱上了殷六侠','殷六侠') AS OUTPUT;
    
    6.trim 去除前后空格及其他指定字符串
    
    SELECT LENGTH(TRIM('  张翠山  ')) AS OUTPUT;
    SELECT TRIM('a' FROM 'aaaaaaa张aaaa翠山aaaaaaaa');
    
    #7.lpad  用指定的字符实现左填充指定长度
    SELECT LPAD('殷素素',10,'*') AS OUTPUT;
    
    #8.rpad 实现右填充
    SELECT RPAD('殷素素',12,'*') AS OUTPUT;
    
    #9.replace替换
    SELECT REPLACE('张无忌爱上了周芷若','周芷若','赵敏') AS OUTPUT;
    
    
    #二、数学函数
    
    #1.round  四舍五入
    
    SELECT ROUND(-1.65) AS OUTPUT;
    SELECT ROUND(1.456,2) AS OUTPUT;
    
    #2.ceil 向上取整,返回大于等于该参数的最小整数。
    SELECT CEIL(1.002);
    SELECT CEIL(1.000);
    SELECT CEIL(-1.002);
    
    #3.floor 向下取整,返回小于等于改参数的最大整数
    SELECT FLOOR(-9.99);
    
    #4.truncate 截断,后面都不要了
    SELECT TRUNCATE(1.65,1);
    
    #5.mod  取模(取余)
    /*
    MOD(a,b):a-a/b*b
    */
    SELECT MOD(10,-3);
    SELECT 10%3;
    
    #三、日期函数
    
    #now 返回当前系统日期+时间
    SELECT NOW();
    
    #curdate 返回系统日期,不包含时间
    SELECT CURDATE();
    
    #curtime 返回当前时间,不包含时间
    SELECT CURTIME();
    
    #获取指定的部分,年、月、日、小时、分钟、秒
    SELECT YEAR(NOW()) AS 年;
    SELECT YEAR('1990-8-17') AS 年;
    SELECT YEAR(hiredate) AS 年 FROM employees:
    SELECT MONTH(NOW()) 月;
    SELECT MONTHNAME(NOW()) 月;
    
    #str_to_date   将日期格式的字符串转换成指定的日期格式
    SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') output;
    #查询入职日志为1992-4-3员工信息
    SELECT * FROM employees WHERE hiredate = '1992-4-3';
    SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %y');
    
    #date_format   将日期转换成字符
    SELECT DATE_FORMAT('2019/9/9','%Y年%m月%d日') OURPUT;
    SELECT DATE_FORMAT(NOW(),'%y年%m月%d日');
    #查询有奖金的员工名和入职日期(xx月/xx日 xx年)
    SELECT last_name,DATE_FORMAT(hiredate,'%m月/%d日 %y年') FROM employees WHERE commission_pct IS NOT NULL;
    
    
    #四、其他函数
    
    SELECT VERSION();   查询版本号
    SELECT DATABASE();  查看当前库
    SELECT USER();      查看当前用户
    
    #五、流程控制函数
    
    #1. if函数:if else
    SELECT IF('10>5','大','小');
    SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金,哈哈','有奖金,嘻嘻') AS 备注;
    
    #2.case函数的使用一:类似于java的switch case效果
    
    /*
        switch(变量或表达式){
            case 常量1:语句1; break;
            ...
            default:语句;break;
        }
        mysql中
        
        case 要判断的字段或表达式
        when 常量1 then要显示的值1或语句1;
        when 常量2 then要显示的值2或语句2;
        ...
        else 要显示值n或语句n;
        end
    */
    
    #案例:查询员工的工资,要求
    /*
    部门号=30 显示的工资为1.1倍
    部门号=40 显示的工资为1.2
    部门号=50 显示的工资为1.3
    其他部门显示为原工资
    */
    
    SELECT salary 原始工资,department_id, 
    CASE department_id
    WHEN 30 THEN salary*1.1
    WHEN 40 THEN salary*1.2
    WHEN 50 THEN salary*1.3
    ELSE salary
    END AS 新工资
    FROM employees; 
    
    #3.case函数的使用2:类似于java的多重if
    /*
    java中
    if(条件){
        语句1;
    }else if(条件2){
        语句2;
    }else {
        语句n;
    }
    
    mysql中:
    case 
    when 条件1 then 要显示的值1 或语句1
    when 条件2 then 要显示的值2 或语句2
    ...
    else  要显示的值n或语句n
    end
    */
    #案例:查询员工的工资情况
    /*
    如果工资>20000,显示A级别
    如果工资>15000,显示B级别
    如果工资>10000,显示C级别
    否则显示D级别
    */
    SELECT salary,
    CASE
    WHEN salary>20000 THEN 'A'
    WHEN salary>15000 THEN 'B'
    WHEN salary>10000 THEN 'C'
    ELSE 'D'
    END AS 工资级别
    FROM employees ORDER BY 工资级别;
    
    • 分组函数
    #二、分组函数
    /*
    功能:用作统计,又称为聚合函数或统计函数或组函数
    
    分类:
    sum 求和、avg 平局值、max 最大值、min 最小值、count 计算个数
    
    特点:
    1.SUM、AVG一般用于处理数值型
      MAX、MIN、COUNT可以处理任何值
    2.以上分组函数都忽略null值
    3.可以和distinct搭配实现去重的运算
    4.count函数详细介绍
    一般使用count(*)用作统计行数
    MYISAM 存储引擎下,count(*)效率高
    INNODB 存储引擎下,count(*)和count(1)的效率差不多,但是比count(字段)效率高一些
    5.和分组函数一通查询的字段要求是group by后的字段
    */
    
    #1.简单的使用
    SELECT SUM(salary) FROM employees;
    SELECT AVG(salary) FROM employees;
    SELECT MAX(salary) FROM employees;
    SELECT MIN(salary) FROM employees;
    SELECT COUNT(salary) FROM employees;
    
    SELECT SUM(salary) AS 和,ROUND(AVG(salary),2) AS 平均,MAX(salary) AS 最高;
    
    #2.参数支持哪些类型
     
     SELECT SUM(last_name),AVG(last_name) FROM employees;  # 字符型不支持求和,输出结果为0
     SELECT MAX(last_name),MIN(last_nmae) FROM employees;  
     
    #3.是否忽略null
    SELECT SUM(commission_pct),AVG(commission_pct) FROM employees;
    SELECT MAX(commission_pct),MIN(commission_pct) FROM employees;
    SELECT COUNT(commission_pct) FROM employees;
    
    #4.和distinct搭配
    SELECT SUM(DISTINCT salary),SUM(salary) FROM employees;
    SELECT COUNT(DISTINCT salary) FROM employees;
    
    
    #5.count函数的详细介绍
    SELECT COUNT(salary) FROM employees;
    
    SELECT COUNT(*) FROM employees;  #用来统计行数
    
    SELECT COUNT(1) FROM employees;  #用来统计1的个数,进而达到统计总行数的目的,1可以替换成任意值
    
    #效率:
    MYISAM 存储引擎下,count(*)效率高
    INNODB 存储引擎下,count(*)和count(1)的效率差不多,但是比count(字段)效率高一些
    
    #6.和分组函数一同查询的字段有限制
    SELECT AVG(salary),employee_id FROM employees;  #虽然不报错,但是一般不这么写
    
    
    #习题
    1.#查询员工工资的最大值最小值平均值和总和
    SELECT MAX(salary) AS max_sal,MIN(salary) mi_sal,AVG(ROUND(salary,2)) AS avg_sal, SUM(salary) AS sum_sal FROM employees;
    #2.查询员工表中最大入职时间和最小入职时间的相差天数
    SELECT DATEDIFF('2017-10-01','2017-9-29') AS 相差天数;  #datediff函数的使用介绍
    SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) AS diffience  FROM employees;
    
    #3.查询部门编号为90的员工个数
    SELECT COUNT(*) FROM employees WHERE department_id = 90;
    
    • 分组查询
    #进阶5:分组查询
    /*
    
    语法:
        select 分组函数,列 
        from   表明
        [where 筛选条件]
        group by 分组的列表
        [order by 子句]
    要求:
        查询列表比较特殊,要求分组函数和group by后出现的字段
    */
    #引入:查询每个部门的平均工资
    SELECT AVG(salary),department_id FROM employees GROUP BY department_id;
    
    #案例1:查询每个工种的最高工资
    SELECT MAX(salary),job_id FROM employees GROUP BY job_id;
    
    #案例2:查询每个位置上的部门个数
    SELECT COUNT(*),localtion_id FROM department GROUP BY location_id;
    
    #添加筛选条件
    #案例3:查询邮箱中包含a字符的每个部门的平均工资
    SELECT AVG(salary),department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id ;
    
    #案例4:查询有奖金的每个领导手下员工的最高工资
    SELECT MAX(salary),manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id;
    #添加分组后的筛选
    #案例1:查询哪个部门的员工个数大于2
    SELECT COUNT(*),department_id FROM employees GROUP BY department_id HAVING COUNT(*)>2;
    
    #案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和其最高工资
    SELECT MAX(salary),job_id FROM employees WHERE commission_pct IS NOT NULL  GROUP BY job_id HAVING MAX(salary)>12000;
    
    • 连接查询
    #进阶6:连接查询
    /*
    含义:多表连接。当查询的字段设计到多个表时,就会用到连接查询
    笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n行
    
    发生原因:没有有效的连接条件
    如何避免:添加有效的连接条件
    
    分类:
        按年代分类:
            sql93标准:仅仅支持内连接
            sql99标准【推荐使用此标准】:支持所有内连接+外链接(左外、右外)+交叉连接
        按功能分类:
            内连接:
                等值连接
                非等值连接
                自连接
            外连接:
                左外连接
                右外连接
                全连接
            交叉连接
    */
        
     SELECT NAME,boyName
     FROM boys,beauty
     WHERE beauty.boyfriend_id=boys.id;
     
     
     
     #一、sql92标准
     #1.等值连接
     
     /*
    ① 多表等值连接的结果为多表的交集 部分
    ② n表连接至少需要n-1个连接条件
    ③ 多表的顺序没有要求
    ④ 一般需要为表起别名
    ⑤ 可以搭配前面介绍的所有子句使用,比如排序、分组、筛选 
     */
     #案例1:查询女神名和对应的男神名
     SELECT NAME,boyName
     FROM boys,beauty
     WHERE beauty.boyfriend_id=boys.id;
     
     #案例2:查询员工名和对应的部门名
     SELECT last_name,department_name
     FROM employees,departments
     WHERE employees.`department_id`=departments.`department_id`;
     
     #2.为表起别名
     /*
     提高语句简洁度
     区分读个重名字段
     注意:如果为表起了别名,则查询的字段就不能使用原来的表明去限定
     */
     
     #查询员工名、工种号、工种名(工种名来自jobs表) 
     SELECT last_name,e.job_id,job_title
     FROM employees AS e,jobs AS j
     WHERE e.job_id=j.job_id;
     
     
    #3.两个表的顺序可否调换,可以的
     
     SELECT last_name,e.job_id,job_title
     FROM jobs AS j,employees AS e
     WHERE e.job_id=j.job_id;
     
    #4.加条件筛选
     
    #案例1:有奖金的员工名和部门名
    SELECT last_name,department_name,commission_pct
    FROM employees AS e,departments AS d
    WHERE e.`department_id`=d.`department_id`
    AND e.`commission_pct` IS NOT NULL;
    
    #案例2:查询城市名中第二个字符为字母o对应的部门名和城市名
    SELECT department_name,city
    FROM departments AS d,locations AS l
    WHERE d.`location_id`=l.`location_id`
    AND l.`city` LIKE '_o%';
     
    #5.加分组
     
    #案例1:查询每个城市的部门个数
    SELECT COUNT(*) AS 个数,city AS 城市名
    FROM departments d,locations l
    WHERE d.`location_id`=l.`location_id`
    GROUP BY city;
    
    #案例2:查询有奖金的每个部门名和部门领导编号和该部门最低工资
    SELECT department_name,d.manager_id,MIN(salary)
    FROM departments d,employees e
    WHERE d.`department_id`=e.`department_id`
    AND commission_pct IS NOT NULL
    GROUP BY department_name,d.manager_id;
     
     
     #6.加排序
     #案例1:查询每个工种的工种名和员工的个数并且按员工个数降序
     SELECT job_title,COUNT(*)
     FROM employees e,jobs j
     WHERE e.`job_id`=j.`job_id`
     GROUP BY job_title
     ORDER BY COUNT(*) DESC;
     
    #7.三表连接
    #案例1:查询员工名、部门名、所在城市(s开头城市),按照部门名升序排序输出
    SELECT last_name,department_name,city
    FROM employees e,departments d,locations l
    WHERE e.`department_id`=d.`department_id`
    AND d.`location_id`=l.`location_id`
    AND city LIKE 's%'
    ORDER BY department_name ASC;
    
    #2.非等值连接
     
     #案例1:查询员工的工资和工资级别
     
    SELECT salary,grade_level
    FROM employees e,job_grades j
    WHERE e.`salary`BETWEEN  j.`lowest_sal` AND j.`highest_sal`
    AND j.`grade_level`='A';
     
    #3.自连接
    /*
    
    */
    # 案例1:查询员工名以及上级的名称
    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 表  别名 [连接类型]
        JOIN 表2 别名 
        ON 连接条件
        [WHERE 筛选条件]
        [GROUP BY 分组]
        [HAVING 筛选条件]
        [ORDER BY 排序列表]
    内连接☆:INNER
    外连接(左外☆LEFT [OUTER]、右外☆ RIGHT [OUTER]、全外 FULL [OUTER])
    交叉连接 CROSS
     
     */
     
     #一) 内连接
     /*
    语法:
     SELECT 查询列表
     FROM 表1 别名
     INNER JOIN 表2 别名
     ON 连接条件;
     分类:
     等值连接
     非等值连接
     自连接 
     特点:
     ① 添加排序、分组、筛选
     ② inner可以省略
     ③ 筛选条件放在where后面,连接条件放在on后,提高了分离性,便于阅读
     ④ inner join 和sql92中的等值连接最后效果一样的,都会查询多表的交集部分  
     
     
     */
    
    #1.等值连接
    #案例1.查询员工名、部门名
    SELECT last_name,department_name
    FROM employees e
    INNER JOIN departments d
    ON e.`department_id`=d.`department_id`;
    
    #2.查询名字汇总包含e的员工名和工种名(添加筛选)
    SELECT last_name,job_title 
    FROM employees e
    INNER JOIN jobs j
    ON e.`job_id`=j.`job_id`
    WHERE e.`last_name` LIKE '%e%';
    
    
    #3.查询部门个数>3的城市名和部门个数(分组+筛选)
    
    
    SELECT city,COUNT(*) 部门个数
    FROM departments d
    INNER JOIN locations l
    ON d.`location_id` = l.`location_id`
    GROUP BY city
    HAVING COUNT(*)>3;
    
    #4.查询哪个部门的部门个数>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;
    
    
    #5.查询员工名、部门名、工种名,并按照部门名降序(三表连接)
    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;
    
    
    • 子查询
    • 分页查询
    • union联合查询

    DML语言学习

    • 插入语句
    • 修改语句
    • 删除语句

    DDL语言学习

    • 库和表的管理
    • 常见数据类型介绍
    • 常见

    TCL语言学习

    • 事务和事务处理

    相关文章

      网友评论

          本文标题:mysql学习笔记(更新中).md

          本文链接:https://www.haomeiwen.com/subject/aixtactx.html