MySql数据库--第三章:高级查询(一)

a129_d0226
CREATE TABLE demo01(
	id INT(4)PRIMARY KEY NOT NULL,
	NAME VARCHAR(10)
);

#修改表名:alter table 旧表名 rename 新表名

ALTER TABLE demo01 RENAME demo02;

#添加字段:alter table 表名 add 字段 类型 属性

ALTER TABLE demo02 ADD PASSWORD VARCHAR(10) NOT NULL;

#查看表结构

DESC demo02;

#修改字段: alter table 表名 change 旧字段 新字段 类型 属性;

ALTER TABLE demo02 CHANGE NAME username VARCHAR(10) NOT NULL;

#删除字段:alter table 表名 drop 字段;

ALTER TABLE demo02 DROP address;

myschool

添加主外键

#添加主键约束:alter table 表名 add constraint 主键名 primary key 表名(字段);

ALTER TABLE grade ADD CONSTRAINT pk_GradeID PRIMARY KEY grade(GradeId);

#添加外键约束
#如何将student表的gradeId字段和grade表的gradeId字段建立外键关联
#alter table 表名 add constraint 外键名 foreign key(外键字段) references 关联表名(关联字段);

ALTER TABLE student ADD CONSTRAINT fk_gradeId FOREIGN KEY(gradeId) REFERENCES grade(gradeId);

#查询默认存储引擎

SHOW VARIABLES LIKE 'storage_engine%';

插入数据记录

#学生表中添加一条记录(插入单行数据): insert into 表名(字段列表) values(值列表)
#注意:值列表每个值与字段列表与字段列表一一对应

INSERT INTO student(loginPwd,studentName,sex,gradeId,phone,address,bornDate,email,identityCard)
	VALUES('126','刘飞','男',1,'12334243464','武汉市汉口','1997-04-16','liufei@qq.con.com','31444');

#年级表中添加多条记录(插入多行数据

INSERT INTO grade(gradeName) VALUES('A129'),('131');
ALTER TABLE SUBJECT ADD CONSTRAINT sub_gradeId FOREIGN KEY(gradeID) REFERENCES grade(gradeId);

#向科目表中添加多条信息 年级必须在于年级表中

INSERT INTO SUBJECT (subjectName,classHour,gradeId) VALUES('Lgoic java',200,1),('java面向对象',256,2),('ssm框架',128,3);

#将查询的数据存放到新表中:
#第一种:事先创建表 INSERT INTO 新表(字段1,字段2,…) SELECT 字段1,字段2,…FROM 原表;

 INSERT INTO stuaddress(stuName,StuAddress) SELECT studentName,address FROM student

#第二种:表临时创建 create table 新表(select 字段1,字段2,。。。 from 原表)

 CREATE TABLE stuAddressTemp(SELECT studentName,address FROM student)

#查询结果排序 查询 年级编号gradeId为1的所有学生信息,结果按学号升序排列

 SELECT * FROM student
 WHERE gradeid=1
 ORDER BY studentNo ASC

LIMIT子句

#使用limit限制展示结果集(应用:分页)

  语法
	SELECT <字段名列表>
	FROM   <表名或视图>
	[WHERE <查询条件>]
	[GROUP BY <分组的字段名>]
	[ORDER BY <排序的列名>[ASC 或 DESC]]
	[LIMIT[位置偏移量,]行数];

#查询结果排序 查询 年级编号gradeId为1的所有学生信息,结果按学号升序排列
#需求1 :限制展示前3条记录 limit 3 默认从第一行记录开始 全称limit 0,3 0表示起始行记录(下标从0开始) 3表示显示记录数

 SELECT * FROM student
 WHERE gradeid=1
 ORDER BY studentNo ASC
 LIMIT 3;

#需求2: 限制展示 从第n条记录开始,展示3条记录 limit n-1, 3

 SELECT * FROM student
 WHERE gradeid=1
 ORDER BY studentNo ASC
 LIMIT 1,3;

#聚合函数

#1.获取科目平均学时

 SELECT AVG(classHour) AS 平均课时
 FROM SUBJECT
 

#2.返回课时150以上的科目数量

 SELECT COUNT(*) AS 课时150以上的科目数量
 FROM SUBJECT
 WHERE classHour>=150

#3. Max() 返回课时最高的科目课时

 SELECT MAX(classHour) AS 课时最多科目
 FROM SUBJECT

#4.MIN() 返回课时最低的科目课时

 SELECT MIN(classHour) AS 课时最少科目
 FROM SUBJECT
 

#5.SUM() 汇总所有科目的课时总数

 SELECT SUM(classHour) AS 课时总数
 FROM SUBJECT

字符串拼接 CONCAT()

#1.字符串拼接 CONCAT()

SELECT CONCAT('中华','人民','共和国') AS 字符串拼接测试

