IT评测·应用市场-qidao123.com

标题: mysql 基础知识 [打印本页]

作者: 瑞星    时间: 2022-12-3 00:17
标题: mysql 基础知识
学习中的思考

在 mysql 学习和使用中,我遇到了不少的难题,我觉得我应该形成一套逻辑思考体系,可以让我在初识 mysql 的过程中加入理性思考,从一开始就探求原理,了解所学内容的核心和关键点,做到一叶知秋而不是只见树木不见森林。
MySQL 基础

一、为什么要学习数据库

二、数据库的相关概念:

SQL的优点:
三、数据库存储结构的特点:

四、初识MySQL

MySQL产品的介绍

DBMS分为两类:
MySQL产品的安装

MySQL安装

MySQL卸载

  1. A. HKEY_LOCAL_MAACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL 目录
  2. B. HKEY_LOCAL_MAACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL 目录
  3. C. HKEY_LOCAL_MAACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL 目录
  4. D. HKEY_LOCAL_MAACHINE\SYSTEM\CurrentControl001\Services\MYSQL 目录
  5. E. HKEY_LOCAL_MAACHINE\SYSTEM\CurrentControl002\Services\MYSQL 目录
  6. F. HKEY_LOCAL_MAACHINE\SYSTEM\CurrentControlSet\Services\MYSQL 目录
复制代码
MySQL服务的启动和停止

MySQL服务端的登录和退出

MySQL常见的命令

  1. create table 表名(
  2.     列名     列类型,
  3.     列名     列类型,
  4.     ......
  5. );
复制代码

MySQL语法规范


  1. SELECT 查询列表             7
  2. FROM 表1 别名                第1步
  3. 连接类型 join 表2             2
  4. ON 连接条件                 3
  5. WHERE 筛选条件                 4
  6. GROUP BY 分组列表             5
  7. HAVING 分组后的筛选            6
  8. ORDER BY 排序列表             8
  9. LIMIT 偏移,条目数;            9
复制代码
五、DQL(Data Query Language)语言的学习

基础查询

语法:
  1. SELECT 查询列表 FROM 表名;
复制代码
特点:
  1. 1.查询列表可以是:表中的字段、常量值、表达式、函数;
  2. 2.查询的结果是一个虚拟的表格;查询表中的某个字段
复制代码
  1. > 方式一:
  2.     SELECT `employee_id`,
  3.         `first_name`,
  4.     FROM
  5.         employees;
  6. > 方式二:
  7.     SELECT * FROM employees;
复制代码
  1. SELECT 100;
  2. SELECT 'john';    //字符和日期型的常量值必须用单引号,数值型不需要;
复制代码
  1. SELECT 100*99;
复制代码
  1. SELECT VERSION();
  2. SELECT 函数名(实参列表);
复制代码

  1. 方式一:使用 AS
  2.     SELECT 100%98 AS 结果;
  3.     SELECT last_name AS 姓, first_name AS 名 FROM employees;
  4. 方式二:使用空格
  5.     SELECT last_name 姓,first_name 名 FROM employees;
复制代码
  1. SELECT DISTINCT 字段名 FROM 表名;
  2. 案例:查询员工表中涉及到的所有部门编号
  3.     SELECT DISTINCT department_id FROM employees;
复制代码
  1. 案例:查询员工名和姓连接成一个字段,并显示为 姓名
  2.   SELECT
  3.       CONCAT(last_name,first_name) AS 姓名
  4.   FROM
  5.       employees;
  6. 案例:显示出表employee的全部列,各个列之间用逗号连接,列头显示成OUT_PUT
  7.   SELECT
  8.       CONCAT(`first_name`,',',`last_name`,',',`job_id`,',',IFNULL(commission_pct,0)) AS out_put
  9.   FROM
  10.       employees;
复制代码
  1. 功能:判断某字段或表达式是否为null,如果为null,返回指定值,否则返回原本的值
  2. SELECT ifnull(commissiop_pct,0) from employees;
复制代码
空值参与运算

运算符

算数运算符

mysql 中的加号,只有一个功能:运算符,做加法运算。
  1. SELECT 100+90; 两个操作数都为数值型,则做加法运算
  2. SELECT '123'+90;只要其中一方为字符型,试图将字符型数值转成数值型,
  3.                 如果转换成功,则继续做加法运算。
  4.                 如果转换失败,则将字符型数值转换成0
  5. SELECT null+10;    只要其中一方为null,则结果肯定为null
复制代码

结果的符号与被模数的符号一致。
比较运算符

比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果为假则返回0,其他情况则返回 NULL。


逻辑运算符

位运算符

条件查询

<ul>语法:
  1. SELECT
  2.     查询列表
  3. FROM
  4.     表名
  5. WHERE
  6.     筛选条件;
复制代码
分类:
<ul>按条件表达式筛选

