student表:
s_id为学生id,s_name为学生姓名,s_birth为出生年月,s_sex为性别
score表:
s_id 为学生id,c_id为课程id,s_score为对应的成绩。
现想要取出每个课程前3名的学生信息、课程id,成绩与对应课程内排名,如下所示:
+------+--------+------------+-------+------+---------+------+
| s_id | s_name | s_birth| s_sex | c_id | s_score | rank |
+------+--------+------------+-------+------+---------+------+
| 01 | 赵雷 | 1990-01-01 | 男| 01 | 80 |1 |
| 03 | 孙风 | 1990-05-20 | 男| 01 | 80 |2 |
| 05 | 周梅 | 1991-12-01 | 女| 01 | 76 |3 |
| 01 | 赵雷 | 1990-01-01 | 男| 02 | 90 |1 |
| 07 | 郑竹 | 1989-07-01 | 女| 02 | 89 |2 |
| 05 | 周梅 | 1991-12-01 | 女| 02 | 87 |3 |
| 01 | 赵雷 | 1990-01-01 | 男| 03 | 99 |1 |
| 07 | 郑竹 | 1989-07-01 | 女| 03 | 98 |2 |
| 02 | 钱电 | 1990-12-21 | 男| 03 | 80 |3 |
+------+--------+------------+-------+------+---------+------+
查询实现如下:
首先看表b的部分,令@current_id=c_id,当c_id不是当前的课程时,rank重新从1开始计数,某则在在当前rank上加1。
需要注意的是,此时的排序需要现基于课程id,再基于成绩逆序。
在此基础上基于s_id连接student表即可,另外在最后的条件设定中需要用having不能用where,因为在原表中是不存在rank字段的,这是我们为了取数所构造的。
mysql中解决row的问题:1、判断Select得到的行数用found_rows()函数进行判断。
2、判断Update或Delete影响的行数用row_count()函数进行判断,这里需要注意,如果Update前后的值一样,row_count则为0,而不像SqlServer里的@@rowcount或Oracle里的rowcount,只要update到行,影响的行数就会大于0,而无论update前后字段的值是否发生了变化。
此时查看影响的行数:
select row_count()==〉执行结果为1;
从上面的测试可以得出在MySQL中只有真正对记录进行修改了的情况下,row_count才会去记录影响的行数,否则如果记录存在但是没有实际修改
则不会将该次更新记录到row_count中。
解压MySQL压缩包到硬盘位置,如:C:\MySQL配置环境变量:
将“C:\MySQL”加入到环境变量Path中
重命名my-default.ini为my.ini
修改my.ini内容:
basedir =C:\MySQL
datadir =D:\MySQL_Data
port =3306
server_id =10
说明:
basedir是程序存放目录
datadir是数据库文件存放目录
port端口号,默认为3306
启动CMD,将工作目录调置到C:\MySQL\bin
安装MySQL为服务,并指定配置文件位置
mysqld -install MySQL --defaults-file="C:\MySQL\my.ini"
对于5.7.12版本来说,如果此时执行net start mysql命令启动服务,则会自动初始化,有可能配置成功,但大多数情况下可能会出现服务无法启动,没关系,使初始化命令进行初始化。
初使化之前请清空D:\MySQL_Data内的文件,执行初使化命令:
mysqld --initialize --user=mysql --console
执行完后CMD控制台上会显示一大堆英文,没关系,大至是说配置文件中缺少一些参数。后期修改my.ini。
启动服务:
net start mysql
服务成功启动。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)