MySQL学习笔记


主要是mac环境下的学习笔记

一、安装

mysql社区版下载地址

1、mysql启停
#启动
sudo /usr/local/mysql/support-files/mysql.server start
#停止
sudo /usr/local/mysql/support-files/mysql.server stop
#重启
sudo /usr/local/mysql/support-files/mysql.server restart

二、常用命令

1、查询所有列
select * from ${table_name}
# 查询多列,多个列名逗号分开
select ${col_name} from ${table_name}
2、去重

使用distinct关键字

select distinct ${col_name} from ${table_name}

使用group by

select ${col_name} from ${table_name} group by ${col_name}
3、限制输出条数

limit关键字

limit 子句可以被用于强制 SELECT 语句返回指定的记录数。
limit 接受一个或两个数字参数。参数必须是一个整数常量。
如果只给定一个参数,它表示返回最大的记录行数目。
如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1。
初始记录行的偏移量是 0(而不是 1)。

# 输出前两条数据
select ${col_name} from ${table_name} limit 2
#指定起始行效率更高
select device_id from user_profile limit 0,2
4、起别名关键字

as,和python中的as差不多

select device_id as user_infos_example from user_profile limit 0,2
5、根据限制条件查找信息
select device_id,university from user_profile where university="北京大学"
select device_id,gender,age,university from user_profile where age>24
#多个条件使用and连接
select device_id,gender,age from user_profile where age>=20 and age<=23

除复旦大学以外的明细。

not in (‘’)

select device_id,gender,age,university from user_profile where university!='复旦大学'
select device_id, gender,age,university from user_profile where university not in ("复旦大学")
#多个判断值
select device_id,gender,age,university,gpa from user_profile where university in ('北京大学','复旦大学','山东大学');

过滤空值

select device_id,gender,age,university from user_profile where age is not NULL

或条件

select device_id,gender,age,university,gpa from user_profile where university='北京大学' or gpa>3.7

多个条件用and或者or连接起来

select
  device_id,
  gender,
  age,
  university,
  gpa
from
  user_profile
where
  (gpa>3.5 and university='山东大学') 
  or (gpa>3.8 and university='复旦大学');
6、字符匹配

字符匹配
一般形式为:
列名 [NOT ] LIKE

匹配串中可包含如下四种通配符:
_:匹配任意一个字符;
%:匹配0个或多个字符;
[ ]:匹配[ ]中的任意一个字符(若要比较的字符是连续的,则可以用连字符“-”表 达 );
[^ ]:不匹配[ ]中的任意一个字符。

#查询学生表中姓‘张’的学生的详细信息
SELECT * FROM 学生表 WHERE 姓名 LIKE '张%';
# 姓张名字为3个字
SELECT * FROM 学生表 WHERE 姓名 LIKE '张__';
# 查询学生表中姓‘张’、姓‘李’和姓‘刘’的学生的情况
select * from 学生表 where 姓名 like '[张李刘]%';
# 不姓刘
SELECT 姓名 FROM 学生 WHERE 姓名 NOT LIKE '刘%';
#学号最后一位不是2、3、5
SELECT * FROM 学生表 WHERE 学号 LIKE '%[^235]'
7、排序

order by ${col_name} desc/asc
其中:desc是降序,asc是升序,如果不写,默认是升序排列;

# 学校是复旦大学且gpa最高
select gpa from user_profile where university='复旦大学' order by gpa desc limit 1
# 多列排序
select
    device_id,
    gpa,
    age
from user_profile
order by gpa asc,age asc
8、分组
# 每个学校每种性别的用户数、30天内平均活跃天数和平均发帖数量
select
  gender,
  university,
  count(device_id) as user_num,
  avg(active_days_within_30) as avg_active_days,
  avg(question_cnt) as avg_question_cnt
from user_profile
group by gender,university
9、分组过滤

聚合函数结果作为筛选条件时,不能用where,而是用having语法

select
    university,
    avg(question_cnt) as avg_question_cnt,
    avg(answer_cnt) as avg_answer_cnt
from user_profile
group by university
having avg_question_cnt<5 or avg_answer_cnt<20;
10、多表查询

基本语法

#多表连接查询语法(重点)
SELECT 字段列表
    FROM1  INNER|LEFT|RIGHT JOIN2
ON1.字段 =2.字段;

内容可以去看MySQL数据查询之多表查询

11、数据合并

union:两张毫不相干的表的查询结果拼接在一起输出,前提是两个查询的列数要相同
union all 不去重

12、划定年龄段
select
    device_id,
    gender,
    case
        when age<20 then '20岁以下'
        when age>=20 and age<=24 then '20-24岁'
        when age>=25 then '25岁及以上'
        when age is NULL then '其他'
    end age_cnt
from user_profile
13、删表

如果数据库中有这个表,就删掉,一般备份数据库中用这样的语句。

drop table if exists ${表名}

三、常用函数

1、最大值,最小值
max(col_name)
min(col_name)
2、计数
count(col_name)
3、平均数
avg(col_name)
4、小数点数控制
#小数点后一位
round(avg(col_name),1)
5、日期判定

day(date) 日
month(date) 月
year(date) 年

select 
    day(date) as day,
    count(question_id) as question_cnt
from question_practice_detail
where month(date)=8 and year(date)=2021
group by date
6、字符截取
substring_index(str,delim,count)
str:要处理的字符串
delim:分隔符
count:计数

如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容,相反,如果是负数,那么就是从右边开始数,第N个分隔符右边的所有内容

select 
    substring_index(substring_index(profile,',',3),',',-1) as age,
    count(device_id) as number
from user_submit
group by age
四、开发中遇到的问题
1、count(*) 和count(1)之间的区别

两个都是统计表中的记录数,但count(1)不会统计空行;如果想统计某一列不为空的记录数,可以用count(列名)。

2、mybatis xml文件中<(小于号)如何使用
	&lt;          < 
	&lt;=         <=
    &gt;          >  
    &gt;=         >=
    &lt;&gt;     <>
    &amp;        & 
    &apos;       '
    &quot;       "

在xml文件里面的写法大概如下:

// 大于等于
<if test="updateTime != null and updateTime != ''">
    AND update_time &gt;= #{updateTime}
</if>

参考:
Mybatis中使用大于小于等于的正确方法

3、mybatis foreach的使用

用到的比较多的是批量更新数据

UPDATE table SET b = '10'
WHERE a IN
<foreach collection = "list" item = "item" open = "(" close = ")" separator = ",">
    #{item.a}
</foreach>
 
/*执行Mybatis后的SQL语句示例
 *单条件用到了IN函数
 *<foreach>在标签头尾添加了'(' ')',并在每个数据间添加了','
 */
UPDATE table SET b = '10'
WHERE a IN ('ZBD12131','ZBD12132','ZBD12133')

可以参考这个博客:
Mybatis标签详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值