条件运算符: > < = !=  >= 12000的员工信息    SELECT        *    FROM        employees    WHERE        salary>120000;#案例2:查询部分编号不等于90的员工名和部门编号    SELECT        last_name,        department_id    FROM        employees;    WHERE        department_id90;[/code]
  1. #案例1:查询工资>12000的员工信息
  2.     SELECT
  3.         *
  4.     FROM
  5.         employees
  6.     WHERE
  7.         salary>120000;
  8. #案例2:查询部分编号不等于90的员工名和部门编号
  9.     SELECT
  10.         last_name,
  11.         department_id
  12.     FROM
  13.         employees;
  14.     WHERE
  15.         department_id<>90;
复制代码
常见函数
  1. #案例一:查询工资在10000到20000之间的员工名、工资以及奖金
  2.     SELECT
  3.         last_name,
  4.         salary,
  5.         commission_pct
  6.     FROM
  7.         employees
  8.     WHERE
  9.         salary >= 10000
  10.     AND
  11.         salary <= 20000
复制代码
单行函数

字符函数

注意:MySQL中,字符串的位置是从1开始的。
函数作用ASCII(S)返回字符串 S 中的第一个字符的 ASCII 码值CHAR_LENGTH(s)返回字符串s的字符数。作用与CHARACTER_LENGTH(s)相同LENGTH(s)返回字符串s的个数,和字符集有关CONCAT(s1,s2,...,sn)连接s1,s2,......sn 为一个字符串CONACT_WS(x,s1,s2,......,sn)同CONCAT(s1,s2,...)函数,但是每个字符串之间要加上xINSERT(str,idx,len,replacestr)将字符串str从第idx位置开始,len个字符长的子串替换为字符串replacestrREPLACE(str,a,b)用字符串b替换字符串str中所有出现的字符串aUPPER(s) 或 UCASE(s)将字符串s的所有字母都转换成大写字母LOWER(s) 或 LCASE(s)将字符串s的所有字母都转成小写字母LEFT(str,n)返回字符串str最左边的n个字符RIGHT(str,n)返回字符串str最右边的n个字符LPAD(str,len,pad)用字符串pad对str最左边进行填充,直到str的长度为len个字符RPAD(str,len,pad)用字符串pad对str最右边进行填充,直到str的长度为len个字符LTRIM(s)去掉字符串s左侧的空格RTRIM(s)去掉字符串s右侧的空格TRIM(s)去掉字符串s开始与结尾的空格TRIM(s1 FROM s)去掉字符串s开始与结尾的s1TRIM(LEADING s1 FROM s)去掉字符串s开始处的s1TRIM(TRAILING s1 FROM s)去掉字符串s结尾处的s1REPEAT(str,n)返回str重复n次的结果SPACE(n)返回n个空格STRCMP(s1,s2)比较字符串s1,s2的ASCII码值的大小SUBSTR(s,index,len)返回从字符串s的index位置其len个字符,作用与SUBSTING(s,n,len)相同LOCATE(substr,str)返回字符串 substr 在字符串 str 中首次出现的位置,作用与 POSITION(substr IN str)、INSTR(str,substr) 相同。未找到,返回0ELT(m,s1,s2,......,sn)返回指定位置的字符串,如果m=1,则返回s1,如果m=2,则返回s2,如果m=n,则返回snFIELD(s,s1,s2,...,sn)返回字符串s在字符串列表中第一次出现的位置FIND_IN_SET(s1,s2)返回字符串s1在字符串s2中出现的位置。其中,字符串s2是一个以逗号分隔的字符串REVERSE(s)返回s反转后的字符串NULLIF(value1,value2)比较两个字符串,如果value1与value2相等,则返回NULL,否则返回value
数学函数

加密与解密函数

函数用法PASSWORD(str)返回字符串str的加密版本,41位长的字符串。加密结果不可逆,常用语用户的密码加密。在mysql8.0中被弃用。MD5(str)返回字符串str的md5加密后的值,也是一种加密方式。若参数为NULL,则会返回NULL。不可逆。SHA(str)从原明文密码str计算并返回加密后的密码字符串,当参数为 NULL 时,返回 NULL。不可逆。ENCODE(value,password_seed)返回使用 password_seed 作为加密密码加密value。mysql8.0后被弃用。DECODE(value,password_seed)返回使用password_seed作为加密密码解密valuemysql 信息函数

函数用法VERSION()返回当前MySQL的版本号CONNECTION_ID()返回当前MySQL服务器的连接idDATABASE(),SCHEMA()返回MySQL命令行当前所在的数据库USER(),CURRENT_USER()、SYSTEM_USER(), SESSION_USER()返回当前连接MySQL的用户名,返回结果格式为 “主机名@用户名”CHARSET(value)返回字符串value自变量的字符集COLLATION(value)返回字符串value的比较规则其他函数

