Declaración básica de MySql (incluyendo ejemplos)

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)

Supongo que te gusta

Origin blog.csdn.net/m0_74135466/article/details/127607939
Recomendado
Clasificación