Mysql基础回顾(上篇)

2016-07-24 03:34:31 Mysql 3011 0

MySQL查询指令执行顺序

where->group-by>having->order by->limit

更新时间2016年7月24日 20:47:28

阶段一

进入数据库     mysql –h服务器名称–u用户名称 –p密码;

         [示例]mysql -hlocalhost -uroot -p123456;

              显示数据库    

                  [示例]show databases;

                  ->进入某个数据库    use  数据库名;

                 [示例]use shop;

                           ->查看数据库里面的表单列表

                          [示例]show tables;

列类型的概念
数值型
    整型 tinyint     smallint    mediumint    int     bigint
    unsigned 

          无符号,因为计算机记录数字是以补码(详见《计算机组成原理》)的形式保存的
    所以当声明了无符号的时候,该数字记录的范围可以多一位了
    比如,声明一个tinyint类型,它可记录一个字节,即,可以记录八位二进制数据
    在未声明无符号的时候,它会使用第一位作为符号,范围就在-128~127之间
    声明无符号位的时候,的范围就变为了0~255

    zerofill 

         零填充,M宽度
    浮点型/定点型
         M为总位数,d代表小数位个数
         float(M,d)与decimal(M,d)
         无符号的时候decimal比float更精确,常用商城价格

字符型
    char(M)与varchar(M)的区别

         char实际占了M个字节(定长),存储的不够M则向右侧补空格,取出时取出右侧空格,限制 M<=255
          varchar有1~2个字节来标记真实的长度(变长),限制 M<=65535



日期
    常用TIMESTAMP current_timestamp直接记录时间
    在开发中常用int类型来时间戳秒数,方便计算,显示时间的时候也方便格式化为不同的显示样式





阶段二

where

//取出account_log>4的数据 四个运算符  > = < !=

SELECT  *  FROM account_log where log_id >4;

//取出48直接的数据

SELECT  *  FROM account_log where log_id between 4 and 8;

(注意这里可以用  wherelog_id>=4 and log_id <=8来同样表达

//取出48中的数据

SELECT  *  FROM account_log where log_id in (4,8);

//逻辑词汇三个 not and or,下面以not的用法为例子

SELECT  *  FROM account_log where log_id not in (4,8);

group by

通常与统计函数avg(),sum(),count(),min(),max()一起使用

【注意】当使用group的时候,count(*)函数得出的数是指的每个分组内的成员个数,

比如select count(*) as times from table1 group by id,

比如  id=1的个数就是times的值



把每一列都当作一个变量看,运算结果通过as作为别名输出

//查出一个用户所购买的所有东西的总价格

SELECT  * sum( money * num) as total FROM account_log group by user_id;

where与having的区别

where查表中的原始数据有作用,having对表中没有的但对查询逻辑中有结果有效

//查询总成绩大于380的学生名字,与其对应的总分

SELECT name, (Chinese+Math+English)as score

FROM student

HAVING score>380

ORDER BY score DESC;

//查询用户中,消费超过1000元的人中消费最低的两个人

SELECTuser_od,sum(user_money) as total

FROM account_log

Group BY user_id

HAVING total>1000

ORDER BY user_id ASC

LIMIT 2;

 

//计算挂科两门及以上的学生的平均分,从高到低每页展示20个人的信息 column,name,score

SELECT avg(score) as avg_score,sum(score<60) as times

FROM student_score

GROUP BY name

HAVING times>=2

ORDER BY avg_score DESC

LIMIT 20;

 

【注意】count()里面只取的是行数,给什么条件都没用,

sum() 如果里面是判断类型,结果就为真值的总个数;

如果是普通运算,结果就为运算的结果

 

order by

它可以多字段排序 orderby 字段1,字段2 asc

[示例]order by cat_idasc,shop_price desc;


//通过goods表建立临时表g2并把goods表中的数据传给g2,传入前,

//①将goods表的数据通过cat_idshop_price排序(但在平时的操作中,

//②我们不用临时表,我们用子查询(查询结果当作表)

CREATE TABLE g2 LIKE goods;

INSERT INTO g2 SELECT * FROM goods ORDER BY cat_id asc,shop_price desc;

 

Where  From  Exists子查询

 >Where是把内部的查询结果,给外部查询使用

      [常用场景=>查询最大商品、查询最贵商品][最新,即自增id为最大值的时候]

SELECT name FROM goods 

WHERE name in(

        SELECT name 

        FROM goods 

        ORDER BY user_id

);

>From查询结果当成一个临时表(表必须取一个别名),再让外部进行一次sql查询使用

      [常用场景=>查询每个栏目下的最新/最贵商品]

SELECT name FROM(

         SELECT name 

        FROM goods 

        ORDER BY user_id

) as temp_table;

>Exists 把外层的查询结果拿到内层,看内部的查询结果是否成立

      [常用场景=>查询有商品的栏目]

SELECT * FROM comment 

WHERE EXISTS( 

        SELECT * FROM comment_inner 

        WHERE comment_inner.article_id=comment.article_id 

);

//计算挂科两门及以上的学生的平均分 column,name,score

思路:分三次。第一次查询

①    筛选符合条件的人=>这时候会有一个人的名字多次出现的情形【WHERE子查询】

SELECT name,count(*) as result

FROM stu

WHERE score <60

GROUP BY name having result>1;

②    合并重复出现的名字【普通查询】

SELECT name

FROM temp

GROUP BY name;

③    计算这些人的平均成绩【FROM子查询】

SELECT name,avg(score) as avg_score

FROM stu where name in②中的结果;

最终拼写出语句

SELECT name,avg(score) as avg_score

FROM stu where name in

    (SELECT name

    FROM (

        SELECT name,count(*) as result

        FROM stu

        WHERE score <60

        GROUP BY name having result>1

        )as temp

GROUP BY name

);


注:若无特殊说明,文章均为云天河原创,请尊重作者劳动成果,转载前请一定要注明出处