mysql练习题

mysql练习题

创建表

  • 创建student表

  • CREATE TABLE student (
    id INT(10) NOT NULL UNIQUE PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    sex VARCHAR(4),
    birth YEAR,
    department VARCHAR(20),
    address VARCHAR(50)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
  • 创建score表

  • CREATE TABLE score (
    id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
    stu_id INT(10) NOT NULL,
    c_name VARCHAR(20),
    grade INT(10)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

表创建记录

  • student插入记录的INSERT语句

  • INSERT INTO student VALUES( 901,'张老大', '男',1985,'计算机系', '北京市海淀区');
    INSERT INTO student VALUES( 902,'张老二', '男',1986,'中文系', '北京市昌平区');
    INSERT INTO student VALUES( 903,'张三', '女',1990,'中文系', '湖南省永州市');
    INSERT INTO student VALUES( 904,'李四', '男',1990,'英语系', '辽宁省阜新市');
    INSERT INTO student VALUES( 905,'王五', '女',1991,'英语系', '福建省厦门市');
    INSERT INTO student VALUES( 906,'王六', '男',1988,'计算机系', '湖南省衡阳市');
    
  • score插入记录的INSERT语句

  • INSERT INTO score VALUES(NULL,901, '计算机',98);
    INSERT INTO score VALUES(NULL,901, '英语', 80);
    INSERT INTO score VALUES(NULL,902, '计算机',65);
    INSERT INTO score VALUES(NULL,902, '中文',88);
    INSERT INTO score VALUES(NULL,903, '中文',95);
    INSERT INTO score VALUES(NULL,904, '计算机',70);
    INSERT INTO score VALUES(NULL,904, '英语',92);
    INSERT INTO score VALUES(NULL,905, '英语',94);
    INSERT INTO score VALUES(NULL,906, '计算机',90);
    INSERT INTO score VALUES(NULL,906, '英语',85);
    

查询

查询student所有记录

select * from student;

查询student表的第2条到第4条记录

select * from student limit 1,3;

查询student表所有学生的学号(id)、姓名(name)、和院系(department)的信息

select id,name,department from student;

从student表中查询计算机系和英语系的学生信息

select * from sthdent where department in ("计算机系","英语系"); 

从student表中查询年龄18-22岁的学生信息

select * from student where 2022-birth between 18 and 22;
select * from student where 2022-birth>=18 and 2022-birth<=22;

从student表中查询每个院系有多少人

select department,count(id) from student group by department

从score表中查询每个科目的最高分

select c_name,MAX(grade) from score group by c_name

查询李四的考试科目和考试成绩

select c_name,grade from score where stu_id=(select id from student where name='李四')

用连接的方式查询所有学生的信息和考试信息

select * from score,student where score.stu_id=student.id

计算每个学生的总成绩

select student.id,name,sum(grade) from score,student where score.stu_id=student.id group by id

计算每个科目的平均成绩

select c_name,avg(grade) from score  group by c_name

查询计算机成绩低于95的学生信息

select * from student where id in (select stu_id from score where grade<95 and c_name='计算机')

同时查询参加计算机和英语考试的学生的信息

select * from student where id =any(select stu_id from score where stu_id in(select stu_id from score where c_name='英语') and c_name='计算机')
select a.* from student a,score b,score c where a.id=b.stu_id and b.c_name='英语' and a.id=c.stu_id and c.c_name='计算机'

将计算机考试成绩按从高到低进行排序

select * from score where c_name='计算机' order by grade desc

从student表和score表中查询出学生的学号,然后合并查询结果

select id from student union select stu_id from score

查询姓张或着姓王的同学的姓名、院系、考试科目及成绩

SELECT a.id,name,sex,birth,department,address,c_name,grade 
FROM student a,score b where (name LIKE '张%' OR name LIKE '王%') AND a.id = b.stu_id

查询都是湖南的学生姓名,年龄,院系和考试科目及成绩

SELECT a.id,name,birth,department,address,c_name,grade 
FROM student a,score b where (address LIKE '湖南%') AND a.id = b.stu_id

查询student表中学生的学号,姓名,年龄,院系和籍贯,并按照年龄从小到大排序

select id,name,2022-birth,department,address from student where 2022-birth order by 2022-birth

查询score表中学生的学号,考试科目和成绩并按照成绩从高到底进行排序

select stu_id,c_name,grade from score ORDER BY grade desc

基础知识

  • order by

    • 对指定的结果进行排序,默认升序,使用降序排序可以使用desc关键字
  • limit

    • 在sql server中,查询前10条记录,使用top10即可,但在mysql中不支持这个语法,而是使用limit10,limitx/y时,取值为前开后闭,也就是X+1到Y的值
  • group by:分组查询

    • 查询的时候需要按照指定的分类进行统计返回结果
    • group by 字段1,字段2.。having 筛选条件
    • having
      • 对分组以后的数据进行筛选
  • like:模糊查询

    • 有点类似正则表达式匹配的规则
    • 使用%代替*,如果没有%,like子句就与等号的效果是一样的
    • %:代表零个或者多个字符
    • _:仅代表一个字符
    • 【chare】通配符
      • 字符列中的任何单一字符
  • in

    • 在指定的范围内匹配,只要配到任何一个即可
    • 字段名 in (集合)
  • distinct

    • 去除重复值,比如我们在上面的示例中查询出score表中有几个考试科目,就可以使用distinct,mysql使用时distinct需要放在select后面的第一个位置

    • select distinct c_name from score 
      
  • 子查询

    • 子查询是指嵌入到别的sql语句中的查询语句

    • 常用关键字

      • in

        • 字段名 in (子查询)
      • any

        • 字段名 >= any(子查询)
      • all

        • 字段名 >= all(子查询)
      • exists

        • 原来的对比条件子弹要放到exists中作为筛选条件

        • exists (select barcode from storesum  where  remained=0  and goods.barcode=barcode)
          
  • 连接查询

    • 内连接

      • inner join:效率高于where,如果是俩张表的联合查询,优先使用inner join。去俩个集合中共同存在的数据

      • select t1.x1,t1.x2,t2.y1,t2.y2 from t1 inner join t2 on t1.x=t2.y
        
      • select t1.x1,t1.x2,t2.y1,t2.y2 from t1 inner join t2 where t1.x=t2.y
        
    • 外连接

      • 左连接
        • left join:以左表数据为主,同时获取右表中匹配的数据
      • 右连接
        • right join:以右表数据为主,同时获取左表中匹配的数据
  • 组合查询

    • union:主动查重

      • 连接俩个以上的select语句的结果组合到一个结果集合中,多个select语句会删除重复的数据
    • union all:当加上all时,不会删除掉重复的数据

    • union左右俩边的返回列数必须一样多,类型必须一样,同时对应的顺序也要一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值