#----------------------------------DDL语句--------------------------------
#创建数据库
CREATE DATABASE IF NOT EXISTS school;
#使用某个数据库
USE school;
#删除数据库
DROP DATABASE IF EXISTS school;

#--------------在默认的情况下,表的类型(存储引擎)是innodb类型

#创建表Student表 (列 ,字段)学号int、登录密码varchar(20)、
#姓名、性别(varchar)、出生日期(DATETIME)、家庭住址、email
CREATE TABLE IF NOT EXISTS student2(#创建表的关键字眼student 为表名
id INT(4) PRIMARY KEY AUTO_INCREMENT COMMENT ‘主键’,#设置主键,默认id长度为4,每次递增,插入注释为主键
pwd VARCHAR(20)NOT NULL DEFAULT’123456’,#设置密码,默认为123456,长度为20
name VARCHAR(20) DEFAULT’匿名’ NOT NULL,#设置姓名,长度为20,默认为匿名
sex VARCHAR(2) NOT NULL DEFAULT ‘女’,#设置性别默认为女,长度为2
birthday DATETIME,#设置时间
address VARCHAR(100),#设置地址,默认长度100
email VARCHAR(50)#设置email,默认长度为50
)
#查看数据库的定义
SHOW CREATE DATABASE school;
#查看数据表
SHOW CREATE TABLE student2;
#查看表结构
DESC student2;
#设置严格检查模式
SET sql_mode=‘strict_trans_tables’;
#设置步长和默认初始值,
CREATE TABLE tabl1(
id INT(4) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL
) AUTO_INCREMENT=100;#设置默认初始值为100,只影响当前表
SET @@auto_increment_increment=5;#设置步长为5,影响所有的表
#—创建外键的方式1,创建主键的同时创建外键------------------------------------------------------
CREATE TABLE IF NOT EXISTS grade(
gradeid INT(10) PRIMARY KEY AUTO_INCREMENT,
gradename VARCHAR(50) NOT NULL
);
#学生信息表(学号、姓名、性别、年级、手机号、地址、出生日期、邮箱、身份证号)
CREATE TABLE IF NOT EXISTS student(
studentno INT(4) PRIMARY KEY,
studentname VARCHAR(20) NOT NULL DEFAULT’匿名’,
sex TINYINT (1) DEFAULT 1,
gradid INT(10),
phone VARCHAR(50) NOT NULL,
address VARCHAR(255),
borndate DATETIME,
email VARCHAR(50),
identityCard VARCHAR (18) NOT NULL,
CONSTRAINT FK_gradid FOREIGN KEY(gradid) REFERENCES grade(gradeid)
);

#-----------------创建外键的方式2,创建字表完毕后,修改字表添加外键
CREATE TABLE IF NOT EXISTS student1(
studentno INT(4) PRIMARY KEY,
studentname VARCHAR(20) NOT NULL DEFAULT’匿名’,
sex TINYINT (1) DEFAULT 1,
gradid INT(10),
phone VARCHAR(50) NOT NULL,
address VARCHAR(255),
borndate DATETIME,
email VARCHAR(50),
identityCard VARCHAR (18) NOT NULL

);
#在键表之后进行添加外键
ALTER TABLE student
ADD CONSTRAINT FK_gradid FOREIGN KEY(gradid) REFERENCES grade(gradeid);
#删除外键
ALTER TABLE student DROP FOREIGN KEY FK_gradid;
ALTER TABLE student DROP INDEX FK_gradid;
#--------------------------------------------------------------------------

