MySQL的启动
-
系统服务找到MySQL80 右键启动
-
cmd黑窗口输入
-
net start mysql80 (mysql80为默认值) ==>启动
-
net stop mysql80 ==> 停止
MySQL连接客户端
-
-
MySQL命令行输入密码后启动
-
系统环境变量配置MySQL路径之后,cmd黑窗口输入
-
mysql [-h 120.0.0.1] [-p 3306] -u root -p
- 此格式为 mysql [-h ip地址] [-p 端口号] -u 用户名 -p 密码
-
MySQL 数据库
关系型数据库(RDBMS) // 了解
概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库
特点
- 使用表存储数据,格式统一,便于维护
- 使用 sql 语言操作,标准统一,使用方便
SQL通用语法
-
SQL 语句可以单行或多行书写,以分号结尾
-
SQL 语句可以使用 空格 / 缩进 来增强语句的可读性
-
MySQL 数据库的 SQL语句不区分大小写,关键字建议使用大写
-
注释:
-
单行注释: -- 注释内容 或者 # 注释内容(MySQL特有#注释)
-
多行注释: /*注释内容*/
-
SQL分类
- DDL : Data Definition Language : 数据定义语音,用来定义数据库对象(数据库,表,字段)
- DML : Data Manipulation Language : 数据操作语言,用来对数据库表中的数据进行增删改
- DQL : Data Query Language : 数据查询语言,用来查询数据库中表的记录
- DCL : Data Control Language : 数据控制语言,用来创建数据库用户,控制数据库的访问权限
DDL-数据库操作
-
查询
-
查询所有数据库
SHOW DATABASES;
-
查询当前数据库
SELECT DATABASE();
-
-
创建
CREATE DATABASE [IF NOT EXISTS] 数据库名[DEFAULT CHARSET 字符集] [COLLATE 排序规则];
- [IF NOT EXISTS] 表示 如果这个数据不存在则创建新的数据库, 如果这个数据库存在则不进行任何操作 (可省略)
- [DEFAULT CHARSET 字符集] 指定当前数据库的字符集 ,如 utf8mb4 ... (可省略)
- [COLLATE 排序规则] 指定对应排序规则 (可省略)
-
删除
DROP DATABASE [IF EXISTS] 数据库名;
-
使用
USE 数据库名;
DDL-表操作-查询
-
查询当前数据库所有表
SHOW TABLES;
-
查询表结构
DESC 表名;
-
查询指定表的建表语句
SHOW CREATE TABLE 表名;
DDL-表操作-创建-CREATE TABLE
CREATE TABLE 表名(
字段1 字段1的类型[COMMENT 字段1的注释],
字段2 字段2的类型[COMMENT 字段2的注释],
......
字段3 字段3的类型[COMMENT 字段3的注释]
)[COMMENT 表注释];
DDL-表操作-插入-INSERT INTO
insert into 表名 values(值1,值2,值3);
> 直接在values中增加值
insert into 表名(列名1,列名2,列名3) values(值1,值2,值3);
> 先在表名后列出所有的表名,然后在values中列出所有的值,这种写法最为工整
insert into 表名(列名1,列名2) values(值1,值2);
> 在表名后只列出部分列名,在values中只列出部分值,而未列出的列,其值为空
DDL-表操作-查询-SELECT
SELECT * from 表名;
> 查询整张表
SELECT 字段名,字段名,字段名,字段名 from 表名;
> 查询所有的字段
SELECT 需要的字段名,需要的字段名 from 表名;
> 查询部分字段
SELECT 整数或者浮点数字段名 * 需要的倍数 from 表名;
> 对字段进行计算
SELECT 整数或者浮点数字段名 * 需要的倍数 as 计算过后的值的名称 from 表名;
> 对字段进行计算后还可以为计算出的新值赋予列名,建议此处名称使用双引号包裹---去除名称包含空格或者名称包含保留字的影响
DDL-表操作-去重-DISTINCT
SELECT DISTINCT 字段名 from 表名;
> 查询时在字段名前增加distinct关键词,可做到查询去重
DDL-表操作-条件过滤-WHERE
SELECT 字段名,字段名 from 表名 WHERE 需要过滤的字段名 > 过滤条件;
> 使用where关键词对查询做出条件限制,字段名和过滤条件之间的比较符可以为>,<,>=,<=,=,!=,<>等等
SELECT 字段名,字段名 from 表名 WHERE 需要过滤的字段名 > 过滤条件 AND 需要过滤的字段名 > 过滤条件;
> 当有多个条件查询时可以使用AND,OR和()来组合条件
SELECT 字段名 from 表名 WHERE NOT 字段名 = 查询条件 and NOT 字段名 = 查询条件;
> 使用NOT为where查询关键字时表明查询非当前条件的值
DDL-表操作-条件过滤-IN
SELECT 字段名 from 表名 WHERE 字段名 = 查询条件 or 字段名 = 查询条件 or 字段名 = 查询条件 from 表名;
> 等价于
SELECT 字段名 from 表名 WHERE 字段名 IN (查询条件,查询条件,查询条件)
DDL-表操作-指定范围-BETWEEN
SELECT 字段名 from 表名 WHERE 字段名 BETWEEN 查询条件 AND 查询条件;
> 定义查询条件在某两个值之间
SELECT 字段名 from 表名 WHERE 字段名 NOT BETWEEN 查询条件 AND 查询条件;
> 定义查询条件不在某两个值之间
DDL-表操作-搜索匹配的字符串-LIKE
SELECT 字段名 from 表名 WHERE 字段名 LIKE 查询条件;
> LIKE 与 '%' '_' 配合使用
> 百分号(%) 匹配零个、一个或多个字符
> 下划线(_) 匹配单个字符
> 'A%' 匹配以 A 开头的字符串
> '%A%' 匹配包含 A 的字符串
> '___A' 匹配第四个字母为 A 的字符串 --- 百分号前放置了三个下划线
DDL-表操作-字段排序-ORDER BY
SELECT 字段名 from 表名 order by 字段名;
> 字段正序
SELECT 字段名 from 表名 order by 字段名 desc;
> 字段倒序
SELECT 字段名,字段名 from 表名 order by 字段名 desc ,字段名 asc;
> desc 后缀表示字段倒序,asc后缀表示字段正序
DDL-表操作-更新操作-UPDATE
UPDATE 表名 SET 字段名 = 更新的值 WHERE 字段名=查询条件;
> UPDATE 表示更新操作 set 表示存储操作 WHERE 表示查询操作
UPDATE 表名 SET 字段名 = 字段名 + 要更新的值 WHERE 字段名=查询条件
> UPDATE 的 SET 操作还可以进行运算,例如:+ - * /
UPDATE 表名 SET 字段名=更新的值,字段名=更新的值 WHERE 字段名=查询条件
> 当需要多个字段更新时,用逗号隔开
UPDATE 表名 SET 字段名=更新的值 WHERE 字段名=(SELECT 字段名 FROM 表名2 WHERE 字段名=查询条件);
> 使用括号 () 与 UPDATE 组合可以使用 UPDATE 子查询,将需要多次查询的步骤整合到一次查询中并完成更新
DDL-表操作-删除操作-DELETE
DELETE FROM 表名 WHERE 字段名=查询条件;
> 删除符合条件的一条信息
DELETE FROM 表名;
> 删除表中的所有记录并保留表结构,这条语句执行的时常会跟表中的记录条数有关
DDL-表操作-删除操作-TRUNCATE
TRUNCATE TABLE 表名;
> 删除表中所有记录并保留表结构,这条语句的执行时常不会被表的记录条数影响
表的主键(Primary Key)
- 表的主键由表中的一个字段或多个字段组成,主键代表表中唯一的一条记录
内连接(inner join)
> 查询A,B两表交集部分数据
> 应用场景:表一:字段一,字段二,字段三
表二:字段三,字段四,字段五
> > 此时表一和表二中有字段三是相同的字段,现在希望查询出结果为:表一中的字段一,表二中的字段四
sql语句为:
* SELECT 字段一,字段四 FROM 表一,表二 WHERE 表一字段三=表二字段三;
等价于
* SELECT 字段一,字段四 FROM 表一 INNER JOIN 表二 ON 表一字段三=表二字段三;
> 连接有多种方式,内连接是默认的连接方式,所以 INNER 可以被省略
自连接(SELF JOIN)
> 自连接是对同一个表的不同别名进行连接
> 应用场景:查询在同一个部门共事的两个员工
设定:部门表 depTable 员工名称 staffName 员工部门号 depNo 个人工号 empNo
sql语句:
SELECT D1.staffName,D1.depNO from depTable D1 JOIN deptable D2 on D1.depNo = D2.depNo and D1.empNo <> D2.empNo;
将表depTable的两个别名 D1 D2 进行内连接(INNER JOIN),然后查询部门号相同(D1.depNo = D2.depNo )但个人工号不同的(D1.empNo <> D2.empNo)员工名称和员工部门号(D1.staffName,D1.depNO);
> 应用场景2:查询在同一个部门共事的三个员工 --- 对depTable 使用三个别名进行连接
设定:部门表 depTable 员工名称 staffName 员工部门号 depNo 个人工号 empNo
sql语句:
SELECT DISTINCT D1.staffName,D1.depNO from depTable D1 JOIN deptable D2 on D1.depNo = D2.depNo and D1.empNo <> D2.empNo;
加个去重(DISTINCT)就好了
外连接(OUTER JOIN)
> 外连接分为左外连接和右外连接
> > 左外连接:查询左表所有数据,以及两张表交集部分的数据
SELECT 字段列表 FROM 表1 LEFT[OUTER] JOIN 表2 ON 条件
> > 右外连接:查询右表所有数据,以及两张表交集部分的数据
SELECT 字段列表 FROM 表1 RIGHT[OUTER] JOIN 表2 ON 条件
应用场景:查询两个表中不满足内连接筛选条件时
设定:部门表 depTable 部门号 depNo 部门名称 depName
员工表 empTable 员工名称 staffName 员工部门号depNo 个人工号 empNo
部门表中部分部门没有员工,员工表中部分员工所属部门不在部门表中
查出 员工名称 员工部门在部门表中的部门名称 员工的部门号 部门表中的部门号
左查询: SELECT E.staffName,D.depName,E.depNo,D.depNo FROM empTable E left join depTable D on E.depNo = D.depNo;
右查询: SELECT E.staffName,D.depName,E.depNo,D.depNo FROM empTable E right join depTable D on E.depNo = D.depNo;
UNION 和 INTERCEPT 集合操作
intercept: 取两条查询语句结果的 **交集**
union:取两条查询语句结果的 **并集** 并去除两个合集中的重复值
常见分组函数
-- 函数 -- | -- 作用 -- |
---|---|
MAX() | 最大值 |
MIN() | 最小值 |
AVG() | 平均值 |
SUM() | 汇总值 |
COUNT() | 计数值 |
使用: select 分组函数(字段名) from 表名
select max(money) as '最多',min(money) as '最少',avg(money) as '平均的',sum(money) as '总的',count(*) as '数据总数' from moneyTable;
Group By 子句
- 按字段的值对结果集进行分组
应用场景:表A中数据字段为 depNo(部门号) | money(奖金)
现需要查询出按depNo分组的排序奖金序列
select depNo '部门号',MAX(money) as '最高奖金',MIN(money) as '最低奖金',AVG(money) as '平均奖金' from A group by depNo;
Having 过滤子句
- 对分组后的计算结果进行过滤的子句
查询一个表格中满足过滤条件的值
select depno,avg(money) from mpneyTable group by depno having avg(money) >1000
子查询
- 合并两个查询
当第二条查询的查询条件时第一条查询的查询结果时
select money from A where name = '张三'; ==> 设结果为1000 select name from A where money > 1000; --- 查询出钱比张三的钱多的人的姓名 ==> 合并为 select name from A where money > (select money from where name = '张三');
- 子查询也可以作为字段进行查询
select name,(select money from A where name = '张三') '张三的钱' from A ;
ALL 关键字
- ALL 关键词可以查询表中所有的数据
在表1中查询比表2所有数都大的数 设字段名为 IDNO
SELECT IDNO FROM TABLE1 IDNO > (SELECT MAX(IDNO) FROM TABLE2 );
==> 等价于
SELECT IDNO FROM TABLE1 IDNO > ALL (SELECT IDNO FROM TABLE2);
空值-NULL
概念解释:NULL ≠ 0 , NULL≠空字符串 , NULL 是独特的值
1+NULL = NULL ,1-NULL = NULL,NULL+NULL = NULL,NULL-NULL = NULL,NULL是独特的值并且不被运算影响
当字段值为NULL时,MySQL 和 SQLServer 会输出关键词NULL,但是Oracle和PostgreSQL 不会输出任何值
NULL 不能只使用 WHERE 与 NULL 比较 , 会出现条件不成立
NULL 可以同时使用 WHERE 和 IS 来进行条件判断
SELECT 1 WHERE NULL = NULL;--成立 SELECT 1 WHERE 0 IS NOT NULL; -- 成立 SELECT 1 WHERE "" IS NOT NULL; -- 成立
NULL 可以被赋值,也可以向表中增加值为NULL的字段
UPDATE 表名 SET 字段名=NULL WHERE 字段名=查询条件; > 对已有字段进行赋值为NULL INSERT INTO 表名 VALUES(字段值,字段值,NULL) > 向表中插入值为 NULL 的记录 > 使用INSERT INTO 增加数据时,未被明确录入的字段会默认为NULL
表的别名/定义变量
以下面这段代码为例:
mysql>select deptno,dname from dept d
->where d.deptno not in (select e.deptno from emp e);
> 在第一行的 from 后面 dept d , 'd' 是表 dept 的别名,后续查询中可以直接使用 'd' 来对dept 做出操作
> 在第二行的 from 中 emp e , 'e' 是对 emp 的别名,由于 sql 语言的特性,代码读取顺序是先读取 from 后的代码,再读取 select 后的代码,所以 可以在 定义别名之前使用别名,即 e.deptno 在 emp e 的前面。
注释
单行注释:-- 单行注释,使用"--"
多行注释:/* 第一行
第二行
结束行
*/
表数据的类型
类型代码 | 说明 |
---|---|
INT | 整数 |
VARCHAR() | 字符串 使用时用括号限定字符个数 |
Date | 时间 输入格式为 年-月-日 |
numeric(a,b) | 数字类型,总位数a,小数点后位数b |
char(n) | 字符/字符串,固定长度n |
varchar(n) | 字符/字符串,长度可变,最大长度n(当字符串的长度不足n时 数据库只保存实际长度 ) |
WHERE 子句运算符
运算符 | 说明 |
---|---|
= | 等于 |
<>或!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |