当前位置:   article > 正文

MySQL学习笔记(一)_mysql风哥学习笔记

mysql风哥学习笔记

MySQL学习笔记(一)

(自B站尚硅谷视频以及明日科技《MySQL从入门到精通》)

文章目录

数据库基础

数据库相关概念

  1. DB:数据库,保存一组有组织的数据的容器
  2. DBMS:数据库管理系统,数据库是通过DBMS创建和操作的容器
  3. SQL:结构化查询语言
  4. DDL:data define language 数据定义语言。
  5. TCL:Transaction Control Language 事务控制语言。
  6. 事务的ACID 属性:
    1. 原子性(Atomicity):不可分隔的工作单位,要么都执行,要么都不执行。
    2. 一致性(Consistency):一个一致性状态到另个状态
    3. 隔离性(Isolation):不能被其他事务干扰。
    4. 持久性(Durability):一旦提交了,对数据库的改变是永久性的。

数据库连接

启动

计算机管理 —> 服务与应用程序 --> 服务 --> MySQL (启动)

或者在控制台中输入如下命令(以管理员权限运行)

net start mysql     #(关闭服务为 net stop mysql)?
  • 1
登录
mysql -h主机名 -P端口号 -u用户名 -p密码
  • 1
退出
EXIT    |   QUIT
  • 1
修改密码
mysqladmin -uroot -p原密码 password d新密码
  • 1

第4章 数据库管理

4.1创建数据库
CREATE DATABASE 库名; 
  • 1
CREATE SCHEMA 库名; 
  • 1
创建指定字符集的数据库
CREATE DATABASE 库名
CHARACTER SET = GBK;
  • 1
  • 2
创建数据库前判断是否存在同名数据库
CREATE DATABASE IF NOT EXISTS 库名;
  • 1
4.2 查看数据库
SHOW DATABASES; #查看所有数据库
SELECT DATABASE;#查看当前所在库
SHOW TABLES;#查看当前库的所有表
SHOW TABLES FROM 库名;#查看其他库的所有表
DESC 表名;#查看当前库的单表结构
  • 1
  • 2
  • 3
  • 4
  • 5
4.3选择数据库(作为默认数据库)
use 库名;
  • 1
4.4修改数据库
ALTER {DATABASE | SCHEMA} [库名]
[DEFAULT] CHARACTER SET [=] 字符集
| [DEFAULT] COLLATER [=] 校对规则名称
  • 1
  • 2
  • 3
参数说明
{DATABASES| SCHEMAS}表示有一个必选项,这两个任选一个,皆可。
[数据库名]可选项,若无则修改当前(默认)的数据库
DEFAULT可选项,表示指定默认值
CHARACTER SET [=] 字符集可选项,用于指定字符集,若无则使用MySQL默认的字符集
COLLATE [=] 校对规则名称可选项,指定校对规则,如,utf8_bin,gbk_chinese_ci

ps:使用ALTER [DATABASES|SCHEMA] 时,用户需要有管理员权限。

4.5删除数据库
DROP DATABASE 库名;
  • 1

第5章 表结构管理

5.1创建表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 数据表名 
[create_definition,...][table_options][select_statement]; 
  • 1
  • 2
关键字说明
TEMPOARY如果使用该关键字,表示创建一个临时表
IF NOT EXISTS该关键字用于避免表存在时MySQL报告的错误
create_definition字段参数列表
table_options表的一些特性参数
select_statementSELECT语句描述部分,用它可以快速建表

字段参数列表中,每一列具体定义如下:

字段名 type[NOT NULL|NULL] [DEFAULT default_value] [AUTO_INCREMENT]
	[PRIMARY KEY][reference_definition]
  • 1
  • 2
参数(部分)说明
type字段类型
NOT NULL是否允许为空,系统默认允许
DEFAULT default_value默认值
AUTO_INCREMENT是否自动编号,每个表中只能有一个AUTO_INCREMEN列,且必须被索引
PRIMARY KEY表示是否为主键,一个表中只能有一个。若没有,而某些应用程序需要主键,则MySQL将返回第一个没有任何NULL列的UNIQUE键作为PRIMARY KEY
reference_definition注释
5.2修改表结构
修改表字段

ALTER TABLE 表名 CHANGE [column] 旧字段名 新字段名 新数据类型;

修改约束条件
修改表其他选项

存储引擎

字符集

自增类型字段初始值

修改表名(RENAME)
5.3删除表
DROP TABLE IF EXISTS 数据表名;
  • 1
5.4 定义约束

(六大约束:详见DDL语言学习中的常见约束)