函数用法FORMAT(value,n)返回对数字value进行格式化后的结果数据。n表示 四舍五入 后保留到小数点后n位CONV(value,from,to)将value的值进行不同进制之间的转换INET_ATON(ipvalue)将以点分隔的IP地址转化为一个数字INET_NTOA(value)将数字形式的IP地址转化为以点分隔的IP地址BENCHMARK(n,expr)将表达式expr重复执行n次。用于测试MySQL处理expr表达式所耗费的时间CONVERT(value USING char_code)将value所使用的字符编码修改为char_code分组函数

  1. select 函数名(实参列表) [from 表]
  2. (1) 单行函数
  3.     concat、length、ifnull等
  4. (2) 分组函数
  5.     做统计使用,又称为统计函数、聚合函数、组函数
复制代码
  1. SELECT LENGTH('张三丰hahaha');
  2. SHOW VARIVALE LIKE '%char%'; 查看字符集
复制代码
  1. SELECTV CONCAT(last_name,'_',first_name) 姓名 FROM employees;
复制代码
分组查询

  1. # 截取从指定索引处后面所有字符
  2.     SELECT SUBSTR('李莫愁爱上了路站元',7) out_put;
  3. # 截取从指定所引处指定字符长度的字符
  4.     SELECT SUBSTR('李莫愁爱上了路站元',1,3) out_put;
  5. #案例:姓名中首字符大写,其他字符小写,然后用 _ 拼接,显示出来
  6. SELECT CONTACT(UPPER(SUBSTR(last_name,1,1)),LOWER(SUBSTR(last_name),2)) out_put;
复制代码
  1. SELECT TRIM('a' FROM 'aaaaa张aa翠山aaaaaa') AS out_put;
复制代码
  1. SELECT LPAD('殷素素',10,'*') AS out_put;     //10为总字符数
  2. SELECT LPAD('殷素素',2,'*') AS out_put;     //殷素
复制代码
  1. SELECT RPAD('殷素素',12,'ab') AS out_put;
复制代码
  1. SELECT ROUND(1.65);
  2. SELECT ROUND(1.567,2);         // 1.57
复制代码
连接查询

发生原因:没有有效的连接条件;
如何避免:添加有效的连接条件;
分类:
sql92标准:仅仅支持内连接
    等值
    非等值
    自连接
    也支持一部分外连接(用于 oracle、sqlserver,mysql 不支持)
     sql99标准(推荐):支持内连接+外连接(左外和右外)+交叉连接

sql92 标准

等值连接

语法:
  1. SELECT TRUNCATE(1.6999,1);    //1.6
复制代码
案例:
  1. mod(a,b) = a-a/b*b
复制代码
  1. SELECT NOW();
复制代码
  1. SELECT YEAR(now());
  2. SELECT YEAR('1998-1-1') 年;
复制代码
  1. STR_TO_DATE('9-13-1999','%m-%d-%Y')        1999-09-13
复制代码
  1. DATE_FORMAT('2018/6/6','%Y年%m月%d日')    2018年06月06日
复制代码
  1. SELECT VERSION();
  2. SELECT DATABASE();
  3. SELECT USER();
  4. SELECT password('字符'):返回该字符的密码形式 自动加密
  5. MD5('字符'):返回该字符的md5加密形式
复制代码
非等值连接
  1. if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1;否则返回表达式2
复制代码
  1. SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金,呵呵','有奖金,嘻嘻') 备注
  2. FROM employees;
复制代码
自连接
  1. case 要判断的字段或表达式
  2. when 常量1 then 要显示的值1或语句1;
  3. when 常量2 then 要显示的值2或语句2;
  4. ...
  5. else 要显示的值n或语句n;
  6. end
复制代码
sql99 语法
  1. #案例:要查询员工的工资,要求   
  2. 部门号=30,显示的工资为1.3倍
  3. 部门号=40,显示的工资为1.4倍
  4. 部门号=50,显示的工资为1.5 倍
  5. 其他部门,显示的工资为原工资
  6. SELECT salary 原始工资,department_id,
  7.     CASE department_id
  8.     WHEN 30 THEN salary*1.3
  9.     WHEN 40 THEN salary*1.4
  10.     WHEN 50 THEN salary*1.5
  11.     ELSE salary
  12.     END AS 新工资
  13.     FROM employees;
复制代码
内连接:inner
  1. case
  2. when 条件1 then 要显示的值1或语句1
  3. when 条件2 then 要显示的值2或语句2
  4. ...
  5. else 要显示的值n或语句n
  6. end
复制代码
分类:等值、非等值、自连接
外连接

应用场景:用于查询一个表中有,另一个表中没有的记录;
特点:
如果从表中有和它匹配的,则显示匹配的值;
如果从表中没有和它匹配的,则显示 null
外连接查询结果=内连接结果 + 主表中有而从表中没有的记录;
全外连接,两边都是主表。
  1. ```
  2. SELECT AVG(salary),employee_id FROM employees; 有问题,AVG(salary)只有一行,employee_id有很多行
  3. ```
