day 1.
创建数据库: create databases 数据库名;
使用/切换到某个数据库: ues 数据库名;
//删除数据库: drop database 数据库名;
创建表:
create table emp(
id int comment '编号', 可设为主键自增: PRIMARY key auto_increment
workid varchar(10) comment '工号', 每一个字段后边都要加,(英文)
name varchar(6) comment '姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号',
worktime date comment '入职时间' 最后一个条语句不用加,
)comment '员工表'; 括号外边加;(英文)
在表中插入字段信息:
insert into emp(workno,name,gender,age,idcard,workaddress,entrydate)
values (1,'熊一','男',10,'123456789123456789','北京','2002-1-1'),
(2,'熊一','男',10,'123456789123456789','北京','2002-1-2'),
(3,'熊一','男',20,'123456789123456789','上海','2002-1-3'),
(4,'熊一','男',20,'123456789123456789','上海','2002-1-4'),
(5,'熊一','男',10,'123456789123456789','上海','2002-1-5'),
(6,'熊一','男',10,'123456789123456789','北京','2002-1-6'),
(7,'熊一','男',10,'123456789123456789','北京','2002-1-7'),
(8,'熊一','男',10,'123456789123456789','天津','2002-1-8'),
(9,'熊一','男',30,'123456789123456789','天津','2002-1-9'),
(10,'熊一','男',70,'null','西安','2002-1-1');
在表中添加字段: alter table 表名 add 字段名 字段类型(长度);
删除表: drop table if exists 表名; if exists:如果存在
删除表并重新创建该表: truncate table 表名;
删除字段: alter table 表名 drop 字段名;
修改表名: alter table 表名 rename to 新表名;
修改数据类型: alter table 表名 modify 字段名 新的数据类型;
修改字段名和字段类型: alter table 表名 change 旧字段名 新字段名 数据类型(长度);
基本查询:
查询表: select *form 表名; 尽量不写* 1.不美观2.会影响效率
查询多个字段: select 字段1,字段2... from 表名;
设置别名: select 字段1 as 别名1,字段2 as 别名2...from 表名; as可省略
去除重复记录: select distinct 字段列表 from 表名;
条件查询:
select 字段列表 from 表名 where 条件列表;
不等于: <> 、 !=
在某个范围之内: between(最小值)and(最大值)
一对多: 变量值 in(范围)
//例:查询表中年龄为20,30,40的信息
SELECT * from emp where age in(20,30,40);
模糊匹配: like '_'或 like '%'
'_'表示一位字符,'%'表示多位字符
查询null值: 变量名 is null 或 变量名 = ''
SELECT *from emp where age = 20;
SELECT *from emp where age < 20;
SELECT *from emp where age <= 20;
select *from emp where idcard = '';
SELECT * FROM emp WHERE idcard is NULL;
SELECT * FROM emp WHERE idcard is not NULL;
SELECT *from emp where age <> 20;
SELECT *from emp where age >10 && age <=40;
SELECT *from emp where age >10 AND age <=40;
SELECT *from emp where age BETWEEN 10 and 40; BETWEEN 最小值 and 最大值;
SELECT *from emp where age<20 AND workaddress ='北京';
SELECT *from emp where age<30 or workaddress = '天津';
SELECT * from emp where age in(20,30,40);
SELECT *from emp where name like '__';
SELECT *from emp where idcard like '%789';
聚合函数:
select 聚合函数(字段列表) from 表名;
count(字段名) count不统计null值;
avg(字段名)
MAX(字段名)
MIN(字段名)
SUM(字段名)
-- SELECT COUNT(*)from emp;
-- SELECT avg(age)from emp;
-- SELECT MAX(age)from emp;
-- SELECT MIN(age)from emp;
-- SELECT SUM(age) from emp where workaddress = '江苏';
分组查询:
select 字段列表 from 表名 where 条件 group by 分组字段名 having 分组后过滤条件;
不同点: 1. where 条件在分组之前进行过滤; having 是在分组之后进行条件过滤;
2. where 中不能写聚合函数 , having中可以写聚合函数;
******注意:对于select语句“执行”顺序
from-》where-》group by-》having-》select-》order by-》limit
*****注意:对于select语句“书写”顺序
select-》from-》where-》group by-》having-》order by-》limit
排序查询:
select 字段列表 form 表名 order by 字段1 排序方式, 字段2 排序方式2;
ASC:升序(默认)
DESC: 降序
****注意:如果是多字段排序,当第一个字段值'相同'时,才会进行第二个字段排序。
分页查询:
select 字段列表 from 表名 limit 起始索引,查询记录数;
****注意:1.起始索引从0开始, 起始索引=(查询页码-1)*每页显示记录数。
2.分页查询是数据库的方言,不同数据库有不同的实现,Mysql中是limit。
3.如果查询的是第一页数据,起始索引可以省略,直接简写为limit10。
day 2.
//?? (DCL语句无需重点掌握)
创建用户:
create user '用户名'@'主机名' identified by '密码'; 若主机名为'%'代表其他主机也可以访问
修改用户密码:
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
删除用户:
drop user '用户名'@'主机名';
查询权限:
show grants for '用户名'@'主机名';
授予权限:
grant on 数据库名.表名 to '用户名'@'主机名'; 授权时数据库名和表名可使用*进行通配,代表所有
查询权限:
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
//??
字符串函数:
-- concat 字符串拼接
SELECT CONCAT('Hello' , 'Mysql');
-- lower 大写变小写
SELECT LOWER('Hello');
-- upper 小写变大写
SELECT UPPER('hellomysql');
-- lpad 在第一个字符串左侧填充最后一个字符串直到长度与中间length一样
SELECT LPAD('01','5','-');
-- rpad 在第一个字符串右侧填充最后一个字符串直到长度与中间length一样
SELECT rPAD('01','5','-');
-- trim 去除头部和尾部的空格
SELECT trim(' Hello Mysql ');
-- substring 返回字符串从第一个数值起到第二个数值个长度的字符串(空格也算一个字符)
SELECT SUBSTRING('Hello Mysql',1,10);
数值函数:
-- ceil(x) 向上取整
SELECT CEIL(1.1);
-- FLOOR(x) 向下取整
SELECT FLOOR(1.9);
-- MOD(x,y) 返回x/y的模
SELECT MOD(3,4);
-- RAND() 返回0-1内的随机数
SELECT RAND();
-- ROUND(x,y) 求参数x的四舍五入的值,保留y位小数
SELECT ROUND(2.34,1);
-- //例:用过数据库函数,生成一个6位数的随机验证码
1. SELECT LPAD(ROUND(RAND()*1000000,0),5,0);
2. SELECT SUBSTRING(RAND(),3,6);
日期函数:
-- CURDATE() 返回当前日期
SELECT CURDATE();
-- CURTIME() 返回当前时间
SELECT CURTIME();
-- NOW() 返回当前日期和时间
SELECT NOW();
-- YEAR(date) 获取指定data的年份
SELECT YEAR(now());
-- MONTH(date) 获取指定date的月份
SELECT MONTH(now());
-- DAY(date) 获取指定date的日期
SELECT day(now());
-- DATE_ADD(date,INTERVAL expr unit) 返回一个日期/时间值基础上加上一时间间隔expr后的时间值
SELECT DATE_ADD(NOW(),INTERVAL 70 day);
SELECT DATE_ADD(NOW(),INTERVAL 70 month);
SELECT DATE_ADD(NOW(),INTERVAL 70 year);
-- DATEDIFF(expr1,expr2) 返回起始时间expr1 和 结束时间expr2之间相差的天数(日期值必须写成:'年-月-日',并且大的数值在前)
SELECT DATEDIFF('2022-11-11','2022-11-1');
流程控制函数:
-- IF(value,t,f) 如果value为true,则返回t,否则返回f
SELECT IF(true,'ok','error');
-- IFNULL(value1,value2) 如果value1不为空,返回value1,否则返回value2
SELECT IFNULL('ok','default');
SELECT IFNULL(' ','default');
SELECT IFNULL(null,'default');
-- CASE WHEN[val1] THEN[res1]...ELSE[DEFAULT]END 如果val1为true,返回res1,否则返回default默认值 (WHEN[val] THEN[val])条件可以写多个
//例: 查询emp表的员工姓名和工作地址(北京/上海 输出一线城市;其他输出二线城市)
SELECT name,(case workaddress WHEN '北京' THEN 一线城市 WHEN'上海' THEN 一线城市 ELSE 二线城市 end) as address from emp;
-- CASE [expr] WHEN[val1] THEN[res1]...ELSE[DEFAULT] END 如果expr的值等于val1,返回res1,否则返回default默认值 (WHEN[val] THEN[val])条件可以写多个
//例: 统计班级各个学员的成绩,规则:>=80,输出优秀;>=60,输出良好;否则,输出不及格
SELECT studentid si,studentname sn,(case WHEN score>=85 THEN '优秀' WHEN score>=60 THEN '及格' ELSE '不及格' end)as gradefrom score;
day 3.
约束:
非空约束 限制该字段的数据不能为NULL NOT NULL
唯一约束 保证该字段的所有数据都是唯一的、不重复的 UNIQUE
主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY (自增:auto-increment)
默认约束 保存数据时,如果未指定该字段的值,则采用默认值 DEFAULT
检查约束 保证字段值满足某一个条件 CHECK
外键约束 用来让两张表的数据之间建立连接,保证数据的一致性和完整性,一个实体的某个字段指向
另一个实体的主键,就称为外键 FOREIGN KEY
1.外键的字段类型必须与父表的主键要求类型一致.
2.一张表中的外键名称不能重复.
3.增加外键的字段,必须保证数据与主键一致。
4.若使用外键约束,一定要保证有两张表及以上才可链接.
-- //作为了解
-- 外键约束有3种:
-- 1.district:严格模式,父表不能删除已经被子表引用的数据
-- 2.cascade:级联模式, 父表删除,子表的数据也会被删除
-- 3.set null:置空模式,父表删除,子表的数据(外键字段)被置空
添加外键:
ALTER TABLE 子表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字名)REFERENCES 父表(被链接表的列名);
-- //这里因为我也不是很了解外键,且后期很少用到,有需要的话自行查找。
删除外键:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
删除/更新行为约束:
1. No action / RESTRICT :当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新.
2. CASCADE : 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录.
3. SET NULL : 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(要求该外键允许为null值).
-- 4. SET DEFAULT : 父表有变更时,子表将外键列设置成一个默认的值(默认引擎innodb不支持,作为了解).
删除/更新行为约束格式:
ALTER table 表名 add constraint 外键名 foreign key (外键字段) references 主表名(主字段名) ON UPDATE (约束名) ON delete (约束名);
多表查询:
笛卡尔积:(通过where控制消除多余的笛卡尔积)
SELECT *from student,course where course.id = student.id
多表查询分类:
内链接 :查询两个表某一字段相同的数据
1.隐式内连接:
SELECT 字段列表 FROM 表1,表2 WHERE 条件;
SELECT emp.name,dept.name from emp,dept where emp.dept_id = dept.id;
2.显式内连接:
SELECT 字段列表 FROM 表1 join 表2 on 链接条件;
SELECT emp.name,dept.name from emp join dept on dept_id = dept.id;
外连接 :
1. 左外连接:查询左表所有数据,以及两张表交集部分数据
SELECT 字段列表 FROM 表1 LEFT join 表2 ON 条件;
SELECT e.*,d.name from emp e LEFT JOIN dept d on e.dept_id = d.id;
2. 右外连接:查询右表所有数据,以及两张表交集部分数据
SELECT 字段列表 FROM 表1 RIGHT join 表2 ON 条件;
SELECT d.*,e.* from emp e RIGHT JOIN dept d on e.dept_id = d.id;
SELECT a.name '员工' ,b.name'领导' FROM emp a LEFT JOIN emp b on a.managerid=b.id;
自链接 :当前表与自身链接查询,自链接必须使用表别名 (把一个表看成两个表,设置不同的别名来区分及调用)
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件;
自链接查询,可以是内连接查询,也可以是外连接查询。
-- (多表)联合查询:
SELECT 字段名 FROM 表A....UNION[ALL] SELECT 字段名 FROM 表B....
-- 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
-- UNION ALL //会有重复值
-- UNION //默认有distinct(去重复值)
SELECT *FROM emp where salary <5000 UNION ALL SELECT *FROM emp where age > 50;
day4.
子查询:即sql语句中嵌套select语句
SELECT *FROM '大表' where '根据条件' = (SELECT 查询条件 FROM 二表);
-- 子查询外部的语句可以是insert、update、delete、select的任何一个。
-- 根据子查询位置:分为: where之后 、from之后、select之后。
1. 标量子查询(子查询结果为单个值)
子查询返回的结果是单个值(数字,字符串,日期) 常用的操作符:( =,<>,>,>=,<,<=)
2. 列子查询(子查询结果为一列)
返回结果是一列 常用的操作符:(in,not in,any,some,all)
-- //例SELECT *FROM emp where salary >any(SELECT salary FROM emp where class = "研发部")
3. 行子查询(子查询结果为一行)
返回结果是一行 常用的操作符:(=,<>,in,not in)
4. 表子查询(子查询结果为多行多列)
返回结果是一张表 常用的操作符:(in)
-- 事务:是一组操作的集合,同时成功或同时失败
事务的操作方法:
查看/设置事务提交方式:
SELECT @@autocommit;
-- (输出结果为1是自动提交,为0是手动提交)
set @@autocommit = 0/1;(手动设置:手动提交/自动提交)
-- 方式一:
-- 提交事务(设置为手动提交后,任何sql执行后必须执行提交事务语句)
commit;
-- 回滚事务(出现抛出异常不执行提交执行回滚事务)
ROLLBACK;
-- 方式二:
-- 开启事务:(执行后需要强制手动控制事务)
start TRANSACTION/BEGIN;
-- 提交事务
commit;
-- 回滚事务
rollback;
****事务四大特性:
1.原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败.
2.一致性:事务完成时,必须使所有的数据都保持一致.
3.隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行.
4.持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久.
****并发事务问题:
1.脏读:一个事务读到另外一个事务还没有提交的数据.
2.不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读.
3.幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在.
day5.
--事务隔离级别:
Read uncommitted(性能最好) 可能会出现 "脏读" "不可重复读" "幻读"
read committed(oracle默认) 不会出现"脏读" 会出现"不可重复读" "幻读"
repeatable read(mysql默认) 不会出现"脏读" "不可重复读" 会出现"幻读"
Serializable(性能最差) 不会出现"脏读" "不可重复读" "幻读"
--查看事务隔离级别:
SELECT@@transaction_isolation;
--设置事务隔离级别:
set (session(仅对当前窗口有效)|global(对所有客户端窗口有效)) transaction isolation level (Read uncommitted 、read committed、repeatable read、Serializable)
Declaración básica de MySql (incluyendo ejemplos)
Supongo que te gusta
Origin blog.csdn.net/m0_74135466/article/details/127607939
Recomendado
Clasificación