#----------------------------DML语句--------------------------------------
#使用语句添加数据
INSERT INTO grade (gradename) VALUES(‘大一’);#指定插入行的数据
INSERT INTO grade VALUES(2,‘大二’);#插入每一行的数据
INSERT INTO grade (gradename) VALUES(‘大三’),(‘大四’);#添加多个数据
INSERT INTO student #同时添加多个对应的数据
VALUES (1002,‘zhangs2’,2,1,‘13911765003’,‘null’,NOW(),‘null’,‘36541298741002630’);
INSERT INTO tabl1(name) VALUE(‘zhangs1’),(‘wuanwu’);
#----------------------------使用语句修改数据-------------------------------
#修改单个数据
UPDATE student SET address=‘china’#修改地址
WHERE studentno=‘1000’;#指定对象进行修改
#修改多个数据
UPDATE student SET address=‘china’,email =‘2442907@163.com’#修改地址和email
WHERE studentno=‘1002’;#指定对象进行修改
#条件可以使用运算符
UPDATE student SET sex=1#指定修改内容
WHERE studentno =1000 OR studentno=1002 OR studentno=10001 #指定修改的数据对象(or是或)
UPDATE student SET sex=2#指定修改内容
WHERE studentno >=1000 AND studentno<=10001 #指定修改的数据对象的范围(and是和)
#指定区间也可以用; WHERE studentno BETWEEN 1000 AND 10001进行修改
UPDATE student SET sex=1#指定修改内容
WHERE studentno BETWEEN 1000 AND 10001
#使用函数
UPDATE student SET studentname=CONCAT(‘姓名:’,studentname)
#-----------------删除数据----------------------------------------------
DELETE FROM grade WHERE gradeid=12;#删除单行,auto_increment不会删除
DELETE FROM tabl1 ;#删除所有的行,auto_increment不会删除
#------------删除数据,自增会删除,--------
TRUNCATE TABLE tabl1;#自增也会重新插入

#---------------------------------------------------------------------------

#----------------------------------存储引擎-------------------------------
#-------默认情况的存储引擎-------------------------
CREATE TABLE IF NOT EXISTS tab1(
id INT(4) PRIMARY KEY AUTO_INCREMENT,
coll VARCHAR(20) NOT NULL
)ENGINE=INNODB;
#innodb类型的表,使用delete进行清空表数据时,重启数据库会改变自增的数据
#-------myisam存储引擎----------------------------
CREATE TABLE IF NOT EXISTS tab2(
id INT(4) PRIMARY KEY AUTO_INCREMENT,
coll VARCHAR(20) NOT NULL
)ENGINE=MYISAM;
#myisam类型的表,使用delete进行清空表数据时,重启数据库不会改变自增的数据
INSERT INTO tab1(coll) VALUES(‘row1’),(‘row2’),(‘row3’);
INSERT INTO tab2(coll) VALUES(‘row1’),(‘row2’),(‘row3’);

#清空表
DELETE FROM tab1;
DELETE FROM tab2;

#-------------------------------------------------------------------------------
#--------------------------MySQL查询-DQL--------------------------------------
#-----------------------------简单查询-------------------------
#-------------------查询所有学生信息-------------
SELECT * FROM student;# *代表查询所有列,不推荐使用,效率低
#查询指定列(学号和姓名)
SELECT studentno,studentname FROM student;
#-------------为查询出来的数据取别名(关键字AS)-----------
#在取别名的时候可以给表取,也可给列取,关键字AS也都可以省略
#取别名只是影响查询结果,不会对表的原数据造成影响
SELECT studentno AS 学号,studentname AS 姓名 FROM student;#为列取别名
SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;#为表取别名

#使用AS为查询结果取一个新名字(为了使数据更加美观)
SELECT  CONCAT('姓名;',studentname)AS 新姓名 FROM student;
#查看指定列的数据,并且去除重复项(distinct)
SELECT DISTINCT studentno FROM student;
#查看指定列的数据,显示重复最多的项,默认为all
SELECT ALL studentno FROM student;

#select查询中可以出现表达式
SELECT @@auto_increment_increment;#查询步长
SELECT VERSION();#查询版本号
SELECT 100*3-1;#查询运算结果

#--------------------------使用表达式写需求------------------------
#给指定数据整体进行修改(没有保存到数据中),需要保存就要通过修改语句进行保存
SELECT studentno, studentResult+1 AS ‘提分后’ FROM result;

#------------------------------满足条件查询(where)-------------------------------

#满足条件查询(where)1.指点数据大小范围,使用&&或者写成范围(也称为模糊查询)
SELECT studentno ,studentresult FROM result WHERE studentresult>=95 
AND studentresult <=100;

SELECT studentno ,studentresult FROM result WHERE studentresult>=95 
&& studentresult <=100;
	#精确查询
	SELECT studentno ,studentresult FROM result 
	WHERE studentno=1000;