复制代码
交叉连接:cross
  1.                                                  #执行顺序
  2. SELECT         column,group_function(column)           5
  3. FROM         table                                    1
  4. [WHERE         condition]                                2
  5. GROUP BY     group_by_expression                     3
  6. [HAVING     分组后的筛选]                                4
  7. [ORDER BY     column];                                 6
复制代码
sql99 语法新特性

自然连接

NATURAL JOIN 用来表示自然连接。我们可以把自然连接理解为 SQL92 中的等值连接。它会帮你自动查询两张连接表中所有相同的字段 ,然后进行等值连接 。
  1. 为了更好的理解 grouy by 多个列和聚合函数的应用,我们可以假设在group by执行之后,生成了一个虚拟的中间表。相同的group by字段合并成一行,其余的字段分别写到一个单元格里。
  2. 对于id和number里面的单元格有多个数据的情况,使用聚合函数。聚合函数就是用来输入多个数据,输出一个数据的。
  3. #对name字段进行分组
  4. id    name    number
  5. 1    aa        2
  6. 2            3
  7. 3            4
  8. 4    bb        5
  9. 8            6
复制代码
USING 连接

当我们进行连接的时候,SQL99还支持使用 USING 指定数据表里的 同名字段 进行等值连接。但是只能配合JOIN一起使用。比如:
  1. ```
  2.             数据源            位置                    关键字
  3. 分组前筛选    原始表            group by子句的前面        where
  4. 分组后筛选    分组后的结果集    group by子句的后面         having
  5. ```
复制代码
子查询

含义:出现在其他语句中的 select 语句,称为子查询或内查询;
外部的查询语句,称为主查询或外查询。
外面的语句可以是 insert、update、delete、select 等,一般 select 作为外面语句较多。
分类:


where 或 haing 后面

特点:
<ul>子查询放在小括号内
子查询一般放在条件的右侧
标量子查询,一般搭配着单行操作符使用 > < >= (1)结果    SELECT *    FROM employees    WHERE salary>(        SELECT salary        FROM employees        WHERE last_name = 'Abel'    );#案例2:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资#(1)查询141号员工的job_id    SELECT job_id    FROM employees    WHERE employee_id = 141#(2)查询143号员工的salary    SELECT salary    FROM employees    WHERE employee_id = 143#(3)查询员工的姓名、job_id和工资,要求job_id=(1)并且salary>(2)    SELECT last_name,job_id,salary    FROM employees    WHERE job_id = (        SELECT job_id        FROM employees        WHERE employee_id = 141    ) AND salary > (        SELECT salary        FROM employees        WHERE employee_id = 143    );#案例3:返回公司工资最少的员工的last_name,job_id和salary#(1)查询公司的最低工资    SELECT MIN(salary)    FROM employees;#(2)查询last_name,job_id和salary,要求salary=(1)    SELECT last_name,job_id,salary    FROM employees    WHERE salary = (        SELECT MIN(salary)        FROM employees;    );#案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资#(1)查询50号部门的最低工资    SELECT MIN(salary)    FROM employees    WHERE department_id =50#(2)查询每个部门的最低工资    SELECT MIN(salary),department_id    FROM employees    GROUP BY department_id#(3)在(2)的基础上,满足min(salary)>(1)    SELECT MIN(salary),department_id    FROM employees    GROUP BY department_id    HAVING MIN(salary)>(        SELECT MIN(salary)        FROM employees        WHERE department_id =50    );[/code]非法使用标量子查询:
  1. #案例1:查询每个工种的最高工资
  2.     SELECT MAX(salary),job_id
  3.     FROM employees
  4.     GROUP BY job_id;
  5. #案例2:查询每个位置上的部门个数
  6.     SELECT COUNT(*),location_id
  7.     FROM employees
  8.     GROUP BY location_id;
  9. #案例3:查询邮箱中包含a字符的,每个部门的平均工资
  10.     SELECT AVG(salary),department_id
  11.     FROM employees
  12.     WHERE email LIKE '%a%'
  13.     GROUP BY department_id;
  14. #案例4:查询有奖金的每个领导手下员工的最高工资
  15.     SELECT MAX(salary),manager_id
  16.     FROM employees
  17.     WHERE commission_pct IS NOT NULL
  18.     GROUP BY manager_id;
  19. #案例5:查询哪个部门的员工个数>2
  20. (1) 查询每个部门员工个数
  21.     SELECT COUNT(*),department_id
  22.     FROM employees
  23.     GROUP BY department_id;
  24. (2) 根据(1)的结果进行筛选,查询哪个部门的员工个数>2
  25.     SELECT COUNT(*),department_id
  26.     FROM employees
  27.     GROUP BY department_id
  28.     HAVING COUNT(*)>2;
复制代码
列子查询(多行子查询)

