1.准备条件
-- 创建数据库use mydb;SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for student-- ------------------------------ 创建学生表DROP TABLE IF EXISTS `student`;CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生表的主键列',`name` varchar(255) ,`age` int(11) ,`address` varchar(255),PRIMARY KEY (`id`) USING BTREE) ;-- ------------------------------ Records of student-- ----------------------------INSERT INTO `student` VALUES (1, '张三', 18, '北京');INSERT INTO `student` VALUES (2, '李四', 19, '北京');INSERT INTO `student` VALUES (3, '王五', 19, '北京');INSERT INTO `student` VALUES (4, '钱七', 19, '北京');INSERT INTO `student` VALUES (5, '关羽', 25, '南京');INSERT INTO `student` VALUES (6, '张飞', 25, '南京');INSERT INTO `student` VALUES (7, '赵云', 28, '南京');INSERT INTO `student` VALUES (8, '项羽', 19, '南京');INSERT INTO `student` VALUES (9, '刘备', 30, '上海');INSERT INTO `student` VALUES (10, '曹操', 40, '许昌');INSERT INTO `student` VALUES (11, '夏侯', 36, '许昌');INSERT INTO `student` VALUES (12, '诸葛亮', 38, '上海');INSERT INTO `student` VALUES (13, '周瑜', 78, '江东');INSERT INTO `student` VALUES (14, '小乔', 56, '江东');INSERT INTO `student` VALUES (15, '孙尚香', 59, '江东');
1.2 查询的入门
-- 简单查询 select 查询的列 from 表名-- 查询表中所有的记录,注意select后跟了* 表示统配,所有的列-- 实际开发中不建议大家使用*,因为*会导致索引失效。而是把每一个列名一一列出select * from student;select id,name,age,address from student;-- 部分查询select name,age from student;-- 查询的列表起别名select name as 姓名, age as 年龄 from student;-- as可以省略select name 姓名,age 年龄 from student;-- 范围查询select * from student where age>=19 and age<=30;-- 使用distinct去除重复字段值,要求查询所有列值,都必须相同select distinct address from student;
1.3 去除重复的值
-- 使用distinct 去除重复字段值 要求查询的所有列值 都必须相同时select distinct address from student;
1.4 条件查询
上面讲解的查询都是查询所有记录,而在实际开发中我们会根据条件查询符合的记录。
-- 判断select * from student where age>19;select * from student where age>=19;select * from student where age!=19;select * from student where age<19;-- 多条件查询 and(与) or(或)select * from student where age>=19 and address='北京';select * from student where age<=19 or address='北京';-- 此时我们有这样需求 查询年龄是 18 或者25 或者30 或者 36 的学生select * from student where age=18 or age=25 or age=30 or age=36;-- 上边麻烦我们可以用in的来替换上边的模式select * from student where age in(18,25,30,36);-- 模糊查询-- 查询名字中第二字符为一 _select * from student where name like '__一';-- 查询名字姓张 %统配任意字符select * from student where name like '张%';select * from student where name like '%一%';
1.5 排序查询
-- 排序查询 order by 列名 desc:降序 不加 descselect * from student order by age ;-- 根据多列进行排序年龄按照降序 姓名按照升序select * from student order by age desc, id desc;-- 按照年龄进行排序 如果年龄相同 再按照id进行排序
注意: 既有where 又有order by 那么谁在前 谁在后
-- where在前 order by在后。select * from student where age>19 order by age desc;
例题:
题1.
-- 创建课程表CREATE TABLE course (cs_id int(11) NOT NULL COMMENT '课程编号',cs_name varchar(50) NOT NULL COMMENT '课程名称',cs_credit tinyint(255) unsigned DEFAULT NULL COMMENT '课程学分',cs_type char(12) DEFAULT NULL COMMENT '课程类别',cs_depart char(6) DEFAULT NULL COMMENT '院系名称');insert into course(cs_id,cs_name,cs_credit,cs_type,cs_depart) values (513,'数据库原理及应用',4,'核心专业','信工'),(5203314,'计算机导论',4,'通识教育','信工'),(5219314,'数据结构',5,'专业核心','信工'),(5223013,'大学物理',4,'专业基础','信工'),(5227614,'毕业实习',4,'集中实践','信工'),(5230912,'云计算',2,'共同选修','信工'),(5236212,'机器学习',2,'共同选修','信工'),(5237514,'c语言',4,'专业基础','信工'),(5245112,'区块链',2,'任意选修','信工'),(722,'知识产权法',2,'任意选修','文法'),(2033,'概率论',3,'专业基础','基础'),(2336,'高等数学',6,'专业基础','基础'),(29299131,'劳动教育',1,'集中实践','学务');-- 1.查询全部课程的信息select cs_id,cs_name,cs_credit,cs_type,cs_depart from course;-- 2.查询信工学院开设的课程名、课程号及学分select cs_name,cs_id,cs_credit from course where cs_depart='信工';-- 3.查询学分超过3学分的课程代码、课程名和开课单位 select cs_id,cs_name,cs_depart from course where cs_credit>3;-- 4.查询学分在2到4之间课程的信息select * from course where cs_credit>=2 and cs_credit<=4;-- 5.查询课程名称中带“数据”的课程名、课程号及开课单位select cs_id,cs_name,cs_depart from course where cs_name like '%数据%';-- 6.查询不是信工学院开设的集中实践课的开课单位和课程名称 select cs_name,cs_depart from course where cs_depart!='信工' and cs_type='集中实践';-- 7.查询信工学院开设的课程的类型有哪些select cs_type from course where cs_depart='信工';
题2:
-- 创建学生表CREATE TABLE student(stu_id bigint(11) unsigned NOT NULL COMMENT '学号',stu_name char(12) NOT NULL COMMENT '姓名',stu_sex enum('男','女') DEFAULT NULL COMMENT '性别',stu_age tinyint(255) unsigned DEFAULT NULL COMMENT '年龄',stu_major char(9) DEFAULT NULL COMMENT '专业',stu_college char(12) DEFAULT NULL COMMENT '学院' ) insert into student(stu_id,stu_name,stu_sex,stu_age,stu_major,stu_college) values(04550101,'郭奎','男',22,'计科','信工学院'),(04550102,'吕宇航','男',18,'计科','信工学院'),(04550103,'张豪辉','女',19,'计科','信工学院'),(04550107,'丁志杰','男',17,'金融学','金贸学院'),(04550109,'范伟','男',19,'金融学','金贸学院'),(04550116,'张依婷','女',17,'大数据','信工学院'),(04550120,'张维','男',19,'计科','信工学院'),(04550121,'朱柳阳','女',20,'计科','信工学院'),(04550144,'谭兵炎','男',20,'大数据','信工学院'),(04550153,'杨志强','男',17,'大数据','信工学院');-- 1.查询计科专业和大数据专业的学生信息select * from student where stu_major='计科' or stu_major='大数据';-- 2.查询不是信工学院的学生姓名和学号select stu_id,stu_name from student where stu_college!='信工学院';-- 3.查询年龄是17,18,19的学生姓名和专业select stu_name,stu_major from student where stu_age in(17,18,19);-- 4.查询信工学院的的专业有哪些select stu_major from student where stu_college='信工学院';-- 5.查询年龄为空的学生信息select stu_id,stu_name,stu_sex,stu_age,stu_major,stu_college from student where stu_age=null;-- 6.查询学生的信息,查询结果按姓名升序排序select * from student order by stu_name;
2. 查询列上进行运算
-- 查询列上进行运算select age,name from student;select age+3,name from student;select age-3,name from student; select age*3,name from student;
有了这个特性 就可以在设计数据库表的时候 如果有些值可以通过多列运算出来 此时就没有必要设计了
比如: 订单表
订单号 订单的价格 订单的数量 订单的总价
在实际开发中订单的总价可以通过订单的价格*订单的数量计算出来 那么就没有必要再数据库中再定义订单总价这列
create table t_order(orderno int primary key,name varchar(20),price DECIMAL(6,2),num int-- total decimal(6,2) -- 这里没有必要再定义总价因为)select orderno,name,price,num,price*num total from t_order;
3. 聚合函数
聚合函数总共有5个:
max(列名):求某列的最大值
min(列名):求某列的最小值
sum(列名):求某列的和
avg(列名):求某列的平均值
count(列名):求某列的个数
-- 求最大的年龄select max(age) from t_student;-- 求最小的年龄select min(age) from t_student;-- 求年龄的和select sum(age) from t_student;-- 求学生的个数.select count(id) from t_student;-- 求年龄平局值select avg(age) from t_student;
4.分组查询
在sql中有个 group by 语句 将某一列相同数据 视为一组 然后进行查询 与聚合函数连用
-- 求各个地区的人数select count(*),address from t_student group by address;-- 查询 各个地区的平均年龄select avg(age),address from t_student group by address;-- 可以使用 having 对分组进行条件检索。 -- 查询 平均年龄大于36的地区人数select address,count(*),avg(age) from t_student group by address having avg(age)>36;-- 查询 最大值小于25 的地区 人数 和 平均年龄select address,count(*),avg(age),max(age) from t_student group by address having max(age)<25;-- 查询 人数大于3的地区 最大年龄select address,max(age) from student group by address having count(*)>3;-- 查询每个地区 25岁以上人数的数量select address,count(*) from t_student where age>25 group by address;
5. 分页查询
当数据库表数据量比较大,内存可能会不够,导致电脑卡死,如果在java中 有可能内存直接溢出 所以实际开发中 都是分页查询 。
-- 分页使用: limit select * from t_student limit 3,5; -- 从第三条记录查询 查询5条记录select * from t_student limit 0,5; -- 从第0条记录查询 查询5条记录-- 分页: n:表示查询页码 m:表示每页得条数select * from 表名 limit (n-1)*m,m;-- -- 查询第n页得m条记录 select * from student limit 0,5;-- 第1页每页显示5条记录select * from student limit 5,5;-- 第2页每页显示5条记录select * from student limit 10,5;-- 第3页每页显示5条记录select * from student limit 15,5;-- 第4页每页显示5条记录select * from student limit 20,5;-- 第5页每页显示5条记录
6. sql得优先级
sql语法:
select distinct * from 表名
where 条件
group by 分组
having 分组条件
order by 排序
limit 分页
上面为他得语法结构,顺序不能乱。
mysql执行引擎:执行得顺序
例题:
-- 创建学生表2create table student2(id int(10) primary key,name varchar(20) not null,sex varchar(4),birth year,department varchar(20) not null,address varchar(50));-- 创建成绩表create table score(id int(10) primary key,stu_id int(10) not null,c_name varchar(20),grade int(102));insert into student2(id,name,sex,birth,department,address)values(901,'张老大','男',1985,'计算机系','北京市海淀区'),(902,'张老二','男',1986,'中文系','北京市昌平区'),(903,'张三','女',1990,'中文系','湖南省永州市'),(904,'李四','男',1990,'英语系','辽宁省阜新市'),(905,'王五','女',1991,'英语系','福建省厦门市'),(906,'王六','男',1988,'计算机系','湖南省衡阳市');insert into score(id,stu_id,c_name,grade)values(1,901,'英语',80),(2,902,'计算机',65),(3,902,'中文',88),(4,903,'中文',95),(5,904,'计算机',70),(6,904,'英语',92),(7,905,'英语',94),(8,906,'计算机',90),(9,901,'计算机',null),(10,901,'中文',null),(11,902,'英语',null);-- 1.查询student2表的所有记录select id,name,sex,birth,department,address from student2 ;-- 2.查询student2表的第2条到4条记录select * from student2 limit 2,4;-- 3.从student2表查询所有学生的学号(id)、姓名(name)和院系(department)的信息select id,name,department from student2;-- 4.从student2表中查询计算机系和英语系的学生的信息select * from student2 where department='计算机系' or department='英语系';-- 5.从student2表中查询每个院系有多少人select count(*),department from student2 group by department;-- 6.从score表中查询每个科目的最高分select c_name,max(grade) from score group by c_name;-- 7.计算每个考试科目的平均成绩select c_name,avg(grade) from score group by c_name;-- 8.将计算机考试成绩按从高到低进行排序 select * from score where c_name='计算机' order by grade desc;