Titanic数据集之MySQL练习

时间:2020-12-20 20:03:04
  • 这里要感谢师兄一听到我面试考了SQL但是并不熟练之后,建议我直接用实际数据集进行练手,这样会尽快学习到更多,然后立马给我提出了Titanic数据集的一些需求然后发给他看,给力有木有。现在分享自己练习过程中的代码以及遇到的一些问题。

 

  • 泰坦尼克取数需求

1、首先查看整张表(select *)

2、统计数据条数

3、统计男/女条数

4、查看是否有重复行

5、分别统计年龄大于25岁的男/女条数

6、统计不同乘客等级(Pclass)的平均票价

7、统计登船港口(Embarked)为空的条数

8、查看不同年龄的人数

9、统计各乘客等级(Pclass)的获救和不获救的人数

10、统计年龄在20到30岁内,性别为男,获救的人数

11、查看按性别降序排列的前20条数据

12、查看年龄为10,15,25岁的所有数据(不能用or)

13、获得ID,父母与小孩个数,堂兄妹个数。父母与小孩个数与堂兄妹个数的差值(命名为diffz)的情况

14、创建一张表:表内数据为不同性别,不同乘客等级的年龄、票价平均值(要求年龄那一列必须转换为int)

15、查看那张表每个字段都是什么数据类型(int double string)

16、将任务9里创建的表与原始表合并(join),注意键

17、删除上面任务9的那张表

 

  • MySQL代码

 
	create database titanic;
	use titanic;    -- 每次重启sql需要先选则要操作的数据库
	
	create table titanic_train
	(
		PassengerId int(3),
		Survived char(1),
		Pclass char(1),
		Name blob,
		Sex char(6),
		Age int(2),
		SibSp char(1),
		Parch int(1),
		Ticket varchar(30),
		Fare dec(10,4),
		Cabin char(5),
		Embarked char(1)
	);
	
	-- sql导入csv文件
	load data local infile 'C:\\Users\\86349\\Desktop\\train.csv' 
	into table titanic_train  -- 这里导入csv会出错,具体解决方法见"问题解决"
	fields terminated by','optionally enclosed by '"' escaped by '"'
	-- 字段之间以逗号分隔,字符串以半角双引号包围,字符串本身的双引号用两个双引号表示
	lines terminated by'\r\n'   -- 数据行之间以\r\n分隔
	
	desc titanic_train;  -- describe,可以看到每个字段的类型,用于检查
	select * from titanic_train;
	select count(*) from titanic_train;
	select Sex,count(*) from titanic_train group by Sex;
	select count(distinct PassengerId) from titanic_train;
	select Sex,count(*) from titanic_train where Age>25 group by Sex;
	select Pclass,avg(Fare) from titanic_train group by Pclass;
	select count(*) from titanic_train where Embarked='';
	select Age,count(*) from titanic_train group by Age;
	select Pclass,Survived,count(*) from titanic_train group by Pclass,Survived;
	select count(*) from titanic_train where (Age>20 and Age<30) and Sex='male' and Survived=1;
	select * from titanic_train order by Sex desc limit 0,20; -- limit用法,从0开始倒序20个
	select * from titanic_train where Age in(10,15,25);
	select PassengerId,Parch,SibSp,(Parch-SibSp) as diffz from titanic_train;
	-- 注意这一句的AS用法
	
	create table exp
	(
		sex char(6),
		pclass char(1),
		avgage int(2),
		avgfare dec(10,4)
	);
	insert into exp select Sex,Pclass,avg(Age),avg(Fare) from titanic_train group by Sex,Pclass;
	describe exp;
	select * from exp limit 10;
	
	create table tablejoin
	(
		pclass char(1),
		Survived char(1),
		peoplecount int(3)
	);
	insert into tablejoin select Pclass,Survived,count(*) from titanic_train group by Pclass,Survived;
	select * from tablejoin ;
	select * from titanic_train left join tablejoin on titanic_train.Pclass=tablejoin.pclass and titanic_train.Survived=tablejoin.Survived;
	drop table tablejoin;
	
	-- 这两句从一个表格创建新的表格的写法,不用声明每一个字段类型
	create table exp as
		select Sex,
			  Pclass,
			  avg(Age),
			  avg(Fare)
		from   titanic_train
	  group by  Sex,Pclass;


  • 问题解决:
  1. Error:The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

如果要解决这个问题,可以通过下面两种方式:

  1. Move your file to the directory specified by secure-file-priv.
  2. Disable secure-file-priv. This must be removed from startup and cannot be modified dynamically. To do this check your MySQL start up parameters (depending on platform) and my.ini.
  1. 将你要导入或导出的文件位置指定到你设置的路径里;
  2. 可以修改my.cnf里关于这个选项的配置,然后重启即可。

选择方法b:首先使用"SHOW VARIABLES LIKE "secure_file_priv"查看secure_file_priv的值,通常默认为sql安装路径,因此需要修改其值。

secure_file_prive=null   -- 限制mysqld 不允许导入导出

secure_file_priv=/tmp/   -- 限制mysqld的导入导出只能发生在/tmp/目录下

secure_file_priv=' '              -- 不对mysqld 的导入 导出做限制

修改MySQL的 my.ini 文件来设置secure_file_priv。但是修改后提示拒绝访问,即便是关闭了mysql服务还是拒绝访问。解决办法:右击my.ini文件,属性—>安全—>修改users权限即可

  1. 统计登船港口(Embarked)为空的条数

select count(*) from titanic_train where Embarked is null;

这里统计不出空值数目,原因是在表的最后一列如果为空,直接省略了这一列末尾的逗号,因此可以改为:

select count(*) from titanic_train whereEmbarked='';

  • 注意事项:

SQL语句的格式化写法:

Titanic数据集之MySQL练习

Titanic数据集之MySQL练习