操作符含义IN / NOT IN等于列表中的任意一个ANY | SOME和子查询返回的某一个值比较ALL和子查询返回的所有值比较
  1. #案例:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
  2. (1)查询每个工种有奖金的员工的最高工资
  3.     SELECT MAX(salary),job_id
  4.     FROM employees
  5.     WHERE commission_pct IS NOT NULL
  6.     GROUP BY job_id;
  7. (2)根据(1)结果继续筛选,最高工资>12000
  8.     SELECT MAX(salary),job_id
  9.     FROM employees
  10.     WHERE commission_pct IS NOT NULL
  11.     GROUP BY job_id
  12.     HAVING MAX(salary)>12000;
  13. #案例:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资;
  14. (1)查询每个领导手下的员工最低工资
  15.     SELECT MIN(salary),manager_id
  16.     FROM employees
  17.     GROUP BY manager_id;
  18. (2)添加筛选条件:编号>102
  19.     SELECT MIN(salary),manager_id
  20.     FROM employees
  21.     WHERE manager_id > 102
  22.     GROUP BY manager_id;
  23. (3)添加筛选条件:最低工资>5000
  24.     SELECT MIN(salary),manager_id
  25.     FROM employees
  26.     WHERE manager_id > 102
  27.     GROUP BY manager_id
  28.     HAVING MIN(salary)>5000;
  29.      > 按表达式或函数分组
  30.              > 案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的的有哪些
  31.                  (1)查询每个长度的员工个数
  32.                      SELECT COUNT(*),LENGTH(last_name)
  33.                      FROM employees
  34.                      GROUP BY LENGTH(last_name);
  35.                  (2)添加筛选条件
  36.                      SELECT COUNT(*),LENGTH(last_name)
  37.                      FROM employees
  38.                      GROUP BY LENGTH(last_name)
  39.                      HAVING COUNT(*)>5;
  40.      > 按多个字段分组
  41.          #案例:查询每个部门每个工种的员工的平均工资
  42.              SELECT AVG(salary),department_id,job_id
  43.              FROM employees
  44.              GROUP BY job_id,department_id;
  45.          #添加排序
  46.         #案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
  47.             SELECT AVG(salary),department_id,job_id
  48.              FROM employees
  49.              WHERE department_id IS NOT NULL
  50.              GROUP BY job_id,department_id
  51.              ORDER BY AVG(salary) DESC;
复制代码
exists后面(相关子查询)
  1. SELECT 查询列表
  2. FROM 表1 别名, 表2 别名
  3. WHERE 表1.key = 表2.key
  4. [AND 筛选条件]
  5. [GROUP BY 分组字段]
  6. [HAVING 分组后的筛选]
  7. [ORDER BY 排序字段]
复制代码
  1. #案列1:查询女生名和对应的男生名
  2. SELECT NAME,boyName
  3. FROM boys,beauty
  4. WHERE beauty.boyfriend_id = boys.id;
  5. #案例2:查询员工名和对应的部门名
  6. SELECT last_name,department_name
  7. FROM employees,departments
  8. WHERE employees.`department_id` = departments.`department_id`;
复制代码
子查询经典案例
  1. #案例:查询员工名、工种号、工种名
  2.     SELECT e.last_name,e.job_id,j.job_title     #employees.last_name错误
  3.     FROM employees AS e,jobs j
  4.     WHERE e.`job_id` = j.`job_id`;
复制代码
分页查询

应用查询:当要显示的数据,一页显示不全,需要分页提交 sql 请求。
语法:
  1. #案例:查询有奖金的员工名、部门名
  2.     SELECT last_name,department_name
  3.     FROM employees e,departements d
  4.     WHERE e.`department_id` = d.`department_id`
  5.     AND e.`commission_pct` IS NOT NULL;
  6. #案例2:查询城市名中第二个字符为o的部门名和城市名
  7.     SELECT dapartment_name,city
  8.     FROM departments d,location l
  9.     WHERE d.`location_id` = l.`location_id`
  10.     AND city LIKE `_o%`;
复制代码
特点:
  1. #案例1:查询每个城市的部门个数
  2.     SELECT COUNT(*) 个数,city
  3.     FROM departments d,locations l
  4.     WHERE d.`location_id` = l.`location_id`
  5.     GROUP BY city;
  6. #案例2:查询有奖金的部门的部门名和部门的领导编号和该部门的最低工资
  7.     SELECT department_name,d.`manager_id`,MIN(salary)
  8.     FROM dapartment d,employees e
  9.     WHERE d.`department_id` = e.`department_id`
  10.     AND commission_pct IS NOT NULL
  11.     GROUP BY department_name,d.mamager_id;
复制代码
  1. #案例:查询每个工种的工种名和员工的个数,并且按员工的个数降序
  2.     SELECT job_title,COUNT(*)
  3.     FROM employees e,jobs j
  4.     WHERE e.`job_id` = j.`job_id`
  5.     GROUP BY job_title
  6.     ORDER BY COUNT(*) DESC;
复制代码
union 联合查询

union:将多条查询语句的结果合并成一个结果
语法:
  1. #案列:查询员工名、部门名和所在的城市
  2.     SELECT last_name,department_name,city
  3.     FROM employees e,department d,location l
  4.     WHERE e.`department_id` = d.`department_id`
  5.     AND d.`location_id` = l.`location_id`
  6.     AND city LIKE 's%'
  7.     ORDER BY department_name DESC;
复制代码
应用场景:要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时。
特点:
SELECT 的执行过程

查询的结构
  1. SELECT     查询列表
  2. FROM     表1 别名, 表2 别名
  3. WHERE     非等值的连接条件
  4. [AND     筛选条件]
  5. [GROUP BY 分组字段]
  6. [HAVING 分组后的筛选]
  7. [ORDER BY 排序字段]
复制代码
SELECT 执行顺序
  1. #案例1:查询员工的工资和工资级别
  2.     SELECT salary,grade_level
  3.     FROM employess e,job_grades g
  4.     WHERE salary BETWEEN g.`lowest_sal` AND g.`hightest_sal`
  5.     //AND g.`grade_level` = 'A';
复制代码
在 SELECT 语句执行这些步骤的时候,每个步骤都会产生一个 虚拟表,然后将这个虚拟表传入下一个步骤中作为输入。
SQL 的执行原理

六、DML语言的学习

插入语句

方式一:经典的插入

语法:
  1. #案例:查询员工名和上级的名称
  2. SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
  3. FROM employees e,employees m
  4. WHERE e.manager_id = m.employee_id;
复制代码
特点:

方式二:
  1. SELECT 查询列表
  2. FROM 表1 别名 [连接类型]
  3. JOIN 表2 别名
  4. ON     连接条件
  5. [WHERE 筛选条件]
  6. [GROUP BY 分组]
  7. [HAVING 筛选条件]
  8. [ORDER BY 排序列表]
复制代码
两种方式大pk

  1. SELECT 查询列表
  2. FROM 表1 别名
  3. INNER JOIN 表2 别名
  4. ON 连接条件;
复制代码
  1. #案例1:查询员工名、部门名
  2.     SELECT last_name,department_name
  3.     FROM employees e
  4.     INNER JOIN departments d
  5.     ON e.`department_id` = d.`department_id`;
  6. #案例2:查询员工名字中包含e的员工名和工种名(添加筛选)
  7.     SELECT last_name,job_title
  8.     FROM employees e
  9.     INNER JOIN jobs j
  10.     ON e.`job_id` = j.`job_id`
  11.     WHERE e.`last_name` LIKE '%e%';
  12. #案例3:查询部门个数>3的城市名称和部门个数(添加分组+筛选)
  13. #(1)查询每个城市部门的个数
  14. #(2)在(1)结果上筛选满足条件的
  15.     SELECT city,COUNT(*) 部门个数
  16.     FROM departments d
  17.     INNER JOIN locations l
  18.     ON d.`location_id` = l.`location_id`
  19.     GROUP BY city
  20.     HAING COUNT(*)>3;
  21. #案例4:查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序(添加排序)
  22. #(1)查询每个部门的员工个数
  23.     SELECT COUNT(*),department_name
  24.     FROM employees e
  25.     INNER JOIN departments d
  26.     ON e.`department_id` = d.`department_id`
  27.     GROUP BY department_name;
  28. #(2)在(1)结果上筛选员工个数>3的记录,并排序
  29.     SELECT COUNT(*),department_name
  30.     FROM employees e
  31.     INNER JOIN departments d
  32.     ON e.`department_id` = d.`department_id`
  33.     GROUP BY department_name
  34.     HAVING COUNT(*)>3
  35.     ORDER BY COUNT(*) DESC;
  36. #案例5:查询员工名、部门名、工种名,并按部门名排序
  37.     SELECT last_name,department_name,job_title
  38.     FROM employees e
  39.     INNER JOIN departments d ON e.`department_id` = d.`department_id`
  40.     INNER JOIN jobs j ON e.`job_id`=j.`job_id`
  41.     ODER BY department_name DESC;
复制代码
修改语句

修改单表的记录