#2.在现有字符串中替换部分字符串 INSERT(字符串,m,n,字符串2)
#字符串1表示操作的字符串,
m表示删除的起始位置,从MySql指令中字符串中的字符下标从1开始
n表示删除的字符个数,字符串2表示新增替换后的字符串,位置从m开始

SELECT INSERT('中华人民共和国',3,2,'的') AS 部分字符串替换测试

#3.截取字符串 SUBSTRING(字符串,m,n)
#m 截取的起始位置 n 截取的个数

SELECT SUBSTRING('中华人民共和国',5,3) AS 字符串截取测试

#4.其他字符串函数 upper()转换成大写 LOWER()转换成小写

SELECT UPPER('Add') AS 全部转换大写;
SELECT LOWER('Add') AS 全部转换小写;

时间日期函数

#获取 当前日期 2021-03-02 CUR(当前的)

SELECT CURDATE() AS 当前日期;

#获取 当前时间 14:48:28

SELECT CURTIME() AS 当前时间;

#获取 日期和时间 2021-03-02 14:48:07

SELECT NOW() AS 日期和时间;

#获取日期所在的周数(第几周)

SELECT WEEK(NOW()) AS 周数;

#获取日期中的年份

SELECT YEAR ('2019-01-01') AS 那一年;

#获取时间中的小时

SELECT HOUR(NOW()) AS 小时;

#获取时间中的分钟

SELECT MINUTE(NOW()) AS 分钟;

#获取两个日期相差的天数 DATEDIFF(date1,date2) date1减date2
#回顾 SQL SERVER 中对应的语法 select DateDiff(DD,date1,date2) DD这里表示天数,MM表示月份,yy表示年

SELECT DATEDIFF(NOW(),'1999-03-16') AS 两个日期相差的天数;

#date加上n天后的日期 ADDDATE(date,n);

SELECT ADDDATE(NOW(),5);

数学函数

#CEIL() 向上取整 SELECT CEIL(2.1) 结果是3

SELECT CEIL(2.1);

#FOOL() 向下取整 SELECT FLOOR(2.6) 结果是2

SELECT FLOOR(2.6);

#Rand() 取0-1之间的随机数

SELECT RAND() AS '0-1之间的随机数';

例题

#向科目表添加三条信息,用一条insert语句

INSERT INTO SUBJECT(subjectName,classHour,gradeId) VALUES('HTML',160,1),('java OOP',230,1);

#将学生表中学号为2的学生的邮箱修改为zhangsan2@163.com,密码改为000

UPDATE student SET email='zhangsan2@163.com',loginpwd='000' WHERE studentNo=2;

#将科目表中课时数大于200且年级编号为1的科目的课时减少10(修改 update)

UPDATE SUBJECT SET classHour=classHour-10
WHERE classHour>200 AND GradeId=1

#将所有的年级编号为1的学员姓名,性别,出生日期,手机号码信息保存到新表student_grade1中
#第一种方法:student_grade1表格事先创建好 insert into 新表(字段。。。) select 字段 from 原表

INSERT INTO student_grade1(stuName,Sex,Birthday,PhoneNo)SELECT studentName,Sex,bornDate,Phone FROM student;

#第二种方法:student_grade2临时创建 create table 新表(select 字段 from 原表)

CREATE TABLE student_grade2(SELECT studentName,Sex,bornDate,Phone FROM student);

子查询

#查看年龄比“李四”大的学生,要求显示这些学生的信息
#获取李四的出生日期

SELECT bornDate FROM student WHERE studentName='李四';

#实现
#第一种方法

SELECT studentName AS 姓名,sex AS 性别,bornDate AS 出生日期,phone AS 手机号
FROM student
WHERE bornDate > (SELECT bornDate FROM student WHERE studentName='李四');

#第二种方法 使用 DateDiff(date1,date2) 返回的时间差去比较

SELECT studentName AS 姓名,sex AS 性别,bornDate AS 出生日期,phone AS 手机号
FROM student
WHERE DATEDIFF(bornDate,(SELECT bornDate FROM student WHERE studentName='李四'))<0;

#查询"Logic Java"课程至少一次考试刚好等于60分的学生
#–第一种方法 表连接

SELECT stu.studentName,r.studentResult,s.subjectName FROM student AS stu
INNER JOIN result AS r ON r.studentNo=stu.studentNo
INNER JOIN SUBJECT AS s ON s.subjectNO=r.subjectNO
WHERE s.subjectName='Logic Java' AND r.studentResult=60

#–第二种方法 子查询 注意子查询的时候条件限定 最好用IN替换

SELECT studentName FROM student AS stu WHERE stu.studentNo IN (
	SELECT r.studentNo FROM result AS r
	INNER JOIN SUBJECT AS s ON s.subjectNO=r.subjectNo
	WHERE r.studentResult=60 AND s.subjectName='Logic Java'	
);

注释:子查询与表连接的区别
1.子查询比较灵活,方便,常作为增删改查的筛选条件,适合于操纵一个表的数据
2.表连接更适合于查看多表的数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值