ubuntu下mysql简单使用

源于师兄问的一个问题,如何根据身份证号统计当天上线的男女人数比例,重复登录只计算一次。

安装

sudo service mysql start
mysql:unrecongnized service
sudo apt-get install mysql-server

中间会设置一下root的密码
测试是否安装:

mysql -V

注意V是大写

启动服务

sudo service mysql start

登录

mysql -u root -psho
//输入密码
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 48
Server version: 5.5.55-0ubuntu0.14.04.1 (Ubuntu)
  • 注意这里命令要以;结束

查看数据库

show databases;

新建数据库

create database student;

新建表

use student;
create table s(loginID varchar(20), ID varchar(18), loginDate DATETIME );
show tables;

desc s;	//查看表结构
select * from s;  	//查看表中的内容

+---------+------+---------------------+
| loginID | ID   | loginDate           |
+---------+------+---------------------+
| 1       | 232  | 0000-00-00 00:00:00 |
| 2       | 212  | 0000-00-00 00:00:00 |
| 3       | 202  | 0000-00-00 00:00:00 |
| 3       | 202  | 0000-00-00 00:00:00 |
| 3       | 202  | 0000-00-00 00:00:00 |
+---------+------+---------------------+


select *  from s  where SubString(ID,2,1) in (1,3,5,7,9);//查看表中ID字段倒数第二位为奇数的单元
select *  from s  where SubString(ID,2,1) in (0,2,4,6,8);
select *  from s  where SubString(ID,2,1) in (0,2,4,6,8) group by loginID;//每个ID只计数一次
select *  from s  where SubString(ID,2,1) in (1,3,5,7,9);//对上面计数

利用上面的语句可以通过身份证倒数第二位判断性别,然后对性别进行计数。
但是这样要对数据库进行两次查询

select sum( case when SubString(ID,2,1) in (0,2,4,6,8) then 1 else 0 end) as women from s ;
select sum( case when SubString(ID,2,1) in (0,2,4,6,8) then 1 else 0 end) as women, sum( case when SubString(ID,2,1) in (1,3,5,7,9) then 1 else 0 end) as men from s ;
+-------+------+
| women | men  |
+-------+------+
|     3 |    2 |
+-------+------+

把sum 换count结果是5,5

一次统计出了男女人数,但是loginID可能有重复的,如何只计算一次?
加上group by loginID 变成下面

+-------+------+
| women | men  |
+-------+------+
|     0 |    1 |
|     0 |    1 |
|     3 |    0 |
+-------+------+

    select sum( case when SubString(ID,2,1) in (0,2,4,6,8) then 1 else 0 end) as women, 
                sum( case when SubString(ID,2,1) in (1,3,5,7,9) then 1 else 0 end) as men 
                from (select distinct * from s) as ss;
                
+-------+------+
| women | men  |
+-------+------+
|     1 |    2 |
+-------+------+
1 row in set (0.00 sec)

但是总感觉这样做有点麻烦啊。不知道有没有更简单的方法。

参考https://zhidao.baidu.com/question/1959655383234345540.html

数据库中有两张表,NAMES表,保存user_id, user_name
user_log表,保存id, user_id, time
查找2018年内,登录次数超过100次的所有用户,输出用户名和对应的登录次数,并按登陆次数降序排列。

`select Name, c
from (
    SELECT  user_log.user_id,count(user_log.user_id) as c
    FROM user_log
    WHERE  time = '2018'
    group by user_log.user_id
    having count(user_log.user_id)>2
    order by c desc
) a, NAMES
where NAMES.user_id=a.user_id`

数据库创建语句:

/* Create a table called NAMES */
CREATE TABLE NAMES(user_id integer PRIMARY KEY, Name text);
CREATE TABLE user_log(Id integer PRIMARY KEY,user_id integer,time text);
/* Create few records in this table */
INSERT INTO NAMES VALUES(1,'Tom');
INSERT INTO NAMES VALUES(2,'Lucy');
INSERT INTO NAMES VALUES(3,'Frank');
INSERT INTO NAMES VALUES(4,'Jane');
INSERT INTO NAMES VALUES(5,'Robert');

INSERT INTO user_log VALUES(1, 1, '2018');
INSERT INTO user_log VALUES(2, 1, '2017');
INSERT INTO user_log VALUES(3, 1, '2018');
INSERT INTO user_log VALUES(4, 1, '2018');


INSERT INTO user_log VALUES(5, 2, '2018');
INSERT INTO user_log VALUES(6, 2, '2018');
INSERT INTO user_log VALUES(7, 2, '2018');
INSERT INTO user_log VALUES(8, 2, '2018');
COMMIT;

在线编程网址http://www.compileonline.com/execute_sql_online.php