Mysql-基础
mysql 数据库管理系统
数据库出厂设置
(1)information_schema:记录mysql数据库所含库、表信息(本质是个视图)
(2)mysql :存放mysql数据库核心的相关信息(本质是数据库)
(3)performance_shcema:存放mysql数据库性能相关的信息(本质是数据库)
(4)sys :存放mysql数据库系统相关的信息(本质是数据库)
数据库管理命令
数据库登录命令
mysql -uroot -pyingxin20000303 -h192.168.1.1 -P3306
-u:设置登录用户
-p:输入登录密码
-h:设置登录服务器ip地址
-P:设置登录端口号
数据库登出命令
(1)exit
(2)quit
mysql 结构化查询语言
sql 通用规则
(1)SQL可单行也可多行书写,以分号结尾
(2)不区分大小写,关键字建议大写
(3)单行注释用"#"或"-- ",多行注释用"/* */"
sql 语句分类
DDL:数据库定义语句(定义数据库对象)
DML:数据的操作语句(对数据表进行增、删、改)
DQL:数据的查询语句(对数据表进行查询)
DCL:数据的控制语句(定义数据库访问权限与安全级别和创建用户)
sql 具体语句
DDL 语句
数据库操作
查询数据库
SHOW DATABASES;
创建数据库
CREATE DATABASE 数据库名; #直接创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名; #判断是否不存在同名数据库后再创建数据库
删除数据库
DROP DATABASE 数据库名; #直接删除数据库
DROP DATABASE IF EXISTS 数据库名; #判断是否存在数据库后再删除数据库
使用数据库
USE 数据库名;
查看数据库
SELECT DATABASE();
数据表操作
查询数据表
SHOW TABLES; #查询数据表
DESC 数据表名; #查询数据表结构
创建数据表
CREATE TABLE 数据表名(
字段名1 数据类型1,
字段名2 数据类型2,
字段名3 数据类型3
);
约束:约束时作用于表中列上的规则,用于限制加入表的数据
作用:保证了数据库中数据的正确性、有效性和完整性
| 约束名称 | 描述 | 关键字 |
|---|---|---|
| 非空约束 | 列中数据不为空 | NOT NULL |
| 唯一约束 | 列中数据各不相同 | UNIQUE |
| 主键约束 | 列中数据非空且唯一 | PRIMARY KEY |
| 检测约束 | 列中数据满足自定义条件 | CHECK |
| 默认约束 | 列中未指定的数据采用默认值 | DEFAULT |
| 外键约束 | 建立多表连接,保证数据的一致性和完整性 | FOREIGN KEY |
AUTO_INCREMENT:自动增长(当列是数字类型且唯一约束)(从1开始自动增长)
CREATE TABLE STU(
ID INT PRIMARY KEY AUTO_INCREMENT, #主键,自动增长
NAME VARCHAR(50) NOT NULL UNIQUE, #非空,唯一
JOINDATA DATE NOT NULL, #非空
SALARY DOUBLE(7,2) DEFAULT, #默认
CLASSID INT NOT NULL, #非空
CONSTRAINT FK_CLASS_CLASS FOREIGN KEY(CLASSID) REFERENCES CALSS(ID) #外键
)
表间关系:通过外键建立标间关系(外键是主表的一个字段,来源于从表的主键)
(1):一对一(外键需设置唯一约束)
(2):一对多(多的一方是外键)
(3):多对多(借助第三张表实现)
删除数据表
DROP DATABASE 数据表名; #直接删除数据表
DROP DATABASE IF EXISTS 数据表名; #判断是否存在数据库后再删除数据表
修改数据表
ALTER TABLE 表名 RENAME TO 新表名;
#修改数据表名称
ALTER TABLE 表名 ADD 列名 数据类型;
#给数据表增加一列
ALTER TABLE 表名 DROP 列名;
#给数据表删除一列
ALTER TABLE 表名 MODIFY 列名 新数据类型;
#修改数据表列的数据类型
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
#修改数据表列名和数据类型
事务的操作
概念
事务:事务上一个不可分割的逻辑工作单元,包含一组数据库操作,事务整体向系统提交请求,要么同时执行成功,要么同时执行失败
注意:在mysql中当未手动设置事务时,系统一条语句即为一个事务,自动开始事务和提交事务
特性
A(原子性):事务是不可分割的最小操作单位,要么同时执行成功,要么同时执行失败
C(一致性):事务完成后必须保证所有数据保持一致性
I(隔离性):
D(持久性):事务已提交之后将所有临时操作边为永久的操作
操作
BEGIN; :开启事务(事务未提交之前对数据库所做操作均为临时操作)
COMMIT; :提交事务(事务已提交之后将所有临时操作边为永久的操作)
ROLLBACK;:回滚事务(事务未提交之前可随时使用回滚将数据库状态恢复到事务开启之前)
DML 语句
添加数据
INSERT INTO 表名(列名1,列名1,列名1)VALUES(值1,值1,值1);
#给指定列添加数据
INSERT INTO 表名(列名1,列名1,列名1)VALUES(值1,值1,值1),VALUES(值1,值1,值1);
#给指定列批量添加数据
INSERT INTO 表名 VALUES(值1,值1,值1);
#给所有列添加数据
INSERT INTO 表名 VALUES(值1,值1,值1),VALUES(值1,值1,值1);
#给所有列批量添加数据
删除数据
DELETE FROM 表名 WHERE 标识记录的条件; #删除一行的数据
DELETE FROM 表名; #删除所有行数据
修改数据
UPDATE 表名 SET 列名1=值1,列名2=值3,列名3=值3 WHERE 标识记录的条件;
#更改一行的数据
UPDATE 表名 SET 列名1=值1,列名2=值3,列名3=值3;
#更改所有行数据
DQL 语句
单表查询
基础查询
SELECT * FROM 表名;
#查询数据表所有数据
SELECT 字段列表 FROM 表名;
#查询字段对应的数据
SELECT DISTINCT 字段列表 FROM 表名;
#查询字段对于的数据(去除重复记录项)
SELECT 字段列表 AS 别名 FROM 表名;
#查询字段对于的数据(给字段添加别名)(同理可对数据表起别名)
(1)查询学生表全部信息
SELECT * FROM STU;
(2)查询数学信息
SELECT MATH FROM STU;
(3)查询数学成绩,相同的数学成绩只显示一次
SELECT DISTINCT MATH FROM STU;
(4)查询数学成绩,给数学成绩字段取个别名
SELECT MATH AS MATHGRADE FROM STU;
条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表;
| 条件符号 | 功能 |
|---|---|
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| == | 等于 |
| !=或<> | 不等于 |
| BETWEEN ADN | 在范围之间 |
| IN | 多选一 |
| LIKE | 模糊查询(_:单字符占位符;%:多字符占位符) |
| IS NULL | 是空 |
| IS NOT NULL | 非空 |
| AND或&& | 与 |
| OR或|| | 或 |
| NOT或! | 非 |
(1)查询年龄大于20岁学员信息
SELECT * FROM STU WHERE AGE > 20;
(2)查询年龄大于等于20岁小于等于30岁学员信息
SELECT * FROM STU WHERE AGE >= 20 AND AGE <= 30;
SELECT * FROM STU WHERE AGE >= 20 && AGE <= 30;
SELECT * FROM STU WHERE AGE BETWEEN 20 AND 30;
(3)查询年龄不等于18岁学员信息
SELECT * FROM STU WHERE AGE != 20;
SELECT * FROM STU WHERE AGE <> 20;
(4)查询年龄等于10岁或等于20岁或等于30岁学员信息
SELECT * FROM STU WHERE AGE == 10 OR AGE == 20 OR AGE == 30;
SELECT * FROM STU WHERE AGE == 10 || AGE == 20 || AGE == 30;
SELECT * FROM STU WHERE AGE IN(10,20,30);
(5)查询年龄为空学员信息
SELECT * FROM STU WHERE AGE IS NULL;
(6)查询姓马学员信息
SELECT * FROM STU WHERE NAME LIKE '马%' ;
(7)查询名字第二个字是花的学员信息
SELECT * FROM STU WHERE NAME LIKE '_花%';
(8)查询名字内包含德德学员信息
SELECT * FROM STU WHERE NAME LIKE '%马%';
排序查询
SELECT 字段列表 FROM 表名 ORDER BY 排序字段名 排序方式;
排序方式:可多个排序条件,当前面排序条件相同时才会根据后面排序条件微调
ASC :升序排列(默认)
DESC:降序排序
(1)查询学生信息,按照数学成绩升序排列
SELECT * FROM STU ORDER BY MATH ASC;
(2)查询学生信息,按照英语成绩降序排列
SELECT * FROM STU ORDER BY ENGLISH DESC;
(3)查询学生信息,按照数学成绩升序排列,当数学成绩一样时,按照英语成绩降序排列
SELECT * FROM STU ORDER BY MATH ASC,ENGLISH DESC ;
聚合查询
SELECT 聚合函数名(列名) FROM 表名;
聚合函数:NULL不参与
(1)COUNT():统计数量
(2)MAX ():最大值
(3)MIN ():最小值
(4)SUM ():求和
(5)AVG ():平均值
(1)统计班级总共学生
SELECT COUNT(ID) FROM STU;
(2)查询数学成绩最高分
SELECT MAX(MATH) FROM STU;
(3)查询数学成绩最低分
SELECT MIN(MATH) FROM STU;
(4)查询数学成绩总分
SELECT SUM(MATH) FROM STU;
(5)查询数学成绩平均分
SELECT AVG(MATH) FROM STU;
分组查询
SELECT 字段列表 FROM WHERE 分前限定条件 GROUP BY 分组字段名 HAVING 分后条件过滤;
WHERE :分组前进行条件限定,不满足条件则不参与分组;不支持聚合函数
HAVING:分组后进行条件限定;支持聚合函数(执行顺序:WHERE > 聚合函数 > HAVING)
(1)查询男同学和女同学各自的数学平均分
SELECT SEX,AVG(MATH) FROM STU GROUP BY SEX;
(2)查询男同学和女同学各自的数学平均分以及各自的人数
SELECT SEX,AVG(MATH),COUNT(*)FROM STU GROUP BY SEX;
(3)查询男同学和女同学各自的数学平均分以及各自的人数
要求:分数低于70分的不参与分组
SELECT SEX,AVG(MATH),COUNT(*)FROM STU WHERE MATH >= 70 GROUP BY SEX;
(4)查询男同学和女同学各自的数学平均分以及各自的人数
要求:分数低于70分的不参与分组,分组后人数大于2个
SELECT SEX,AVG(MATH),COUNT(*)FROM STU
WHERE MATH >= 70 GROUP BY SEX HAVING COUNT(*) > 2;
分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询每页条目数
(1)起始索引 = (当前页码 - 1) * 每页显示条目数
(2)分页查询关键字:MySQL:LIMIT;Oracle:ROWNUMBER;SQL Server:TOP
(1)从零开始查询下,查询3条数据
SELECT * FROM STU LIMIT 0,3;
(2)查询第一页数据,每页显示3条数据
SELECT * FROM STU LIMIT 0,3;
(3)查询第二页数据,每页显示3条数据
SELECT * FROM STU LIMIT 3,3;
(4)查询第三页数据,每页显示3条数据
SELECT * FROM STU LIMIT 6,3;
多表查询
连接查询
SELECT 字段列表 FROM 表1,表2 WHERE 条件;
#隐式内连接查询(查询两表之间的交集)
SELECT 字段列表 FROM 表1 INNER JOIN 表2 ON 条件;
#显示内连接查询(查询两表之间的交集)
SELECT 字段列表 FROM 表1 LEFT OUTER JOIN 表2 ON 条件;
#左外连接查询(查询两表之间的交集加左表)
SELECT 字段列表 FROM 表1 RIGHT OUTER JOIN 表2 ON 条件;
#右外连接查询(查询两表之间的交集加右表)
(1)查询EMP表和DEPT表中所有数据
SELECT * FROM EMP,DEPT WHERE EMP.DEP_ID = DEMP.ID;
(2)查询EMP表和DEPT表中所有数据
SELECT * FROM EMP INNER JOIN DEPT ON EMP.DEP_ID = DEMP.ID;
(3)查询EMP表和DEPT表中所有数据和EMP表独有数据
SELECT * FROM EMP LEFT OUTER DEPT ON EMP.DEP_ID = DEMP.ID;
(4)查询EMP表和DEPT表中所有数据和DEPT表独有数据
SELECT * FROM EMP RIGHT OUTER DEPT ON EMP.DEP_ID = DEMP.ID;
嵌套查询
SELECT 字段列表 FROM 表 WHERE 字段名 = (子查询);
#单行单列,子查询作为条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 IN (字段名);
#多行单列,子查询作为条件判断
SELECT 字段列表 FROM (子查询) WHERE 条件;
#多行多列,子查询作为虚拟查询表
(1)查询财务部所有员工信息
1.SELECT STAFF_ID FROM DEPT WHERE DNAME = '财务部';
2.SELECT * FROM EMP WHERE DEP_ID = '2';
3.SELECT * FROM EMP WHERE
DEP_ID = (SELECT STAFF_ID FROM DEPT WHERE DNAME = '财务部');
(2)查询财务部和市场部所有员工信息
1.SELECT STAFF_ID FROM DEPT WHERE DNAME = '财务部' OR '市场部';
2.SELECT * FROM EMP WHERE DEP_ID IN (2,3);
3.SELECT * FROM EMP WHERE DEP_ID IN
(SELECT STAFF_ID FROM DEPT WHERE DNAME = '财务部' OR '市场部');
(3)查询入职如期式'2022-11-11'之后入职的员工和部门信息
1.SELECT * FROM EMP WHERE DATE = '2022-11-11';
2.SELECT * FROM EMP,DEPT WHERE EMP_ID = DEP_ID;
3.SELECT * FROM (SELECT * FROM EMP,DEPT WHERE EMP.DEPT_ID = DEP.ID;)
WHERE DATE = '2022-11-11';
DCL 语句
用户管理
查询用户
USE mysql; #用户信息存放在mysql库中的user表里,直接查看即可
SELECT * FROM USER;
创建用户
CREATE USER '用户名'@'访问位置' IDENTIFIED BY '密码';
(1)创建用户yingxin,只能在本机登录数据库访问,密码yingxin20000303
CREATE USER 'yingxin'@'localhost' IDENTIFIED BY 'yingxin20000303';
(2)创建用户yingxin,只能在任意主机登录数据库访问,密码yingxin20000303
CREATE USER 'yingxin'@'%' IDENTIFIED BY 'yingxin20000303';
修改用户密码
ALTER USER '用户名'@'主机名'
IDENTIFIED WITH mysql_native_password BY '新密码';
(1)修改用户yingxin的密码
ALTER USER 'yingxin'@'%'
IDENTIFIED WITH mysql_native_password BY 'YingXin0303';
删除用户
DROP USER '用户名'@'主机名';
(1)删除用户yingxin
DROP USER 'yingxin'@'%';
权限管理
权限分类
| 权限 | 说明 |
|---|---|
| ALL | 所有权限 |
| INSERT | 插入数据 |
| DELETE | 删除数据 |
| UPDATE | 修改数据 |
| SELECT | 查询数据 |
| ALERT | 修改表 |
| DROP | 删除数据库、表、视图 |
| CREATE | 创建数据库、表 |
查询权限
SHOW GRANTS FOR '用户名'@'主机名';
(1)查询用户yingxin的权限
SHOW GRANTS FOR 'yingxin'@'localhost';
授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
#'*'可以同配所有数据库和所有数据表
(1)授予用户yingxin对数据库learn中的study表的查询权限和插入权限
GRANT SELECT,INSERT ON learn.study TO 'yingxin'@'localhost';
撤消权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
(1)撤消用户yingxin对数据库learn中的study表的查询权限
REVOKE INSERT ON learn.study FROM 'yingxin'@'localhost';
mysql 中常见系统函数
字符函数
| 函数 | 功能 |
|---|---|
| CONCAT(S1,S2...Sn) | 字符串拼接函数,将S1,S2...Sn拼接成一个字符串 |
| LOWER(str) | 小写函数,将字符串str全部转换为小写字母 |
| UPPER(str) | 大写函数,将字符串str全部转换为大写字母 |
| LPAD(str,n,pad) | 左填充函数,用字符串pad对str左边进行填充,使得str达到n个字符长度 |
| RPAD(str,n,pad) | 右填充函数,用字符串pad对str右边进行填充,使得str达到n个字符长度 |
| TRIM(str) | 去空函数,去掉字符串str头部和尾部的空格 |
| SUBSTRING(str, start,len) | 截取函数,返回字符串str从start位置起的len个长度的字符串 |
数值函数
| 函数 | 功能 |
|---|---|
| CLEIL(x) | 取整函数,向上取整 |
| FLOOR(x) | 取整函数,向下取整 |
| MOD(x,y) | 取模函数,x,y的模 |
| RAND() | 随机函数,0-1随机数 |
| ROUND(x,y) | 舍弃函数,x的四舍五入值,保留y位小数 |
日期函数
| 函数 | 功能 |
|---|---|
| CURDATE() | 日期函数,返回当前日期 |
| CURTIME() | 时间函数,返回当前时间 |
| NOW() | 日期时间函数,返回当前日期和时间 |
| YEAR(date) | 截取年份函数,获取指定日期的年份 |
| MONTH(date) | 截取月份函数,获取指定日期的月份 |
| DAY(date) | 截取日份函数,获取指定日期的天份 |
| DATE_ADD(date,INTERVAL expo type) | 累加函数,返回在一个时间或日期后加上expr间隔后的时间值 |
| DATEDIFF(date1,date2) | 差值函数,返回起始日期data1和结束日期data2之间的天数 |
流程函数
| 函数 | 功能 |
|---|---|
| IF(value,t,f) | 如果value为true,则返回t,否则返回f |
| IFUNLL(value1,value2) | 如果value1不为空,返回value1,否则返回value2 |
| CASE WHEN [val1] THEN [res1] ... ELSE[default] EDN | 如果val1为true,返回res1,...否则返回defaul默认值 |
| CASE [expr] WHEN [val1] THEN [res1] ... ELSE [default] END | 如果expr的值等于val1,返回res1,...否则返回defaul默认值 |

浙公网安备 33010602011771号