#满足条件查询(where)2.指定数据不为某个值时查询(所有的符合都是英文下的)
SELECT studentno ,studentresult FROM result 
WHERE studentno !=1000;

SELECT studentno ,studentresult FROM result 
WHERE NOT studentno =1000;

#---------------模糊查询(between and\ like \in \null)-------------------
	#like结合使用;%(0到任意字符) ——(一个字符,一个_代表一个字符) 
SELECT studentno,studentname FROM student
WHERE studentname LIKE'李%';#获取姓李的数据(也就是以李开头的数据)
	
SELECT studentno,studentname FROM student
WHERE studentname LIKE'李_';#获取姓李的数据(也就是以李开头的数据,但后面只能有一个字符)

SELECT studentno,studentname FROM student#多个字符的用_进行代替
WHERE studentname LIKE'李__';#获取姓李的数据(也就是以李开头的数据且后面有指定字符数量的,)

SELECT studentno,studentname FROM student
WHERE studentname LIKE'%李%';#数据中包含某个字符的

#查询带有特殊符号的数据(通过\进行字符转义)
SELECT studentno,studentname FROM student
WHERE studentname LIKE'%\%%';#数据中含有特殊字符的
#定义自定义的转义符
SELECT studentno,studentname FROM student
WHERE studentname LIKE'%:%%' ESCAPE ':';

INSERT INTO `student` VALUES (9999, '112111', '小——', 1, 1, '13504000001', '北京海淀区中关村大街1号', '1986-12-11 00:00:00', 'test1@bdqn.cn', '450333198612111234');
INSERT INTO `student` VALUES (7777, '123456', '小%', 1, 2, '13500010002', '河南洛阳', '1981-12-31 00:00:00', 'test1@bdqn.cn', '450323198110311234');		
	
#in的模糊查询
SELECT studentno ,studentname FROM student
WHERE studentno IN (1001,1002,1003,1004);#指定数据范围的数据查询

# is null获取所有地址为null的值
SELECT studentno ,studentname FROM student
WHERE address IS NULL;

# is not null获取所有地址不是为null的值
SELECT studentno ,studentname FROM student
WHERE address IS NOT NULL;
#区别空字符串与null
SELECT studentno ,studentname FROM student
WHERE loginpwd='';#查询字符串没有写的数据

#-----------------------连接查询---------------------------------------------------
#--------------内连接inner join------------------------
#内连接;查找两个表中的结果的交集(两个表共同拥有的数据)
#inner join 不写inner的情况下默认就是inner join
SELECT StudentName,GradeName
FROM student INNER JOIN grade
ON student.GradeId=grade.GradeID;
#--------------外连接 out join-------------------------
#----------左外联 left join-------------
#左连接的左边的表为左表,以左表作为基准,右表一一匹配,匹配不上的,返回左表记录,右表以null填充
SELECT StudentName,StudentResult
FROM student LEFT JOIN result
ON student.Studentno =result.StudentNo
WHERE StudentResult IS NULL;

#----------右外联 right join------------

#右连接的右边的表为右表,以右表作为基准,左表一一匹配,匹配不上的,返回右表记录,左表以null填充
SELECT StudentName,StudentResult
FROM student RIGHT JOIN result
ON student.Studentno =result.StudentNo ;

#---------------自连接----------------------------------
CREATE TABLE IF NOT EXISTS category(#创建表格
categoryid INT (10) UNSIGNED NOT NULL AUTO_INCREMENT,
pid INT(10) NOT NULL,
categoryname VARCHAR (50) NOT NULL ,
PRIMARY KEY( categoryid)	
);
INSERT INTO category 
VALUES(2,1,'美术设计'),(3,1,'软件开发'),(4,3,'java基础'),
(5,2,'PS基础'),(6,2,'美图'),(7,3,'数据库基础');
SELECT *FROM category;
#代码书写
SELECT a.categoryname AS '父栏目', b.categoryname AS'子栏目' 
FROM category AS a ,category AS b
WHERE a.categoryid =b.pid ;			

	#---------等值连接(与内联效果一样)----------------------

SELECT StudentName,StudentResult
FROM student ,result
WHERE student.Studentno =result.StudentNo ;

#------------非等值连接-----------------

