sql语句练习

-- 创建一个带有枚举类型的数据表
create table testEnum(
testID int(4) not null,
enumValue enum('郑州', '安阳', '许昌')
);
-- 插入数据,采用的方式是使用枚举里面的具体数据
insert into testEnum(testID, enumValue) values(1, '郑州');
insert into testEnum(testID, enumValue) values(2, '安阳');
insert into testEnum(testID, enumValue) values(3, '许昌');


select * from testEnum;


-- 插入数据,但是这里用的是枚举数据的特征,每一个枚举类型都是独立特有,值
-- 是不相同的,采用是枚举的数值
insert into testEnum(testID, enumValue) values(4, 1);
insert into testEnum(testID, enumValue) values(5, 2);
insert into testEnum(testID, enumValue) values(6, 3);


-- 这条语句是错误的,因为插入的枚举类型数值,超出了枚举的范围
-- 枚举的范围从1开始
insert into testEnum(testID, enumValue) values(7, 4);


-- 创建带有集合SET类型的数据表
create table testSet(
-- not null 表示该数据不能为空
-- primary key 表示主键
-- auto_increment 表示自动增长
testID int(4) not null primary key auto_increment,
likes set('AUGA3', 'AKM', 'M4A1', 'Kar98k')
);


-- 0000 1010 
-- 下面两条语句不对,虽然testID采用了自动增长,但是在通过SQL
-- 语句添加数据时,仍然要考虑数据的一致性
insert into testSet values('AUGA3');
insert into testSet values(1);


-- 正确!!!
insert into testSet(likes) values('AUGA3');


-- 不正确!!!因为这给一个字段两个数值
insert into testSet(likes) values('AUGA3', 'AKM');


-- 正确!!!
insert into testSet(likes) values('AUGA3,AKM');


-- 推荐方式
-- 因为SET数据类型 每一个数据的对应的数值是1,2,4,8~~~
-- 我们可以采用组合求和的方式来对应不同的数据
insert into testSet(likes) values(15);
insert into testSet(likes) values(7);




-- 查询数据表stuinfo里面所有信息
select * from stuInfo;


-- 获取stuinfo里面的姓名
select stuName from stuInfo;
-- 获取stuInfo里面姓名和年龄的信息,这里不同的字段用逗号隔开
select stuName, stuAge from stuInfo;


-- 获取stuInfo里面姓名和年龄,但是要求年龄是大约等于45
select stuName, stuAge from stuInfo where stuAge >= 45;


-- 获取stuInfo里面的姓名和年龄数据,但是要求年龄大于45而且成绩大于90
select stuName as "姓名", stuAge as "年龄" from stuInfo where stuAge > 45
and stuScore > 90;


-- 获取stuInfo里面的姓名和性别数据,但是要求年龄大于等于45或者成绩大于等于85
select stuName as "姓名", stuSex as "性别" from stuInfo where stuAge >= 45 
or stuScore >= 85;
-- 插入一个姓名重复的数据
insert into stuInfo values(7, '刘晓磊', '男', 18, 60);


-- 获取stuInfo里面姓名,但是要过滤掉重复的姓名
select distinct stuName from stuInfo;


-- 获取stuInfo里面的姓名数据,并且改变表字段展示的名字
-- 利用as 给字段起一个别名
select stuName as "姓名" from stuInfo;


-- 排序查询(默认升序)
select * from stuInfo order by stuScore asc; #ascending


-- 排序查询 降序
select stuName, stuAge from stuInfo order by stuAge desc; #descending


-- 多重条件排序,按照成绩升序排序,如果成绩相同,按照年龄降序排序
-- 首先会按照第一个条件排序,但是如果发现出现相同的数据时,会按照第二个
-- 条件继续排序,第一个条件是主条件,第二个条件是辅助条件
select * from stuInfo order by stuScore asc, stuAge desc;


-- 数据准备
insert into stuInfo values(8, '吴京', '男' , 42, 99);
insert into stuInfo values(9, '谢楠', '女' , 36, 99);
insert into stuInfo values(10, '王宝强', '男' , 40, 90);
insert into stuInfo values(11, '黄磊', '男' , 50, 95);
insert into stuInfo values(12, '何炅', '男' , 50, 100);
insert into stuInfo values(13, '薛之谦', '男' , 39, 96);
insert into stuInfo values(14, '刘亦菲', '女' , 33, 85);
insert into stuInfo values(15, '黄轩', '男' , 45, 95);




-- 模糊查询
-- 要求查询的数据是 stuName以爸爸结尾的数据
select * from stuInfo where stuName like "%爸爸";


-- 查询姓名以刘开始的信息
-- % 通配的是从0 到 n 个字符
select * from stuInfo where stuName like "刘%";


-- 查询姓名是以磊结尾,并且磊字之前有且只能有一个字符
-- _表示匹配一个字符
select * from stuInfo where stuName like "_磊";


-- 查询姓名中带有磊字数据
select * from stuInfo where stuName like "%磊%";




-- 模拟分页 limit
-- 表示只获取前三条数据
select * from stuInfo limit 3;


-- 以五个数据为一页,做分页处理,
-- limit 0, 5 表示从第0个数据开始,向后获取5个数据
-- limit 5, 10  表示从第5个数据开始,向后获取10个数据
select * from stuInfo limit 0, 5;
select * from stuInfo limit 5, 5;
select * from stuInfo limit 10, 5;


-- 内置函数
-- 【注意】不推荐使用!!!这样会影响数据库的效率,增长数据库的负担
-- 通常都会从数据库中获取到数据之后,然后通过Java代码来完成剩余操作


-- 获取最大值
select max(stuAge) as "最大年龄" from stuInfo;


-- 获取最小值
select min(stuScore) as "最低分" from stuInfo;


-- 平均分
select avg(stuAge) as "平均年龄" from stuInfo;


-- 获取总数
select count(*) as "总数" from stuInfo;
select count(*) as "总数" from stuInfo where stuAge > 45;


-- 数据备份
INSERT INTO `stuinfo` VALUES (1,'刘晓磊','男',16,99),(2,'晓晨',NULL,NULL,NULL),(3,'马云爸爸','男',50,99),(4,'强东老爷','男',45,90),(5,'花藤爸爸','男',60,80),(6,'丁磊大叔','男',52,95),(7,'刘晓磊','男',18,60),(8,'吴京','男',42,99),(9,'谢楠','女',36,99),(10,'王宝强','男',40,90),(11,'黄磊','男',50,95),(12,'何炅','男',50,100),(13,'薛之谦','男',39,96),(14,'刘亦菲','女',33,85),(15,'黄轩','男',45,95);


-- 删除数据表里面的所有数据行
delete from stuInfo;


-- 删除指定ID的数据行
delete from stuInfo where stuId = 5;


-- 删除成绩小于80的数据行
-- where 之后可以跟条件 ,> < >= <= = !=          不等于 <> 
delete from stuInfo where stuScore < 80;


-- 使用truncate清空整个数据表,不会影响数据表结构,但是会清空数据行
-- 并且会影响原本的自增条件,从1开始
truncate table testset;


insert into testset(likes) values(6);




-- 修改数据 stuId为2的数据
update stuInfo set stuSex = '男', stuAge = 18, stuScore = 99 
where stuId = 2;


-- 修改stuName = '花藤爸爸' 的性别
update stuInfo set stuSex = '女' where stuName = "花藤爸爸";




-- 连表查询 一对一
create table men(
menID int(4) not null primary key auto_increment,
menName char(30),
menAge tinyint, 
grilID int # 男生的老婆ID
);


create table gril(
grilID int(4) not null primary key auto_increment,
grilName char(30),
grilAge tinyint
);


-- 插入数据
insert into men(menName, menAge, grilID) values("李雷雷", 30, 1);
insert into men(menName, menAge, grilID) values("苏孝乾", 22, 2);
insert into men(menName, menAge, grilID) values("余海洋", 24, 3);
insert into men(menName, menAge, grilID) values("小胖", 30, 4);


insert into gril(grilName, grilAge) values('韩梅梅', 30);
insert into gril(grilName, grilAge) values('春哥', 35);
insert into gril(grilName, grilAge) values('如花', 55);
insert into gril(grilName, grilAge) values('晓晨', 24);


-- 连表查询 用在男生表中的女生ID和女生表中的女生ID进行匹配,展示对应的数据
select * from men, gril where men.grilID = gril.grilID;


-- 内联查询 推荐使用这个方式
-- 可以实现多个表联合查询
-- on 和 where类型
select * from men inner join gril on men.grilID = gril.grilID;




