- 这里要感谢师兄一听到我面试考了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;
- 问题解决:
- Error:The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
如果要解决这个问题,可以通过下面两种方式:
- Move your file to the directory specified by secure-file-priv.
- 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.
- 将你要导入或导出的文件位置指定到你设置的路径里;
- 可以修改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权限即可。
- 统计登船港口(Embarked)为空的条数
select count(*) from titanic_train where Embarked is null;
这里统计不出空值数目,原因是在表的最后一列如果为空,直接省略了这一列末尾的逗号,因此可以改为:
select count(*) from titanic_train whereEmbarked='';
- 注意事项:
SQL语句的格式化写法: