基础SQL命令记录、以及一个简单的例子作为参考
一、基础
SQL(Structured Query Language):结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言
SQL 语句不区分大小写,但是数据库表名、列名和值是否区分依赖于具体的 DBMS 以及配置。
1 启动MySQL
- cmd打开运行窗口 键入,启动mysql服务
1 | net start mysql |
- 打开SQLyog,连接数据库、进入本地数据库
- 创建一个数据库并使用
1 | CREATE DATABASE mysqlWk; -- 直接点击建库更好、字符集选择utf-8 排序选择utf_general_ci |
2 MySQL三种注释
1 | # 注释 |
3 MySQL数据类型
1 | # 整型/字节数 |
二、创建和修改表
这里所有的表名、属性都用 小写字母_ 的组合
1 创建表
1 | # 创建 student_info 表 |
2 修改表
1 | alter table student_info add age int; -- 添加列 |
三、增删改
1 插入数据
1 | insert into student_info(s_id,s_name,s_gender,s_hometown,s_tuition) values(1,'吴康',1,'湖南长沙',8000); |
2 更新数据
1 | update student_info set s_hometown = '湖北荆州' where s_id = 1; |
3 删除数据
1 | delete from subject_info where sun_id = 5; -- 垃圾土木 毁我青春 |
四、查询语句
书写顺序和执行顺序!!语法:
select 查询列表 ⑦
from 表1 别名 ①
连接类型 join 表2 ②
on 连接条件 ③
group by 分组列表 ⑤
having 筛选 ⑥
order by排序列表 ⑧
limit 起始条目索引,条目数; ⑨
1 limit i,j; 返回第i行开始的共j行数据
- 查询subject_info的前三行数据
1 | select * from subject_info limit 0,3; |
- 查询student_info的4到7行数据
1 | select * from student_info limit 3,4; |
2 order by 排序:ASC升序(默认) DESC降序 【重要】
- student_info表中按学费的降序排序,如果学费相同按id升序排序
1 | select * from student_info order by s_tuition DESC, s_id ASC; |
3 where 过滤:(= > < between is null and or in not)
- 查询s_tuition>=8000并且s_gender=1的数据
1 | select * from student_info where s_tuition>=8000 and s_gender = 1; |
- 查询tuition在6000到8000范围内的数据
1 | select * from student_info where s_tuition between 6000 and 8000; |
- 查询s_hometown不为null的数据
1 | select * from student_info where s_hometown is not null; |
4 like通配符: %匹配任意数量的字符 _匹配一个字符 [ ]匹配括号内的元素
- 查询s_name是“用”开头的数据
1 | select * from student_info where s_name like '用%'; |
5 数学函数:count()求数量 max()最大值 sum()求和..等
- 查询学费=8000的人的数据 和数量
1 | SELECT * FROM student_info WHERE s_tuition = 8000; -- 显示两条数据 |
五 子查询、分组和连接、分页
考虑到分组和连接比较重要,单独拿出一章来介绍和了解
5.1 子查询
子查询中只能返回一个字段的数据。
==1 可以将子查询的结果作为 WHRER 语句的过滤条件。这个懂==
- 比如我要查出来sub_id=4的专业的所有学生姓名和家乡
- 从student_subject中找到这个sub_id对应的学生s_id
- 然后从student_info表中根据这个s_id找到姓名和家乡
1 | SELECT s_name,s_hometown FROM student_info WHERE s_id IN |
如果要进一步查具体某个专业,就要再嵌套一层子查询
- 比如我要查出来sub_name=News专业的所有学生姓名和家乡
- 要先从subject_info中找到News专业对应的sub_id
- 然后从student_subject中找到这个sub_id对应的学生s_id
- 最后从student_info表中根据这个s_id找到姓名和家乡
1 | select s_name,s_hometown from student_info where s_id in |
也就是说:我最后查得的数据,只能是一个表内的,子查询顶多给我做了一个筛选的功能。(不知道这个理解对不对)
==2 子查询还有一个功能!!就是将子查询放在查询字段中时,会对每一行查询的结果都做一次子查询!!==
- 比如我要查每个专业分别有几个同学
- 我可以先写查某一个具体的专业有几个人
- 然后嵌套进查所有专业的语句中、实现差所有专业的人数
1 | ## 查Math专业有几个人 |
5.2 分组group by
1 group by理解
我之前一直疑惑一个问题:group by 排完序之后到底变成了一个怎样的表?
==分组操作执行之后:每一行代表一个分组,每个分组只显示第一个数据==
可以用count(*) nums求每一个分组内元素的个数
还可以用HAVING nums>6; 过滤分组中的字段
如果group by后面只有一个字段就是只按这一个字段的来分组,如果group by后面有多个字段,那需要这些字段都相同才是一个分组!!
两个重要的要求:
- 除了count()等字段外,SELECT 语句中要查的每一字段都必须在 GROUP BY 子句中给出
- 关系数据库就是基于关系的,单元格中是不允许有多个值的,只对一个字段分组了,那么就只有该列不是重复的!!如果执行select * 就会报错!!
- 聚合函数比如count()、sum()、就是将一组内的多个数据计算输出一个数据
- where要用在group之前,having要用在group之后
- WHERE 过滤行数据,HAVING 过滤分组,行过滤应当先于分组过滤。
2 group by练习
- 按s_tuition分组,学费相同的为一组
1 | select s_tuition from student_info group by s_tuition; |
- 按s_gender分组,性别相同的为一组
1 | select s_gender from student_info group by s_gender; |
5.3 连接 join【重点】
连接用于连接多个表,使用 join
关键字,并且条件语句使用 on
!!!连接一般可以用来替代子查询!!使用超级频繁
三种连接方式:内连接、左连接、右连接
- 内连接:就是只有两个表都不为null的数据才能显示出来(取交集)inner join
- 左连接:以左表为主表(左边表的数据全显示)、右表中无对应数据的显示为null
- 右连接:以右表为主表(右边表的数据全显示)、左表中无对应数据的显示为null
一般会一个就好了,就练习左连接吧
- 查询所有学生的s_id、sub_id和sub_name,很显然要连接student_subject和表subjct_info
1 | select b.s_id,b.sub_id,c.sub_name from |
- 再看看把subject_info放在前面会怎么样
1 | SELECT b.s_id,b.sub_id,c.sub_name FROM |
- 我试一下吧三个表都连接起来看看!!
1 | #先连接bc两个表 |
5.4 分页查询
六 终极查询练习
找男生人数最多的两个专业和人数!!
其实就可以用我上面那个查出来的大表,先筛选出男生的行,然后以专业分组、计算数量排序然后取前两个就好
- 1 先连接形成大表
- 2 where筛选出s_gender=1,所有的男生
- 3 用group by对sub_name分组,并求每个分组的数量count(*) nums
- 4 用order by对nums降序排列
- 5 limit 0,2找出前两行数据!!
1 | SELECT a.s_id,a.s_name,a.s_gender,a.s_hometown,a.s_tuition, |
七 表的索引
数据量较大时,建立和使用提高效率。
本机创建千万级别的数据表单,用于测试
附录:所有sql语句
1 | ## 创建student_info表并插入数据 |