文章目录
- 一、SQL注意事项
- 二、新增(Create)
- 1.单行数据+全列插入
- 2.多行数据+指定列输入
- 三、查询(Retrieve)
- 1.创建一个案例
- 2.全列查询
- 3.指定列查询
- 4.查询字段为表达式
- 5.别名
- 6.去重:DISTINCT
- 7.排序:ORDER BY
- 8.条件查询:WHERE
- 9.分页查询:LIMIT
- 四、修改(Update)
- 五、删除(DELETE)
一、SQL注意事项
1.在命令行工具写sql时,最后用“;”表示结束整个语句;本质是输入“;”+回车,客户换才会发送sql语句到服务端,由服务端执行这条语句
2.sql的注释:- - 注释内容(- -后面要有一个空格)
创建表时使用comment,可以加在表、字段上,可以在表结构中看到
3.写sql时,表名和字段名尽量避免使用关键字,如果是关键字,在前后加`,如表名为desc,创建时就应该写为 create table `desc`
4.字符串都需要使用单引号 ‘字符串内容’
二、新增(Create)
先创建一个表:
1.单行数据+全列插入
value_list数量必须和定义表的列的数量及顺序一致
2.多行数据+指定列输入
三、查询(Retrieve)
语法:
1.创建一个案例
-- 创建考试成绩表
mysql> create table score (
-> id int,
-> name varchar(20),
-> math decimal(3,1),
-> english decimal(3,1)
-> );
-- 插入测试数据
mysql> insert into score (id,name,math,english) values
-> (1,'图图',68,76),
-> (2,'小美',90,95),
-> (3,'壮壮',34,45),
-> (4,'王子',99,98.5);
2.全列查询
select * from table_name;
通常情况下不建议使用*进行全列查询
1.查询的列越多,意味着需要传输的数据量越大
2.可能会影响到索引的使用。(索引后面讲)
3.指定列查询
指定列的顺序不需要按照定义表的顺序来
4.查询字段为表达式
查询字段可以是:
1.表达式
2.常量值
3.加减乘除表达式
1.表达式不包含字段:
2.表达式中包含一个字段:
3.表达式中包含多个字段:
但是我们会发现:如下图这样显示在表头十分不美观,于是乎,我们可以为它指定别名
5.别名
为查询结果中的列指定别名,表示返回的结果集中,以别名作为该类的名称
mysql> select id,name,math+english sum from score;
这里的sum就是我为总分起的别名。
别名可以使用在字段上,作为最终显示给客户端看的表头字段
客户端看的表头字段:
可能与数据库表字段一样,也可能不一样
但是客户端(特别是以后Java程序连接MySQL作为客户端)来说,只能看到返回的表头字段
6.去重:DISTINCT
使用DISTINCT关键字对某列数据进行去重:
(由于我这里没有重复的,我这里再插入一个)
-- 数学的90重复了
select id,name,math from score;
+------+--------+------+
| id | name | math |
+------+--------+------+
| 1 | 图图 | 68.0 |
| 2 | 小美 | 90.0 |
| 3 | 壮壮 | 34.0 |
| 4 | 王子 | 99.0 |
| 5 | 小丽 | 90.0 |
+------+--------+------+
5 rows in set (0.00 sec)
-- 去重结果
select distinct math from score;
+------+
| math |
+------+
| 68.0 |
| 90.0 |
| 34.0 |
| 99.0 |
+------+
4 rows in set (0.00 sec)
可以跟多个字段
必须每个字段都相同,才能去重
和Java中根据多个属性重写hashcode和equals类似,必须重写的所有属性都一样,才表示是同样的对象
7.排序:ORDER BY
ASC 为升序(从小到大)
DECS为降序(从大到小)
– 默认为ASC1.没有ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
2.NULL数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面
(查询同学姓名和数学成绩,按照数学成绩排序)
3.使用
表达式及别名
排序:
(查询同学名字及总分,由高到低)
4.可以对多个字段进行排序,排序优先级随书写顺序(先按照第一个字段排序,如果第一个字段相同,再使用第二个字段排序,以此类推)
(查询同学名字,以及各门成绩,依次按数学降序,英语升序的方式显示)
Java中list<自定义类型>来排序,类似于mysql的order by排序
Java中实现方式:1.自定义类型实现comparable接口,使用Collection.sort(list)
2.Collection.sort(list,new Comparator<>(){})其中,第一种写法耦合性更高(代码侵入性)
不修改原有的代码(自定义类型)就没有侵入性,耦合性低
8.条件查询:WHERE
比较运算符:
运算符 | 说明 |
>,>=,<,<= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL不安全,例如NULL=NULL的结果是NULL |
<=> | 等于,NULL安全,例如NULL<=>NULL的结果是TRUE(1) |
!=,<> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0,a1],如果a0<=value<=a1,返回TRUE(1) |
IN(option,…) | 如果是option中的任意一个,返回TRUE(1) |
IS NULL | 是NULL |
IS NOT NULL | 不是NULL |
LIKE | 模糊匹配,%表示任意多个()包括0个任意字符,_表示任意一个字符 |
逻辑运算符:
运算符 | 说明 |
AND | 多个条件都为TRUE(1),结果才是TRUE(1) |
OR | 任意一个条件为TRUE(1),结果为TRUE(1) |
NOT | 条件为TRUE(1),结果为FALSE(0) |
注意:
1.WHERE条件可以使用表达式,但不能使用别名
2.AND的优先级高于OR,在同时使用时,需要使用小括号包裹优先执行的部分
基本查询:
AND和OR:
范围查询:1.BETWEEN…AND…
这种使用and也可以实现:
2.IN
使用OR也可以实现
模糊查询:LIKE
常见的方式:
包含:%模糊匹配的内容%
以XXX开头:模糊匹配的内容%
以XXX结尾:%模糊匹配的内容
NULL的查询:IS [NOT] NULL
9.分页查询:LIMIT
-- 起始下标为0
-- 从0开始,筛选n条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 从s开始,筛选n条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s,n;
-- 从s开始,筛选n条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
将表格分为三页,前两页2条记录,后一页3条记录:
四、修改(Update)
五、删除(DELETE)
注意:修改和删除操作都是要非常谨慎的,特别是在公司生产环境建议把修改和删除sql转换成查询sql,看看是否事项修改或者想删除的,再执行修改和删除.