5.5 修改数据表
  1. insert into table_name(id,name) values(1,‘rose’); //添加

  2. update table_name set name='lilei ’ where id=1; //修改

  3. SELECT DISTINCT department _id FROM employee;//查询,可用逗号分隔开来多个字段

    • 查询常量值
      • SELECT 100;
      • SELECT “john”;
    • 查询表达式
      • SELECT 100%98;
    • 查询函数
      • SELECT VERSION();
  4. concat(st1,str2,…) as name FROM database;

  5. 起别名:AS

    • SELECT 100 %98 AS 结果;
    • SELECT last_name AS 姓,first_name AS 名 FROM employees;
    • SELECT last_name 姓;
    • SELECT salary AS “out put” FROM employees;
  6. 去重 :DISTINCT(搭配单个字符使用)

    SELECT department_id FROM employee;(含有重复)

    SELECT DISTINCT department_id FROM employee;(不含有重复)

  7. 连接 CONCAT

    SELECT CONCAT(‘A’,“B”,“C”) AS 结果;

  8. 判断非空:IFNULL

    SELECT IFNULL(commission_pct,0)

  9. 条件查询 WHERE

    SELECT … FROM … WHERE …;

    • 简单条件运算符: > < = != <> >= <=

    • 逻辑运算符: && || !and or not (连接条件表达式)

    • 模糊查询: (like) (between and) (IN) (is null) (NOT LIKE也阔以)

      SELECT 
      	last_name,
      	salary,
      	commission_pct
      FROM
      	employees
      WHERE
      	salary>=10000 AND salary<=20000
      #   salary BETWEEN 10000 AND 20000  不可颠倒顺序,左侧必为小,右侧必为大。	
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      SELECT 
      	*
      FROM 
      	employees
      WHERE
      	last_name LIKE '%a%';// “%”是通配符,寻找名字包含a的名字 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 通配符:

        • % : 包含任意多个字符,包含0个字符
      • _ : 任意单个字符

        • \ : 转义符号 \ _ 代表 _ 符号
      • 任意转义 ESCAPE ‘$’

  10. 排序查询:ORDER BY

         SELECT 查询列表
         FROM 表
         [WHERE 筛选条件]
         ORDER BY 排序列表 [ASC|DESC];
    
    • 1
    • 2
    • 3
    • 4
  • ASC代表升序,DESC代表降序。如果不选,则默认为ASC。(所以只记住DESC就好啦!

第 6 章 存储引擎及数据类型

6.1 MySQL存储引擎
  • 概念:MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。这些不同的技术以及配套的相关功能在 MySQL中被称作存储引擎(也称作表类型)。

  • 对比:Oracle 和SQL Server 等数据库只有一种存储引擎,而MySQL数据库提供了多种存储引擎。

  • 查询

# 查询(支持的)全部存储引擎(9个) //真的是支持的吗?support类型可见
SHOW ENGINES;
SHOW ENGINES\g
SHOW ENGINES\G    // \G 可让结果更美观 (下图)
  • 1
  • 2
  • 3
  • 4

(当前版本: 8.0.23版本)

mysql8.0存储引擎

#查询当前MySQL服务器默认的存储引擎
SHOW VARIABLES LIKE 'storage_engine%'; //8.0.23版本查询之后没结果  可能是老版的吧
SHOW VARIABLES LIKE '%storage_engine%'; //查询之后有结果
  • 1
  • 2
  • 3

在这里插入图片描述

InnoDB 存储引擎
  • 优势:提供了良好的事务管理,崩溃修复能力和并发控制;
  • 缺点:其读写效率稍差,占用的数据空间相对较大。
  • 理想引擎:
    1. 更新密集的表
    2. 事务
    3. 自动灾难恢复
MyISAM存储引擎
  • 优势:占用空间小,处理速度快;
  • 缺点:不支持事务的完整性和并发性。
MEMORY存储引擎
  • 概述:速度快,存储在内存中,数据暂时性以及相对无关。

太难了,还是看别人博客吧 (点击左侧链接打开博客)

6.2 MySQL数据类型
数字类型(整数+浮点数+定点型)
数据类型(整数)取值范围(有符号值)取值范围(无符号值)说明单位
TINYINT-127 ~ 1270 ~ 255最小的整数1字节
BIT-127 ~ 1270 ~ 255最小的整数1字节
BOOL-127 ~ 1270 ~ 255最小的整数1字节
SMALLINT-32768 ~ 327670 ~ 65535小型整数2字节
MEDIUMINT-8388608 ~ 83886070 ~ 16777215 (满足百万)中型整数3字节
INT-2147683648 ~ 21476836470 ~ 4294967295 (满足亿)标准整数4字节
BIGINT-9223372036854775808 ~0 ~ 1844… (满足19位)大整数8字节
数据类型(浮点数)取值范围说明单位
FLOAT+(-)3.402823466E+38单精度浮点数8或4字节
DOUBLE+(-)1.7976931348623157E+308双精度浮点数8字节
DECIMAL可变一般整数自定义长度
数据类型(定点型) 两个都一样字节
DEC (M,D)M+2
decimalM+2

D 代表小数点后保留D位小数,四舍五入地保留

M代表整数+小数位数 ,

若DECIMAL (5,2) 插入 1523.4 定点数会报错

  • 默认精度(10,0)

  • 定点型的精确度较高,如果要求插入的数据精度较高可以使用。

原则:所选择的类型越简单越好,能保存数值的类型越小越好。

字符串类型(普通+可变+特殊)
  1. 普通的文本字符串类型(还有bit , binary ,varbinary)
类型取值范围说明
[national] char (M) [binary|ASCII|unicode]0 ~ 255 个字符固定长度为M(效率高)
[national] varchar (M) [binary]0 ~ 255 个字符长度可变,其余同char(M) (省空间)
参数说明
national指定应该使用的默认字符集
binary指定数据是否区分大小写
ASCII指定使用latin1字符集
unicode指定使用UCS字符集
  1. TEXT 和 BLOB 类型。大小可变,TEXT 适合存储长文本, BLOB 适合存储二进制数据,支持任何数据 ,如文本,图像和声音等。

从小到大依次为: TINYTEXT (8次方), TEXT(16次方) , MEDIUMTEXT (24次方), LONGTEXT(32次方) 。 (BLOB 类似)

  1. 特殊类型SET 和 ENUM
类型最大值说明
Enum(“value1”,“value2”,…)65535容纳所列值之一或者NULL
Set(“value1”,“value2”,…)64可以容纳一组值或者NULL
  • ENUM 枚举 ‘a’ 时 , 若插入 其他的字符,则显示空,若插入 ‘A’,则显示’a’.

  • SET 当作一个集合 ,插入时

INSERT INTO TABLE tab_set VALUES('a,b,c');
  • 1
日期和时间数据类型
类型取值范围(最小)取值范围(最大)说明字节
DATE1000-01-019999-12-31格式:YYYY-MM-DD4
TIME-838:58:59835:59:59格式:HH:MM:SS3
DATETIME1000-01-01 00:00:009999-12-31 23:59:59格式同理8
TIMESTAMP1970-01-01 00:00:002037年某个时间显示使用格式取决于M值4
YEAR19012155年份可指定两位数或者四位数1

ps:

  • MySQL中,日期顺序按照 标准的ANSISQL格式进行输出。

  • timestamp(时间戳)跟实际的时区有关,且与当前的MySQL有关。

  • 展示时区:SHOW VARIABLES LIKE ‘time_zone’;

  • SET time_zone = ‘+9:00’;

如何设置无符号还是有符号
CREATE TABLE tab_int(
t1 INT   # 有符号 
t2 INT UNSIGNED  # 无符号
);
  • 1
  • 2
  • 3
  • 4
  • 老版本 插入超出范围的值 , 插入的是临界值

    8.0 版本 直接报错

  • 默认的长度是7 INT(7) 代表int类型默认的宽度

  • INT(7) ZEROFILL 用0填充直到宽度。

第 7 章 表记录的更新操作 (DML ----数据操作语言)

7.1 插入表记录
使用INSERT…VALUES语句插入新纪录

最常用的语法格式:

INSERT [LOW_PRIORITY|DELAYED|HIGH_PRIORITY][IGNORE]
	[INTO] 数据表名 [(字段名,...)]
	VALUES({值|DEFAULT},...),(...),...
	[ON DUPLICATE KEY UPDATE 字段名 = 表达式,...]
  • 1
  • 2
  • 3
  • 4

参数说明如下:

参数说明
[LOW_PRIORITY|DELAYED|HIGH_PRIORITY]优先级参数
[IGNORE]出现的错误当作警告处理
[INTO] 数据表名指定被操作的数据表
[(字段名,…)]不指定则默认所有列插入数据,否则表示向数据表的指定列插入数据
VALUES({值|DEFAULT},…),(…),…指定插入的数据值以及明确指定的默认值
[ON DUPLICATE KEY UPDATE 字段名 = 表达式,…]插入行时,如果导致UNIQUE KEY 或者PRIMARY KEY出现重复值,则根据UPDATE后面的语句修改原有数据
插入多条记录

使用INSERT … VALUES 语句还可以一次性插入多条记录

INSERT INTO tb_manager(name,PWD)
VALUES ('admin','111'),
('hyy','111'),
('mingrisoft','111');
  • 1
  • 2
  • 3
  • 4
使用INSERT… SELECT语句插入结果集

MySQL中,支持将查询的结果插入到指定的数据表中。

INSERT [LOW_PRIORITY|HIGH_PRIORITY][IGNORE]
	[INTO] 数据表名 [(字段名,...)]
	SELECT ...
	[ON DUPLICATE KEY UNIQUE 字段名 = 表达式]
  • 1
  • 2
  • 3
  • 4

需要注意的是:SELECT 子句返回的结果集中的字段数,字段类型必须与目标数据表完全一致。

7.2 修改表记录
使用REPLACE语句覆盖主键约束记录
REPLACE INTO 表名 [(字段列表)] VALUES (值列表);
#或者使用SELECT语句 替换 VALUES 部分 
  • 1
  • 2
使用UPDATE 更新表记录
UPDATE 数据表名 SET column_name = new_value1 ,....WHERE 条件表达式;
#更新时要保证WHERE子句正确性,否则破坏所有改变的数据
  • 1
  • 2
7.3 删除表记录
使用DELETE 语句删除表记录
DELETE FROM 数据表名 WHERE 条件;
  • 1
使用TRUNCATE 清空表记录

删除所有的行不必使用DELETE 语句

TRUNCATE [TABLE]数据表名;
  • 1

对比:

  • 对于参与了索引和视图的表不能使用该语句来删除,而应该使用DELETE语句。
  • 使用该语句后,表中的AUTO_INCREMENT计数器将重新设置为初始值。
  • 该语句操作比DELETE操作使用的系统和事务日志资源少。

第8章 表记录的检索

8.1基本查询语句
SELECT [ALL | DISTINCT] 查询列表
FROM 表1
[INNER | NATURAL | LEFT | RIGHT ] JOIN 表2  ON 连接条件
WHERE 筛选条件
GROUP BY 分组字段   HAVING 分组后的筛选
ORDER BY 排序的字段 [DESC | ASC]
LIMIT offset,size;    #  要显示条目的起始索引,从0开始和条目个数。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
8.2 分组查询(GROUP BY)
  • 语法:
​	SELECT 分组函数,列(要求出现在GROUP BY的后面)
​	FROM 表
​	[WHERE 筛选条件]
​	GROUP BY 分组的列表
​	[HAVING 分组后的筛选]
​	[ORDER BY 子句]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 注意:

    查询列表比较特殊,要求是分组函数和GROUP BY后出现的字段。

  • 特点:

    1. 分组查询中的筛选条件分为两类

      关键字数据源位置
      分组前筛选WHERE原始表GROUP BY 子句的前面
      分组后筛选HAVING分组后的结果集GROUP BY子句的后面

      ①分组函数做条件肯定是放在HAVING子句中。

      ②能用分组前筛选的,就优先考虑分组前筛选(性能问题)。

8.3 聚合函数查询

分组函数

功能:用作统计使用,又称为聚合函数或统计函数或组函数

SUM() 求和
AVG() 平均值
MAX() 最大
MIN() 最小
COUNT() 计算个数
聚合函数小结
  1. SUM,AVG 一般处理数值型

    MAX,MIN,COUNT 可以处理任何类型

    SUM(字符型) 结果为0 SUM (日期类型) 结果不行

  2. 分组函数都可以忽略NULL值。包括个数。比如AVG()十行非空 除 十行

  3. 可以和 DISTINCT 搭配,满足去重运算。

  4. count函数的详细介绍(4种重载)

    • SELECT COUNT(salary) FROM employees; //统计该字段非空值的个数
    • SELECT COUNT(*) FROM employees; // 统计行数,
    • SELECT COUNT(常量值) FROM employees // 等价于加了一列常量值,可以统计行数
    • MYISAM存储引擎下, COUNT(*)效率高 (以前)
    • INNODB存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些。(现在)
  5. 和分组函数一同查询的字段有限制

8.4连接查询(多表查询)

含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

笛卡尔乘积现象:表1:m行,表2:n行,结果=m*n行

发生原因:没有有效的连接条件

如何避免:添加有效的连接条件

分类

按年代分 = { s q l 92 标准 :  仅仅支持内连接 s q l 99 标准 【推荐】:  支持内连接 + 外连接(左外和右外) + 交叉连接 按年代分=\left\{

sql92 sql99 ++
\right. 按年代分={sql92标准sql99标准【推荐】: 仅仅支持内连接 支持内连接+外连接(左外和右外)+交叉连接

按功能分类 = { 内连接 { 等值连接 非等值连接 自连接 外连接 { 左外连接 右外连接 全外连接 交叉连接 按功能分类=\left\{

\begin{aligned} 内连接 \left\{ \begin{aligned} 等值连接\\非等值连接\\自连接 \end{aligned}
\right. \\ 外连接 \left\{
\right. \\ 交叉连接\\ \end{aligned} \right. 按功能分类= 内连接 等值连接非等值连接自连接外连接 左外连接右外连接全外连接交叉连接

内连接查询

最普遍最匀称的,包括相等连接和自然连接。使用等号运算符根据每个表共有的列的值匹配。

结果集只包含参加连接的表中与指定字段相符的行。

外连接查询

使用OUTER JOIN关键字将两个表连接起来

结果集不仅包含符合连接条件的行数据,还包括左表(左外连接),右表(右外连接)或两边连接表(全外连接)的所有数据行。

语法格式如下:

SELECT 字段名称 FROM 表名1 LEFT|RIGHT JOIN 表名2 ON 表名1.字段名1=表名2.属性名2;
  • 1
sql92标准
  1. 等值连接 (=)

    ①多表等值连接的结果为多表的交集部分

    ②n表连接,至少需要n-1个连接条件

    ③多表的顺序没有要求

    ④一般需要为表起别名

    ⑤可以搭配前面介绍的所有子句使用,比如排序,分组,筛选

  2. 非等值连接(BETWEEN …AND …)

  3. 自连接

    自己和自己连接

  4. 也支持一部分外连接(用于oracle,sqlserver。MySQL 不支持)

sql99标准(推荐)
  1. 内连接 (INNER)
    1. 等值连接
    2. 非等值
    3. 自连接
  2. 外连接
    1. 左外 LEFT OUTER
    2. 右外 RIGHT OUTER
    3. 全外(MySQL不支持) FULL OUTER
  3. 交叉连接 CROSS

语法:

SELECT 查询列表
FROM 表1 别名 
[连接类型] JION 表2 别名 ON 连接条件  //此处格式可重复多次(如果有三个及以上的表) 
[WHERE 筛选条件] 
[GROUP BY 分组]
[HAVING 筛选条件]
[ORDER BY 排序条件]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

内连接特点:

  • 添加排序,分组,筛选
  • INNER 可以省略
  • 筛选条件可以放在WHERE 后面,连接条件放在ON后面,提高分离性,便于阅读
  • INNER JOIN连接和SQL92语法中的等值连接效果是一样的,都是查询多表的交集。

外连接特点:LEFT| RIGHT | FULL OUTER JION

  • 外连接的查询结果为主表中的所有记录。如果从表中有和它匹配的,则显示匹配的值,如果从表中没有和它匹配的,则显示NULL。
  • 外连接查询结果 = 内连接结果 + 主表中有而从表中没有的记录
  • 左外连接, left jion 左边的是主表 (右外同理)
  • 全外连接 = 内连接的结果 + 表1有表2没有 + 表2有表1没有

交叉连接特点:CROSS JION

  • 笛卡尔乘积;
对比

功能: SQL99支持的较多

8.5子查询(套娃)

含义:出现在其他语句中的SELECT 语句,称为子查询或内查询

内部嵌套其他SELECT语句的查询,称为外查询或主查询。

  • 分类:(B站尚硅谷分法)

    1. 按子查询出现的位置:
    • select后面(仅仅支持标量子查询)
    • from后面(支持表子查询)
    • where或having后面(支持标量子查询,列子查询,行子查询)
    • exists后面:相关子查询 (支持所有)
    1. 按结果集的行列数不同:
    • 标量子查询(结果集一行一列)
    • 列子查询(一列多行)
    • 行子查询(一行多列)
    • 表子查询(多行多列)

相关操作符:比较运算符,IN,EXISTS,ANY,ALL。

操作符(多行比较操作符)含义
IN | NOT IN等于列表中的任意一个
ANY | SOME和子查询返回的某一个值比较
ALL和子查询返回的所有值比较

可以放在

  • WHERE |HAVING 后面
  • SELECT 后面
  • FROM 后面 (必须起别名)
  • EXISTS (相关子查询) 判断内部查询是否存在
8.6 联合查询(UNION)

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

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

语法:

查询语句1:
union
查询语句2
union
...
  • 1
  • 2
  • 3
  • 4
  • 5

特点:

  1. 要求多条查询语句列数一致
  2. 类型与顺序最好一致(不一致不报错,但是表内容不对)
  3. union关键字默认去重,如果使用union all 可以包含重复项。
8.7 定义表和字段的别名(AS)

select 字段 as ‘xx’,
from 表 as ‘yy’

8.8 分页查询 (LIMIT)

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

语法:

SELECT 查询列表
FROM 表
[JOIN TYPE JOIN 表2
ON 连接条件
WHERE 筛选条件
GROUP BY 分组字段
HAVING 分组后的筛选
ORDER BY 排序的字段]
LIMIT offset,size; // 要显示条目的起始索引,从0开始和条目个数。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

特点:

  1. LIMIT 语句放在最后,也是在最后执行。
  2. 模拟应用:

要显示的页数 page , 每页的条目数 size

SELECT 查询列表
FROM 表
LIMIT (page-1)*size , size;
  • 1
  • 2
  • 3
8.9 小结

现有的存储引擎对子查询的优化没多表连接的那么好,所以能使用多表连接就尽量使用多表查询。

未整理

常见函数:

功能:类似于java 的方法,将一组逻辑语句封装在方法体内,对外暴露方法名。

好处:提高重用性和隐藏实现细节

调用: SELECT 函数名(实参列表);

  1. 单行函数
  2. 分组函数 (做统计使用,又称统计函数,组函数。)
单行函数
字符函数
  1. LENGTH 获取参数值的字节个数
    • SELECT LENGTH(“JOHN”); -> 4
    • SELECT LENGTH(“张三丰”); ->9
  2. concat 拼接字符串
    • SELECT CONCAT (‘a’,‘b’,‘c’) ;
  3. upper,lower 变成大写或小写
    • UPPER()
    • LOWER()
  4. substr() 截取字符串4个重载
    • 索引从1开始
    • SELECT SUBSTR(‘李莫愁爱上了陆展元’,7) ouput; -> 陆展元
    • substr(str,startIndex,length);
  5. instr() 返回子串在字符串中的起始索引
    • 找不到就返回0
  6. trim() 去前后空格
    • SELECT TRIM(’ A ') AS output; -> A
    • SELECT TRIM(‘a’ FROM ‘aaaa张aaa三丰aaa’); ->张aaa三丰
  7. lpad(str,len,padstr); 用panstr左填充字符个数为len,
    • rpad(…)右填充
  8. replace(str,str1,str2); 在str中用str2替换str1;
数学函数
  1. round(x) x四舍五入

    round(x,d) 小数点后保留d

  2. ceil (x) 向上取整,返回>=该参数的最小整数

  3. floor(x)向下取整,返回<=该参数的最大整数

  4. truncate(x,d) 截断

    SELECT TRUNCATE(1.6999,1) -> 1.6

  5. mod(x,y) 取余 == % == a - a / b * b

  6. rand 获取随机数,返回0-1之间的小数

日期函数
  1. now() 返回当前系统日期+时间

  2. curdate() 返回当前系统日期

  3. curtime() 返回当前时间

  4. year(now()) 获取指定部分 // MONTH MONTHNAME

    year(‘1998-1-1’)

    year(hiredate) 年 FROM employees;

  5. str_to_date(str,format) //转化格式

    str_to_date(‘9-13-1999’,‘%m-%d-&Y’)

    格式符功能
    %Y四位的年份
    %y2位的年份
    %m月份(01,02…11,12)
    %c月份(1,2…11,12)
    %d日(01,02,…)
    %H小时(24小时制)
    %h小时(12小时制)
    %i分钟(00,01…59)
    %s秒(00,01…59)
  6. date_format(str,format) 格式日期

    将日期转化成字符

    SELECT DATE_FORMAT(NOW(),‘%y年%m月%d日’)AS out_put;、

  7. DATEDIFF(date1,date2)//date1 - date2 返回两个日期相差的天数

其他函数

VERSION(); //查看版本

DATABASE() //打开当前打开的库

USER() //当前用户

PASSWORD(‘字符’); //返回字符加密 – 已被弃用?

MD5(‘字符’) //返回字符的MD5的加密形式

流程控制函数
  • IF ELSE

  • CASE

    • 用法一:(等值判断)
CASE 要判断的字段或者表达式
  WHEN 常量1 then 显示的值为1
...
  ELSE  要显示的值或语句
END
  • 1
  • 2
  • 3
  • 4
  • 5
  • 用法二:(区间判断)
  CASE 
  WHEN 条件1 THEN 要显示的值1或语句1
  WHEN 条件2 THEN 要显示的值2或语句2
  ...
  ELSE 要显示的值n或语句n
  END
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
查看版本

MySQL :select version();

控制台:mysql --version 或者 mysql -V

DML语言

数据操作语言:

插入: insert 修改: update 删除: delete

插入语句

语法1:

INSERT INTO 表名(列名,...)  VALUES(值1,...);
  • 1
  • 列数和值需一致,非空的必须填上。
  • 字段的个数和顺序不一定和原表的一样,但是保证值的字段一一对应。
  • 如果要插入NULL,可以省略字段或者将值改为NULL。

语法2:

INSERT INTO 表名
SET 列名 = 值 , 列名 = 值 , ...
  • 1
  • 2

区别:

  1. 方式一支持插入多行,方式二不支持。
  2. 方式一支持子查询,方式二不支持。

修改语句

修改单表语法:

UPDATE 表名
SET 列 = 新值, 列 = 新值 , ...
WHERE 筛选条件;
  • 1
  • 2
  • 3

修改多表语法:

#SQL92语法
UPDATE 表1 别名,表2 别名
SET 列 = 值,...
WHERE 连接条件
AND 筛选条件;
#99语法
UPDATE 表1 别名
INNER | LEFT | RIGHT JOIN 表2 别名
ON 连接条件
SET 列 = 值 ,... 
WHERE 筛选条件;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

删除语句

方式一: delete

单表:

DELETE FROM 表名 WHERE 筛选条件 [LIMIT 条目数];
  • 1

多表:(sql 99)

DELETE 表1别名 , 表2别名
FROM 表1 别名
INNER| LEFT | RIGHT JOIN 表2 别名 ON 连接条件
WHERE 筛选条件;
  • 1
  • 2
  • 3
  • 4
方式二:truncate

不允许 + where

直接清空 表

两者区别:
  • truncate 效率稍高。
  • delete 可以添加筛选条件,truncate不可以。
  • delete 删除表 后, 自增列从断点开始,truncate 删除后, 自增列从1开始。
  • truncate删除后没有返回值, delete 有返回值。
  • truncate 删除后不能回滚 , delete 删除后可以回滚。

DDL

库的管理

1.库的创建

CREATE DATABASE [IF NOT EXISTS ] 库名;

2.库的修改

RENAME DATABASES 库名 TO 新库名; //废弃

  • 更改库的字符集:

ALTER DATABASE 库名 CHARACTER SET gbk;

3.库的删除

DROP DATABASE [IF EXISTS] 库名;

表的管理

1.表的创建

create table 表名(

​ 列名 列类型 【约束】。。。

);

2.表的修改
1.修改列名 change

ALTER TABLE book CHANGE COLUMN 列名1 列名2 类型;

2.修改列的类型或约束 modify
ALTER TABLE book MODIFY COLUMN puhdate timestamp;
  • 1
3.添加新列 add
ALTER TABLE author ADD COLUMN annual DOUBLE ;
  • 1
4.删除列 drop
ALTER TABLE author DROP COLUMN annual;
  • 1
5.修改表名 rename
ALTER TABLE author RENAME TO book_author;
  • 1

3.表的删除

DROP TABLE IF EXISTS book_author;
  • 1

通用写法:

DROP DATABASE IF EXISTS old_database
CREATE DATABASE new_database;

DROP TABLE IF EXISTS old_table 
CREATE TABLE new_table;
  • 1
  • 2
  • 3
  • 4
  • 5

4.表的复制

  1. 仅仅复制表的结构
CREATE TABLE copy_table LIKE author;
  • 1
  1. 复制表的结构+数据
CREATE TABLE copy2
SELECT * FROM author;
  • 1
  • 2
  1. 只复制部分数据(加条件WHERE即可)
  2. 只复制部分结构
CREATE TABLE copy3
SELECT id,au_name
FROM author
WHERE 1=2; # 恒不成立  或者  0   
  • 1
  • 2
  • 3
  • 4

常见约束

含义:一种限制,用于限制表中的数据,为了保证表中数据的准确和可靠性。

分类:六大约束

  1. NOT NULL: 非空,用于保证该字段的值不能为空

  2. DEFAULT : 默认,用于保证该字段有默认值

  3. PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空。

  4. UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空。

  5. CHECK:检查约束【MySQL不支持,好像8.0支持】

  6. FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。

    在从表添加外键约束,用于引用主表中的某列的值。


添加约束的时机:

  1. 创建表时
  2. 修改表时

约束的添加分类:

  1. 列级约束
    • 六大约束语法上都支持。
  2. 表级约束
    • 除了非空,默认,其他的都支持。
CREATE TABLE 表名(
	字段名 字段类型 约束
	字段名 字段类型
	表级约束
)
  • 1
  • 2
  • 3
  • 4
  • 5
主键和唯一的大对比
保证唯一性是否允许为空数量
主键×最多一个
唯一可以多个

联合主键: PRIMARY KEY (id,stuname)

  • 只要有一个不同的就行,完全相同则视为重复。
外键
  • 要求在从表设置外键关系
  • 从白哦的外键列的类型和竹柏哦的关联列的类型要求一致或兼容,名称无要求
  • 主表的关联列必须是一个key。(一般是主键或唯一)
  • 插入数据时,先插入主表,再插入从表。
  • 删除数据时,先删除从表,再删除主表。
#语法:
references bookType(id)
#或者
FOREIGN KEY(btypeId) references bookType(id)
  • 1
  • 2
  • 3
  • 4
1.级联删除:

添加外键时在后面增加一个 ON DELETE CASCADE;

2.级联置空:

后面增加 ON DELETE NULL;

修改表时添加约束
  1. 添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
  • 1
  1. 添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
  • 1
  1. 添加主键
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#列级约束
  • 1
  • 2
ALTER TABLE stuinfo ADD PRIMARY KEY(id);#表级约束
  • 1
  1. 添加唯一
ALTER TABLE suinfo MODIFY COLUMN seat INT UNIQUE;
#列级约束
  • 1
  • 2
ALTER TABLE stuinfo ADD UNIQUE(seat);#表级约束
  • 1
修改表时删除约束
  1. 删除非空等等
ALTER TABLE 表名 MODIFY COLUMN 列名 (啥都不写);
  • 1
  1. 删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;
  • 1
标识列(自增长列)AUTO_INCREMENT
  1. 创建表时在列后面 加上关键字即可。但是要求是一个key。至多一个自增长列。
  2. 插入数据时可以使用NULL 代替,无需考虑当前值。
  3. 不从1开始:

SHOW VARIABLE_NAME LIKE ‘%auto_increment%’;

通过 SET … = X; 来设置步长。

  1. 标识列的类型只能是数值型,可以为double,float。

TCL语言的学习

事务机制

事务: 单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。

事务的创建

隐式事务:无明显的开启和结束标记

SELECT INSERT UPDATE DELETE …

显示事务:具有明显的开启和结束标记

前提先设置自动提交功能为禁用(每次都要手动设置。)

#开始事务
SET AUTOCOMMIT = 0 ; 
SHOW VARIABLES LIKE '%AUTOCOMMIT%';
START TRANSACTION; #可选的
#结束事务
COMMIT ;  #提交事务
ROLLBACK; #回滚事务
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
并发问题

脏读:读取了更新但是没提交的数据,若回滚,则无效

不可重复读:两个事务重复读取了一个字段并作修改

幻读:T1读取字段后,T2对该表插入新行,T1再次读取则会多出新行。

数据库的4种事务隔离级别

事务隔离级别

事务隔离级别脏读幻读不可重复读
READ UNCOMMITTED
READ COMMITED×
REPEATABLE READ××
SERIALIZABLE×××

ps:MySQL中默认第三个隔离级别,Oracle中默认第二个隔离级别。 √ 代表出现该问题。

查看隔离级别

SELECT @@tx_isolation; (老版本?)

SELECT @@transaction_isolation; ( 8.0 )

设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL  +  隔离级别;
  • 1

ps:需要每次连接都设置

SAVEPOINT 的使用(游戏存档?)
SET autocommit = 0;
START TRANSACTION;
DELETE FOM account WHERE id = 25;
SAVEPOINT a; #设置保存点
DELETE FROM account WHERE id = 25;
ROLLBACK TO a; #回滚到保存点
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

视图

MySQL中只保存数据逻辑,不保存数据。

语法
# 创建视图
CREATE VIEW  v1  # CREATE 可换成 ALTER
AS 
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.'majorid' = m.'id';
#使用视图查找姓张的学生和专业
SELECT * FROM v1 WHERE stuname LIKE '张%';
#删除视图
DROP VIEW 视图名,...;
#查看视图
DESC 视图名;
SHOW CREATE VIEW 视图名;
#视图的更新
CREATE OR REPLACE VIEW 视图名
AS 
SELECT ...
FROM ...
#1插入
INSERT INTO 视图名 VALUES('张飞','...');
#2修改
UPDATE 视图名 SET 列名 = '...' WHERE ...;
#3删除
DELETE FROM 视图名 WHERE 列名 = '...';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
ps:具备以下特点的视图不允许更新

error: The target table … of the UPDATE is not updatable

  1. 包含以下关键字的SQL语句:

    分组函数,distinct,group by, having,union 或union all

  2. SELECT 中包含子查询

SELECT (SELECT MAX(salary) FROM employees) 最高工资; 
  • 1
  1. 常量查询

  2. join(可以更新,但是不能插入,删除)

  3. from一个不能更新的视图(套娃?)

  4. where子句的子查询引用了from子句中的表

CREATE OR REPLACE VIEW ...
AS 
SELECT ...
FROM 表1
WHERE ... IN(
    SELECT ...
    FROM 表1 
    WHERE ...
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
视图和表的对比
创建语法的关键字是否实际占用物理空间使用
视图CREATE VIEW只是保存了SQL逻辑增删改查,一般不能
CREATE TABLE保存了数据增删改查

变量

系统:全局+会话

自定义: 用户 + 局部

一.系统变量

说明:变量由系统提供,不是用户定义,属于服务器层面使用的语法。

  1. 查看所有的系统变量
SHOW (SESSION | GLOBAL )VARIABLES;
# SESSION 是会话变量 GLOBAL 是全局变量
# 省略是会话变量
  • 1
  • 2
  • 3
  1. 查看满足条件的系统变量
SHOW  VARIABLES LIKE '%char%';
  • 1
  1. 查看指定的某个系统变量的值
SELECT @@GLOBAL.系统变量名;#(GOLBAL改成SESSION就是会话变量)
  • 1
  1. 赋值:(会话变量类似)

    set global 系统变量名 = 值;
    set @@global.系统变量名 = 值;
    
    • 1
    • 2
  • 全局变量:作用域:服务器每次启动将为所有的全局变量赋初值,针对所有的会话(连接)有效,但不能跨重启。

  • 会话变量:作用域:仅仅针对当前会话(连接)有效。

自定义变量

用户变量

说明:变量是用户自定义的,不是系统的。

使用步骤 : 声明 + 赋值 + 使用(查看,比较,运算等等)

作用域 = 系统变量中的会话变量

  1. 声明并初始化(更新也可)
SET @用户变量名 = 值;
SET @用户变量名:= 值;
SELECT @用户变量名:=值;
  • 1
  • 2
  • 3
  1. 更新(方式二)
SELECT 字段 INTO 变量名 FROM 表;
  • 1
  1. 查看
SELECT @用户变量名;
  • 1

局部变量

作用域:仅仅定义在它的begin end 中有效。

应用在 begin end 中的第一句话。

  1. 声明
DECLARE 变量名 类型 (DEFAULT 值);
  • 1
  1. 赋值
SET 局部变量名 = 值;
SET 局部变量名:= 值;
SELECT @局部变量名:=值;
  • 1
  • 2
  • 3

存储过程和函数

含义: 类似于java中的方法 简直就是好嘛

好处:

  1. 提高代码的重用性
  2. 简化操作
  3. 减少了编译次数,并且减少了和数据库服务器的连接次数,提高效率。
存储过程(PROCEDURE)

含义:一组预先编译好的SQL语句的集合,理解成批处理语句。

一.创建语法

DELIMITER $
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN 
	存储过程体(一组合法的SQL语句)
END $
  • 1
  • 2
  • 3
  • 4
  • 5

ps:

  1. 参数列表包含三部分:参数模式,参数名,参数类型

  2. 参数模式:

    1. IN (可以作为输入,需要调用方传入值)
    2. OUT (可以作为输出,可以作为返回值)
    3. INOUT (综上)
  3. 如果存储过程体只有一句话,BEGIN END 可以省略。

  4. 每条SQL语句结尾必须加分号

  5. 结尾可以使用DELIMITER重新设置

    语法:DELIMITER 结束标记

二.调用方法

CALL 存储过程名(实参列表);

三.删除

drop procedure if exists test;
  • 1

根据输入返回输出

CREATE PROCEDURE myp5(IN girlName VARCHAR(20), OUT boyName VARCHAR(20))
BEGIN 
	SELECT .. INTO boyName
	FROM ..
	INNER JOIN .. ON ..
	WHERE ..
END ;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
SET @bName; # 设置用户变量
CALL myp5('小昭',@bName);
  • 1
  • 2
函数(FUNCTION)

语法:

CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN 
	函数体
END 
  • 1
  • 2
  • 3
  • 4

ps:

  1. 参数列表 包含 (参数名 参数类型)
  2. 函数体 必须有 return

调用:SELECT 函数名(参数列表)

查看:SHOW CREATE FUNCTION 函数名;

删除:DROP FUNCTION 函数名;

区别

存储过程的返回没限制,函数的返回只能是1个。

流程控制结构

顺序结构:程序从上往下依次执行

分支结构:程序从两条或多条路径中选择一条去执行

循环结构:满足一定条件下,重复执行

分支结构
  1. if函数(双分支)
 IF (表达式1,表达式2,表达式3)
  • 1

如果表达式1成立,则返回表达式2的值,否则返回表达式3的值。

  1. case结构(等值,区间判断)
#1 等值判断
CASE 变量|表达式|字段
WHEN 要判断的值 THEN 返回的值1 
WHEN 要判断的值 THEN 返回的值2 
...
ELSE 要返回的值 
END CASE;
#2 区间判断
CASE 
WHEN 条件1 THEN 返回的值1 
WHEN 条件2 THEN 返回的值2 
...
ELSE 返回值 
END CASE ;   # 如果返回的值是语句,则需要加分号
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

(可以作为表达式,嵌套使用)

  1. if结构(多重分支)
IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
...
[ELSE 语句n;]
END IF;
  • 1
  • 2
  • 3
  • 4
  • 5
循环结构

(while,loop,repeat)

循环控制:

  • iterate(结束本次循环,继续下次)

  • leave(结束循环)

  1. while
[标签:] while 循环条件 do
	循环体;
end while [标签] ;
  • 1
  • 2
  • 3
  1. loop
[标签:] loop
	循环体;
end loop [标签];
  • 1
  • 2
  • 3
  1. repeat
[标签:] repeat
	循环体;
until 结束循环的条件
end repeat [标签];
  • 1
  • 2
  • 3
  • 4

默认数据库

  1. information_schema

    其中information_schema有62个表主要存储系统中的一些数据库对象信息,如用户表信息,列信息,权限信息,字符集信息,分区信息等等。

  2. performance_schema

    performance_schema有87个表,主要存储数据库服务器性能参数

  3. mysql

    mysql有31个表,主要存储系统用户的权限信息

语法规范

  1. 不区分大小写,但建议关键字大写,表名,列名小写

  2. 每条命令最好用分号结尾 (还可以用 \g

  3. 每条命令根据需要,可以缩进,或换行

  4. 注释

    • 单行注释 : #注释文字

    • 单行注释:-- 注释文字(注意有空格)

    • 多行注释:/* 注释文字 */

  5. 数据库命名规则:

    • 名称由字母,阿拉伯数字,下划线(_)和“$”组成,不能使用单独的数字。
    • 名称最长为64个字符,别名可256个字符。 (别名是啥?)
    • 不能使用MySQL关键字作为库名,表名。
  6. 使用着重号 来表示这个是 字段`

启发

  • 工种等重复性高的使用数字表示,不冗余,额外开辟一个数据库匹配数字和工种名字 ,最低最高工资
  • **+**号的作用:(运算符)
    • 数字+数字:结果:正常
    • 字符+数字:试着将字符转化成数字,如果不行,就转化成0.
    • null+数字:结果为null
  • **=**号:不能判断空,即不能 = NULL ,应该用 … IS NULL || … IS NOT NULL
  • 安全等于 <=> 可以判断NULL值 以及 具体数值
  • 查询结果是一个虚拟的表。
  • MySQL中函数必须有返回值。
  • 为表起别名:提高语句简洁度,区分多个重名的字段。
    • 如果为表起了别名,则查询的字段就不能使用原来的表名限定。
  • 多表连接中可以加分组也可以加排序
  • 外连接 筛选条件非空时最好选择从表主键,因为不可能为NULL。
  • LIMIT 慎用:查询字段最低时 排序后 limit 1 可以吗? 万一最低值有两个相同的呢? 用IN 可能好一点。
  • 如果存储过程的变量名和表的列名相同的话,里头的名字代表变量名,表的列名需要通过 表.列名 来表示。

案例

查询员工号为176的员工的姓名和部门号和年薪(基本查询)

SELECT 
	last_name,
	department_id,
	salary*12*(1+ IFNULL(commision_pct,0)) AS 年薪
FROM 
	employees
WHERE
	id = 176;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

按年薪的高低显示员工的信息和年薪【按表达式 || 别名 排序】

SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
#ORDER BY 年薪 DESC;
  • 1
  • 2
  • 3
  • 4

查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序

SELECT *
FROM employees
WHERE email LIKE "%e%"
ORDER BY LENGTH(email) DESC,department_id ASC;
  • 1
  • 2
  • 3
  • 4

查询员工的工资,要求工资根据部门号而变化(流程控制:条件判断)

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
SELECT salary,
CASE 
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS '工资级别'
FROM employees;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

查询每个部门的平均工资(简单的分组查询)

SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;
  • 1
  • 2
  • 3

查询哪个部门的员工个数>2(复杂的筛选条件)

  1. 查询每个部门的员工个数
  2. 根据1的结果进行筛选,查询哪个部门的员工个数>2
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id  // 第一步
//WHERE COUNT(*)>2;  //error:Invalid use of group function
HAVING COUNT(*)>2;  //第二步
  • 1
  • 2
  • 3
  • 4
  • 5

小结:WHERE 过滤行 , HAVING 过滤分组。

查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资。(按表达式或函数分组)

SELECT MIN(salary) 最低工资,manager_id 领导编号,salary
FROM employees
WHERE manager_id>102
GROUP BY manager_id   
HAVING MIN(salary)>5000;
#GROUP BY 领导编号   
#HAVING 最低工资>5000;  //支持别名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

查询员工名和对应的部门名(多表查询)

SELECT last_name,department_name
FROM employees,departments
WHERE employees.department_id = departments.department_id;
  • 1
  • 2
  • 3
# SQL92
SELECT last_name,department_name
FROM employees e,departments d //为表起别名
WHERE e.department_id = d.department_id;
#SQL 99
SELECT last_name,department_id
FROM departments d
INNER JOIN employees e
ON e.department_id = d.department_id;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

查询员工的工资和工资级别(非等值连接)(SQL92)

SELECT salary,grade_level
FROM employees e,job_grades g
WHERE salary BETWEEN g.'lower_sal' AND g.'highest_sal';
  • 1
  • 2
  • 3

查询员工名字和员工上级名字(自连接)(SQL92)

来自尚硅谷数据

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;
  • 1
  • 2
  • 3

查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序(SQL99)(等值连接)

SELECT department_name,COUNT(*) AS 员工个数
FROM departments d
INNER JOIN employees e
ON d.department_id = e.department_id
WHERE COUNT(*)>3 
ORDER BY COUNT(*) DESC;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

查询哪个城市没有部门 (左外连接)

SELECT city,COUNT(*)
FROM locations l
LEFT OUTER JOIN departments d
ON l.location_id = d.location_id
WHERE d.department_id = NULL;  //这是该表的主键。
  • 1
  • 2
  • 3
  • 4
  • 5

返回其他部门中比job_id为‘IT_PROG’部门任一工资低的员工号,姓名,以及salary(子查询)

#①查询job_id为‘IT_PROG’部门的所有工资
#②查询员工号,姓名以及salary,  其中 salary<①的任意一个
SELECT id,last_name,salary
FROM employees
WHERE salary < ANY (
	SELECT salary
	FROM employees
	WHERE job_id = "IT_PROG"
) AND job_id <> 'IT_PROG';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
#①查询job_id为‘IT_PROG’部门的最大工资
#②查询员工号,姓名以及salary,  其中 salary<①
SELECT id,last_name,salary
FROM employees
WHERE salary < (
	SELECT MAX(salary)
	FROM employees
	WHERE job_id = "IT_PROG"
) AND job_id <> 'IT_PROG';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

查询有员工的部门名(EXISTS)

SELECT department_name
FROM departments d 
WHERE EXISTS(
    SELECT *
    FROM employees e
    WHERE d.department_id = e.department_id
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

查询第11个到第25个员工信息(分页查询)

SELECT * FROM employees LIMIT 10,15;
  • 1

测试题3(B站96集)

已知 表stuinfo

idnameemailgradeIdsexage
学号姓名邮箱 john@126.com年级编号性别 男/女年龄

已知 表 grade

idgradeName
年级编号年级名称

一、查询所有学员的邮箱的用户名 (注:邮箱中@前面的字符)

SELECT substr(email,1,instr(email,'@') -1 )) 用户名
FROM stuinfo;
  • 1
  • 2

二、查询男生和女生的个数

SELECT SEX,COUNT(*) 个数
FROM stuinfo
GROUP BY sex;
  • 1
  • 2
  • 3

三、查询年龄>18岁的所有学生的姓名和年级名称

SELECT name,gradeName
FROM stuinfo s 
INNER JOIN grade g
ON s.gradeId = g.id 
WHERE age > 18 ;
  • 1
  • 2
  • 3
  • 4
  • 5

四、查询哪个年级的学生最小年龄>20岁

SELECT gradeId,MIN(age) 
FROM stuinfo 
GROUP BY gradeId
HAVING MIN(age) > 20 ; 
  • 1
  • 2
  • 3
  • 4

五、试说出查询语句中涉及到的所有的关键字,以及执行先后顺序(DQL语言)

SELECT 查询列表     -----7
FROM 表            -----1
连接类型 JOIN 表2   -----2
ON 连接条件         -----3
WHERE 筛选条件      -----4
GROUP BY 分组列表   -----5
HAVING 分组后的筛选 -----6
ORDER BY 排序列表   -----8
LIMIT 偏移,条目数; ------9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

求平均工资最低的部门信息

SELECT d.* , ag
FROM departments d
JOIN(
	SELECT AVG(salary) ag department_id
	FROM employees
	GROUP BY department_id
	ORDER BY AVG(salary)
	LIMIT 1
) ag_dep
ON d.department_id = ag_dep.department_id;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

查询平均工资高于公司平均工资的部门有哪些?

SELECT department_id,AVG(salary) 部门平均工资
FROM employees
GROUP BY department_id 
HAVING 部门平均工资 > (
SELECT AVG(salary)
FROM employees e    
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

添加列级,表级约束

CREATE TABLE stuinfo(
	id INT PRIMARY KEY,
    stuName VARCHAR(20) NOT NULL,
    gender CHAR(1) CHECK(gender = '男' OR gender = '女'),
    seat INT UNIQUE,
    age INT DEFAULT 18,
    majorId INT FOREIGN KEY REFERENCES major(id)
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

查看索引

SHOW INDEX FROM sutinfo;

CREATE TABLE stuinfo(
	id INT ,
    stuName VARCHAR(20),
    gender CHAR(1) ,
    seat INT ,
    age INT ,
    majorId INT 
    CONSTRAINT pk PRIMARY KEY (id),
    ...
    CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);
);#非空和默认不支持

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

创建存储过程实现 根据名字 查询对应的信息

DELIMITER $
CREATE PROCEDURE myinfo(IN bname VARCHAR(20))
BEGIN 
	SELECT b.*
	FROM boys b
	RIGHT JOIN information i ON b.id = i.id
    WHERE b.name = bname;
END $

CALL myinfo('hyy') $ 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

创建存储过程实现 用户是否登录成功 (变量使用+存储过程)

CREATE PROCEDURE myp3(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN 
	#声明并初始化
	DECLARE result VARCHAR(20) DEFAULT '';
	#赋值
	SELECT COUNT (*) INTO result
	FROM admin
	WHERE admin.username = username
	AND admin.password = PASSWORD;
	#使用
	SELECT result;
END ;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

根据部门名,返回该部门的平均工资(函数)

CREATE FUNCTION myf3(deptName VARCHAR(20)) RETURNS DOUBLE
BEGIN 
	DECLARE sal DOUBLE ; # 声明局部变量
	SELECT AVG(salary) INTO sal 
	FROM employees e
	JOIN departments d ON e.department_id = d.department_id
	WHERE d.department_name = deptName; # 赋值
	RETURN sal;  #返回结果
END $  #提前设置好结束符了
#调用
SELECT myf3('IT') $
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

批量插入,根据次数插入到admin表中(循环)

CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN 
	DECLARE i INT DEFAULT 1;
	WHILE i<= insertCount DO
		INSERT INTO admin(username,'password') VALUES(CONCAT('ROSE',i),'666')
		SET i=i+1;
	END WHILE;
END $
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如果次数大于20则停止

CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN 
	DECLARE i INT DEFAULT 1;
	a: WHILE i<= insertCount DO
		INSERT INTO admin(username,'password') VALUES(CONCAT('ROSE',i),'666')
		IF i>=20 THEN LEAVE a;
		END IF;
		SET i=i+1;
	END WHILE a;
END $
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
关于笔记

部分内容有所重复,见谅。

前部分笔记整理来自 明日科技《MySQL从入门到精通》

后部分来自哔哩哔哩里

“MySQL_基础+高级篇- 数据库 -sql -mysql教程_mysql视频_mysql入门_尚硅谷”

点击跳转第一集

练习网站

  1. CSDN博客 自测练习 附有建库命令 (较难)

  2. SQL在线练习网站(简单)

  3. [W3Cschool 理论练习](CSDN博客 自测练习 附有建库命令 ) (简单)

  4. SQLBolt 学习 全英 (nice)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/990728
推荐阅读
相关标签
  

闽ICP备14008679号