SELECT StudentName,StudentResult
FROM student ,result;

#-----------------------------多表联查-----------------------------------------
SELECT st.studentno,studentname,subjectname,studentresult
FROM student st
INNER JOIN result rs
ON st.StudentNo = rs.StudentNo#中间方与其余几张表有关系的表,必须在表连接完成后才能连接下一张表
INNER JOIN subject sub
ON rs.SubjectNo = sub.SubjectNo;

#--------------------------------多表联查加排序------------------------------------
#-----------------查询指定数据内容的多表查询-----------------------
SELECT st.studentno,studentname,subjectname,studentresult
FROM student st
INNER JOIN result rs
ON st.StudentNo = rs.StudentNo
INNER JOIN subject sub
ON rs.SubjectNo = sub.SubjectNo
WHERE subjectname =‘数据库结构-1’;
#----------------------对查询结果由降序排序(默认数升序asc,降序是desc)------------------------

SELECT st.studentno,studentname,subjectname,studentresult
FROM student st
INNER JOIN result rs
ON st.StudentNo = rs.StudentNo
INNER JOIN subject sub
ON rs.SubjectNo = sub.SubjectNo
WHERE subjectname =‘数据库结构-1’
ORDER BY studentresult DESC ,studentno DESC;#降序排序,默认是升序的
#--------------------分页显示(最后的操作,不能放在其余的查询条件前)---------------------------------------
# 起始行等于页数减一乘与显示的行数
SELECT st.studentno,studentname,subjectname,studentresult
FROM student st
INNER JOIN result rs
ON st.StudentNo = rs.StudentNo
INNER JOIN subject sub
ON rs.SubjectNo = sub.SubjectNo
WHERE subjectname =‘数据库结构-1’
ORDER BY studentresult DESC
#limit 0,5;# 第一页#0为从那条数据开始(起始行,第一行下标为0,)5为要显示的数据条数
#limit 5,5;# 第二页()每次只能出现一页,要看第几页就要写limit
LIMIT 10,5;#等同于 limit 5 offset 0;

#---------------------------获取java的前10名的同学分数且在80以上-------------------
SELECT s.studentno ,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result re
ON s.studentno =re.studentno
INNER JOIN subject su
ON re.SubjectNo=su.SubjectNo
WHERE su.SubjectName = ‘JAVA第一学年’ AND StudentResult > 80
ORDER BY StudentResult DESC
LIMIT 0,10;

#---------------------------------子查询---------------------------------------
#------------------子查询1--------------------
#查询指定内容的数据(数据库-1) 的所有考试结果(学号,科目标号,成绩),并降序排序
SELECT studentno,subjectno ,StudentResult
FROM result WHERE subjectno= (SELECT subjectno FROM subject WHERE subjectname=‘数据库结构-1’)
ORDER BY StudentResult DESC;
#子查询顺序是由里到外的
#------------------连接查询和子查询2--------------------
SELECT s.studentno,studentname FROM student s
INNER JOIN result r
ON s.studentno=r.StudentNo WHERE StudentResult>80 AND subjectno=
(SELECT subjectno FROM subject WHERE subjectname=‘高等数学-1’);
#------------------子查询3多表联查--------------------
#将要求进行分步写出来,然后将数据要求进行填入
SELECT studentno ,studentname FROM student WHERE studentno IN(
SELECT studentno FROM result WHERE studentresult>80 AND
subjectno=(SELECT subjectno FROM subject WHERE subjectname=‘高等数学-1’)

)

