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类型来时间戳秒数,方便计算,显示时间的时候也方便格式化为不同的显示样式
//取出account_log>4的数据 四个运算符 > = < !=
SELECT * FROM account_log where log_id >4;
//取出4到8直接的数据
SELECT * FROM account_log where log_id between 4 and 8;
(注意这里可以用 wherelog_id>=4 and log_id <=8来同样表达)
//取出4和8中的数据
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);
通常与统计函数avg(),sum(),count(),min(),max()一起使用
【注意】当使用group的时候,count(*)函数得出的数是指的每个分组内的成员个数,
比如select count(*) as times from table1 group by id,
比如 id=1的个数就是times的值
//查出一个用户所购买的所有东西的总价格
SELECT * sum( money * num) as total FROM account_log group by user_id;
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;
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() 如果里面是判断类型,结果就为真值的总个数;
如果是普通运算,结果就为运算的结果
它可以多字段排序 orderby 字段1,字段2 asc
[示例]order by cat_idasc,shop_price desc;
//通过goods表建立临时表g2并把goods表中的数据传给g2,传入前,
//①将goods表的数据通过cat_id与shop_price排序(但在平时的操作中,
//②我们不用临时表,我们用子查询(查询结果当作表))
CREATE TABLE g2 LIKE goods;
INSERT INTO g2 SELECT * FROM goods ORDER BY cat_id asc,shop_price desc;
>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
);
评论列表点此评论