语法:
  1. #案例1:查询员工的工资级别
  2.     SELECT salary,grade_level
  3.     FROM employees e
  4.     JOIN job_grade e
  5.     ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;
  6. #案例2:查询工资级别的个数>20的个数,并且按工资级别降序
  7.     SELECT COUNT(*),grade_level
  8.     FROM employees e
  9.     JOIN job_grade e
  10.     ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`
  11.     GROUP BY grade_level
  12.     HAVING COUNT(*)>20
  13.     ORDER BY grade_level DESC;
复制代码
修改多表的记录(补充)

  1. SELECT 查询列表
  2. FROM 表1 别名
  3. CROSS JOIN 表2 别名;
  4. #特点:类似于笛卡尔乘积
复制代码
删除语句

方式一:delete

单表的删除
  1. #sql92中:
  2. SELECT employee_id,last_name,department_name
  3. FROM employees e JOIN departments d
  4. ON e.`department_id` = d.`department_id`
  5. AND e.`manager_id` = d.`manager_id`;
  6. #在sql99中可写成:
  7. SELECT employee_id,last_name,department_name
  8. FROM employees e NATURAL JOIN departments d;
复制代码
多表的删除

  1.     SELECT MIN(salary),department_id
  2.     FROM employees
  3.     GROUP BY department_id
  4.     HAVING MIN(salary)>(
  5.         SELECT salary
  6.         FROM employees
  7.         WHERE department_id =50
  8.     );
复制代码
方式二:truncate (清空)
  1. #案例1:返回 location_id 是 1400 或 1700 的部门中所有员工姓名
  2. #(1)查询location_id是1400或1700的部门编号
  3.     SELECT DISTINCT department_id
  4.     FROM departments
  5.     where location_id IN(1400,1700)
  6. #(2)查询员工姓名,要求部门号是(1)列表中的某一个
  7.     SELECT last_name
  8.     FROM employees
  9.     WHERE deapartment_id IN(
  10.         SELECT DISTINCT department_id
  11.         FROM departments
  12.         where location_id IN(1400,1700)
  13.     );
  14. #案例2:查询其它工种中比job_id为`IT_PROG`工种任一工资低的员工的员工号、姓名、job_id 和 salary
  15. #(1)查询job_id为`IT_PROG`部门任一工资
  16.     SELECT DISTINCT salary
  17.     FROM employees
  18.     WHERE job_id='IT_PROG'
  19. #(2)查询员工号、姓名、job_id以及salary,salary<(1)的任意一个
  20.     SELECT last_name,employee_id,job_id,salary
  21.     FROM employees
  22.     WHERE salary < ANY(
  23.         SELECT DISTINCT salary
  24.         FROM employees
  25.         WHERE job_id='IT_PROG'
  26.     )AND job_id<>'IT_PROG';
  27.     或
  28.     SELECT last_name,employee_id,job_id,salary
  29.     FROM employees
  30.     WHERE salary < (
  31.         SELECT MAX(salary)
  32.         FROM employees
  33.         WHERE job_id='IT_PROG'
  34.     )AND job_id<>'IT_PROG';
复制代码
delete PK truncate (重点)

MySQL8 新特性:计算列

什么叫计算列呢?简单来说就是某一列的值是通过别的列计算得来的。例如,a列值为1、b列值为2,c列不需要手动插入,定义a+b的结果为c的值,那么c就是计算列,是通过别的列计算得来的。
  1. #案例:查询员工编号最小且工资最高的员工信息
  2. #(1)查询最小的员工编号
  3.     SELECT MIN(employee_id)
  4.     FROM employees
  5. #(2)查询最高工资
  6.     SELECT MAX(salary)
  7.     FROM employees
  8. #(3)查询员工信息
  9.     SELECT *
  10.     FROM employees
  11.     WHERE employee_id=(
  12.         SELECT MIN(employee_id)
  13.         FROM employees
  14.     )AND salary=(
  15.         SELECT MAX(salary)
  16.         FROM employees
  17.     );
  18.     SELECT *
  19.     FROM employees
  20.     WHERE (employee_id,salary)=(
  21.         SELECT MIN(employee_id),MAX(salary)
  22.         FROM employees
  23.     );
复制代码
七、DDL语言的学习

标识符命名规则

库的管理
  1. #案例1:查询每个部门的员工个数
  2.     SELECT d.*,(
  3.         SELECT COUNT(*)
  4.         FROM employees
  5.         WHERE e.department_id = d.`department_id`
  6.         ) 个数
  7.     FROM departments d;
  8. #案例2:查询员工号=102的部门名
  9.     SELECT (
  10.         SELECT department_name
  11.         FROM departments d
  12.         INNER JOIN employees e
  13.         ON d.department_id = e.department_id
  14.         WHERE e.employee_id = 102
  15.     ) 部门名;
复制代码
1. 库的创建
  1. #案例1:查询每个部门的平均工资的工资等级
  2. #(1)查询每个部门的平均工资
  3.     SELECT AVG(salary),department_id
  4.     FROM employees
  5.     GROUP BY department_id
  6. #(2)连接(1)的结果集和job_grade表,筛选条件平均工资between lowest_sal and highest_sal
  7.     SELECT ag_dep.*,g.`grade_level`
  8.     FROM(
  9.         SELECT AVG(salary) ag,department_id
  10.         FROM employees
  11.         GROUP BY department_id
  12.     ) ag_dep
  13.     INNER JOIN job_grade g
  14.     ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
  15. #案例2:查询各部门中工资比本部门平均工资高的员工的员工号,姓名和工资
  16. #(1)查询各部门的平均工资
  17.     SELECT AVG(salary),department_id
  18.     FROM employees
  19.     GROUP BY department_id;
  20. #(2)连接(1)结果集和 employees 表,进行筛选
  21.     SELECT employee_id,last_name,salary,e.department_id
  22.     FROM employees e
  23.     INNER JOIN (
  24.         SELECT AVG(salary) ag,department_id
  25.         FROM employees
  26.         GROUP BY department_id;
  27.     )ag_dep
  28.     ON e.department_id = ag_dep.department_id
  29.     WHERE salary > ag_dep.ag;
复制代码
2. 库的修改
  1. 语法:
  2.     exists(完整的查询语句)            问题:exists(NULL)?
  3. 结果:
  4.     1或0
复制代码
3. 库的删除
  1. #案例1:查询有员工的部门名
  2.     SELECT department_name
  3.     FROM departments d
  4.     WHERE EXISTS(
  5.         SELECT *
  6.         FROM employees e
  7.         WHERE e.`department_id`= d.`department_id`
  8.     );
  9. #in
  10.     SELECT department_name
  11.     FROM departments d
  12.     WHERE d.`deparment_id` IN (
  13.         SELECT department_id
  14.         FROM employees
  15.     );
  16. #案例2:查询没有女朋友的男生信息
  17. #in
  18.     SELECT bo.*
  19.     FROM boys bo
  20.     WHERE bo.id NOT IN(
  21.         SELECT boyfriend_id
  22.         FROM beauty
  23.     );
  24. #exists
  25.     SELECT bo.*
  26.     FROM boys bo
  27.     WHERE NOT EXISTS(
  28.         SELECT boyfriend_id
  29.         FROM beauty b
  30.         WHERE bo.id = b.boyfriend_id
  31.     );
复制代码
表的管理
  1. #案例1:查询每个部门的员工个数
  2.     SELECT d.*,(
  3.         SELECT COUNT(*)
  4.         FROM employees
  5.         WHERE e.department_id = d.`department_id`
  6.         ) 个数
  7.     FROM departments d;
  8. #案例2:查询员工号=102的部门名
  9.     SELECT (
  10.         SELECT department_name
  11.         FROM departments d
  12.         INNER JOIN employees e
  13.         ON d.department_id = e.department_id
  14.         WHERE e.employee_id = 102
  15.     ) 部门名;
复制代码
1. 表的创建
  1.     SELECT 查询列表                    7
  2.     FROM 表                          1
  3.     [JOIN type join 表2              2
  4.     ON 连接条件                        3
  5.     WHERE 筛选条件                    4
  6.     GROUP BY 分组字段                5
  7.     HAVING 分组后的筛选               6
  8.     ORDER BY 排序的字段]                8
  9.     LIMIT offset,size;               9
  10.     # offset 要显示条目的起始索引(起始索引从0开始)
  11.     # size 要显示的条目个数
  12. 根据执行顺讯,可以得出:
  13. 1. order by 后面的列必须是在 select 后面存在的;
  14. 2. select、having 或 order by 后面存在的非聚合列必须全部在 group by 中存在。
复制代码
2. 表的修改
  1. #要显示的页数page    每页的条目数size
  2.     SELECT 查询列表
  3.     FROM 表
  4.     LIMIET (page-1)*size,size;
复制代码
3. 表的删除
  1. #案例1:查询前五条员工信息
  2.     SELECT * FROM employees LIMIT 0,5;
  3.     或
  4.     SELECT * FROM employees LIMIT 5;
  5. #案例2:查询第11条——第25条
  6.     SELECT * FROM employees LIMIT 10,15;
复制代码
4. 表的复制
  1. 查询语句1
  2. union [all]
  3. 查询语句2
  4. union [all]
  5. ......
  6. #案例:查询部门编号>90或邮箱包含a的员工信息
  7.     SELECT * FROM employees WHERE email LIKE '%a%'
  8.     UNION
  9.     SELECT * FROM employees WHERE department_id >90;  
复制代码
常见数据类型介绍

类型类型举例整数类型TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT浮点类型FLOAT、DOUBLE定点数类型DECIMAL位类型BIT日期时间类型YEAR、TIME、DATE、DATETIME、TIMESTAMP文本字符串类型CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT枚举类型ENUM集合类型SET二进制字符串类型BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOBJSON类型JSON对象、JSON数组空间数据类型单值:GEOMETRY、POINT、LINESTRING、POLYGON;集合:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、 GEOMETRYCOLLECTION其中,常用的几类类型介绍如下:
[table][tr]数据类型描述[/tr][tr][td]INT[/td][td]从-231到231-1的整型数据。存储大小为 4个字节[/td][/tr][tr][td]CHAR(size)[/td][td]定长字符数据。若未指定,默认为1个字符,最大长度255[/td][/tr][tr][td]VARCHAR(size)[/td][td]可变长字符数据,根据字符串实际长度保存,必须指定长度[/td][/tr][tr][td]FLOAT(M,D)[/td][td]单精度,占用4个字节,M=整数位+小数位,D=小数位。 D




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4