#-------------------------------------------MySQL函数----------------------------------
#----------------------数学函数----------------------------------
#--------------绝对值-----------------------
SELECT ABS(-8.5);
#--------------小于等于本身的最大值-----------------------
SELECT CEILING(9.3);
#--------------大于等于本身的最小值-----------------------
SELECT FLOOR(3.9);
#--------------随机数-----------------------
SELECT RAND();#默认情况下返回的是一个0-1之间的随机数
SELECT RAND (10);#将10作为种子,返回的值只有一个,不会变化
#--------------判断数据的符号-----------------------
SELECT SIGN(1000);#正数为1,负数为-1,0的返回值是0
#----------------------字符串函数----------------------------------
SELECT CHAR_LENGTH(‘好好学习,天天向上!’);#返回字符串的长度
SELECT CONCAT(‘我’,‘爱’,‘你一万年’);#合并字符串
SELECT INSERT(‘我爱你一万年’,1,3,‘我会爱你’);#替换字符串,1代表替换的开始位置,3代表替换的字符长度,前面的字符串为原来的字符,后面为要替换的字符
SELECT LOWER(‘I LIVE YOU’);#替换成小写
SELECT UPPER(‘i live you’);#替换成大写
SELECT LEFT(‘我爱你一万年!’,3);#从左截取字符串
SELECT RIGHT(‘我爱你一万年!’,3)#从右截取字符串
SELECT REPLACE(‘我爱你一万年!’,‘我’,‘我会’);#指定替换的字符,(将某个字符替换成另一个字符)
SELECT SUBSTR(‘我爱你一万年!’,1,3);#截取指定长度
SELECT REVERSE(‘我爱你一万年!’);#反转内容
SELECT CURDATE();#获取当前日期;
SELECT NOW();#获取时间和日期

#----------------------聚合函数----------------------------------
	SELECT COUNT(studentname) FROM student;#非空值的计数函数
	SELECT SUM(StudentResult) FROM result;#求和函数
	SELECT AVG (StudentResult) FROM result;#求平均数的函数
	SELECT MAX (StudentResult) FROM result;#求最大值
	SELECT MIN (StudentResult) FROM result;#求最小值

#-------------------------------------分组------------------------------------------
#查询每一个年级有多少人,并进行分组
SELECT GradeName ,COUNT(StudentNo)
FROM grade ,student WHERE grade.GradeID =student.GradeId
GROUP BY grade.GradeID;
#------------------------------having分组后筛选----------------------

#查询不同课程的平均分 最高分 最低分
			#HAVING在分组后在进行条件的筛选

SELECT SubjectName ,MAX(result.StudentResult),MIN(result.StudentResult),AVG(result.StudentResult)
FROM subject,result WHERE subject.SubjectNo=result.SubjectNo
GROUP BY subject.SubjectNo
HAVING AVG(result.StudentResult)>80;

#--------------------------------mysql事务-------------------------------------------
#创建新的表格
CREATE TABLE account(
id INT(4) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(31) NOT NULL ,
cash DECIMAL(9,2) NOT NULL
)
INSERT INTO account (name,cash) VALUES(‘A’,2000),(‘B’,10000);
#关闭自动提交
SET autocommit=0;
#事务开启
START TRANSACTION;
UPDATE account SET cash=cash-500 WHERE NAME=‘a’;#修改数据
UPDATE account SET cash=cash+500 WHERE NAME=‘b’;
COMMIT;#提交事务
ROLLBACK;#事务回滚,事务的回滚不能与事务的提交同时使用,
SET autocommit=1;#开启自动提交
SELECT * FROM account

#---------------------------------索引-----------------------------------------
CREATE TABLE test1(
id INT(4) PRIMARY KEY,#添加主键索引
testno VARCHAR (11) UNIQUE,#添加唯一索引
c VARCHAR(50),
d VARCHAR(20),
e TEXT,
f VARCHAR(50),
INDEX index (c,d),#在建立列之后进行添加常规索引,且可以添加多个列的索引
FULLTEXT (e)#在建立列之后进行添加索引,索引不命名
)ENGINE=MYISAM;#改变表的类型
ALTER TABLE test1 ADD INDEX(f);#在建立表之后进行修改添加索引

#-----------------------索引的使用-----------------------------
	#在添加过索引之后,会自动进行使用索引查询,但全文索引不会
EXPLAIN SELECT *FROM student WHERE studentno='1000';
	#使用全文索引进行查找指定内容的数据
SELECT *FROM student WHERE MATCH (studentname) AGAINST('love');

#-----------------------------显示索引--------------------------
SHOW INDEX FROM student;#显示指定表单索引
#-----------------------------删除索引--------------------------
DROP INDEX f_2 ON test1;#删除指定表下的指定索引	
ALTER TABLE test1 DROP INDEX f;#删除指定表下的指定索引	
ALTER TABLE test1 DROP INDEX PRIMARY KEY;#删除主键索引