-- 一对多
create table father(
fID int, 
fName char(30)
);


create table son(
sID int,
sName char(30),
fID int
);


insert into father values(1, "何鸿燊");
insert into father values(2, "李嘉诚");


insert into son values(1, "何酋君", 1);
insert into son values(2, "何酋亨", 1);
insert into son values(3, "李泽楷", 2);
insert into son values(4, "李泽钜", 2);


-- 查询一下李嘉诚的儿子都是谁
select * from father inner join son on son.fID = father.fID 
where fName = "李嘉诚";


-- 查询一下何鸿燊的儿子都是谁,这里使用了别名来简化书写
select * from father f inner join son s on s.fID = f.fID 
where fName = "何鸿燊";


-- 一对多:父子关系,用户和订单关系,商铺和商品




-- 多对多
create table student (
stuID int,
stuName char(30)
);


create table course(
cID int,
cName char(30)
);


create table stuToCourse(
scID int, # 中间表的ID号
stuID int, # 学生ID
cID int  # 课程ID
);


insert into student values(1, "刘晓磊");
insert into student values(2, "李良良");
insert into student values(3, "苏阳阳");
insert into student values(4, "余海洋");


insert into course values(1, "Java从入门到放弃");
insert into course values(2, "C语言从入门到出家");
insert into course values(3, "MySQL从删库到跑路");
insert into course values(4, "C++从入门到跳楼");
insert into course values(5, "PHP是世界上最好的语言");


insert into stuToCourse values(1, 1, 1);
insert into stuToCourse values(2, 1, 3);
insert into stuToCourse values(3, 1, 2);


insert into stuToCourse values(4, 2, 3);
insert into stuToCourse values(5, 2, 4);
insert into stuToCourse values(6, 2, 5);


insert into stuToCourse values(7, 3, 1);
insert into stuToCourse values(8, 3, 3);
insert into stuToCourse values(9, 3, 5);


insert into stuToCourse values(10, 4, 2);
insert into stuToCourse values(11, 4, 1);
insert into stuToCourse values(12, 4, 3);


-- 看一下海洋学了什么
select * from student s 
inner join stuToCourse sc on s.stuID = sc.stuID
inner join course c on sc.cID = c.cID 
where s.stuName = "余海洋";


select * from student s
inner join stuToCourse sc on s.stuID = sc.stuID
inner join course c on sc.cID = c.cID
where s.stuName = "李良良";


-- 能否看一下C语言从入门到出家
select * from course c 
inner join stuToCourse sc on c.cId = sc.cID
inner join student s on sc.stuId = s.stuID
where c.cName = "C语言从入门到出家";


select * from course c 
inner join stuToCourse sc on c.cId = sc.cID
inner join student s on sc.stuId = s.stuID
where c.cName = "MySQL从删库到跑路";


update stuToCourse set cID = 4 where scID = 3;









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL是高级的非过程化编程语言,是沟通数据库服务器和客户端的重要工具,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以,具有完全不同底层结构的不同数据库系统,可以使用相同的SQL语言作为数据输入与管理的SQL接口。 它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使它具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的功能只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。    结构化查询语言(Structured Query Language)最早是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是像Oracle、Sybase、DB2、Informix、SQL Server这些大型的数据库管理系统,还是像Visual Foxpro、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。    美国国家标准局(ANSI)与国际标准化组织(ISO)已经制定了SQL标准。ANSI是一个美国工业和商业集团组织,负责开发美国的商务和通讯标准。ANSI同也是ISO和International Electrotechnical Commission(IEC)的成员之一。ANSI 发布与国际标准组织相应的美国标准。1992年,ISO和IEC发布了SQL国际标准,称为SQL-92。ANSI随之发布的相应标准是ANSI SQL-92。ANSI SQL-92有被称为ANSI SQL。尽管不同的关系数据库使用SQL版本有一些差异,但大多数都遵循 ANSI SQL 标准。SQL Server使用ANSI SQL-92的扩展集,称为T-SQL,其遵循ANSI制定的 SQL-92标准。    SQL语言包含4个部分:    数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。    数据操作语言(DML),例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。    数据查询语言(DQL),例如:SELECT语句。    数据控制语言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。    SQL语言包括三种主要程序设计语言类别的语句:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值