语句执行顺序
(8)SELECT (9)DISTINCT <select_list>
(1)FROM <left_table>
(3)<join_type>JOIN <right_table>
(2)ON<join_condition>
(4)WHERE<where_condition>
(5)GROUP BY<group_by_list>
(6)WITH {CUBE|ROLLUP}
(7)HAVING<having_condition>
(10)ORDER BY<order_by_list>
(11)LIMIT<limit_number>
数据类型
- 数值类型
| 类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
| —- | —- | —- | —- | —- |
| TINYINT | 1 byte | (-128,127) | (0,255) | 小整数值 |
| SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
| MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
| INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
| BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
| FLOAT | 4 bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度
浮点数值 | | DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度
浮点数值 | | DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
- 时间日期
| 类型 | 大小
( bytes) | 范围 | 格式 | 用途 | | —- | —- | —- | —- | —- | | DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 | | TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 | | YEAR | 1 | 1901/2155 | YYYY | 年份值 | | DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 | | TIMESTAMP | 4 | 1970-01-01 00:00:00/2038
结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
- 字符串 | 类型 | 大小 | 用途 | | —- | —- | —- | | CHAR | 0-255 bytes | 定长字符串 | | VARCHAR | 0-65535 bytes | 变长字符串 | | TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 | | TINYTEXT | 0-255 bytes | 短文本字符串 | | BLOB | 0-65 535 bytes | 二进制形式的长文本数据 | | TEXT | 0-65 535 bytes | 长文本数据 | | MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 | | MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 | | LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 | | LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。
库
create database 数据库名字
drop database 数据库名字
use 数据库名字
表
创建表
create table 名字 (列信息) Engine=innodb default charset=utf8;
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_data` DATE,
PRIMARY KEY (`runoob_id`)
)ENGINE=INNODB DEFAULT CHARSET = utf8;
删除表
drop table 表名;
插入
insert into 表名(字段。。。) values (值);
INSERT INTO `runoob_tbl` (
runoob_title,
runoob_author,
submission_data
) VALUES('PHP','vms',NOW());
查询
简单查询
SELECT runoob_title title,runoob_author
FROM runoob_tbl;
Where
=
- !=
- <
- >
- <=
=
SELECT runoob_title,runoob_author
FROM runoob_tbl
WHERE runoob_author='zms';
更新
UPDATE runoob_tbl
SET runoob_title = 'c'
WHERE runoob_author = 'zms';
将 id 为 5 的手机号改为默认的 :update students settel=default where id=5;
将所有人的年龄增加 1: update students set age=age+1;
将手机号为 13288097888 的姓名改为 “小明”, 年龄改为 19: update students setname="小明", age=19 where tel="13288097888";
删除
DELETE FROM runoob_tbl WHERE runoob_author='zms';
delete,drop,truncate
对比delete,drop,truncate
都有删除表的作用,区别在于: 1、delete 和 truncate 仅仅删除表数据,drop 连表数据和表结构一起删除,打个比方,delete 是单杀,truncate 是团灭,drop 是把电脑摔了。 2、delete 是 DML 语句,操作完以后如果没有不想提交事务还可以回滚,truncate 和 drop 是 DDL 语句,操作完马上生效,不能回滚,打个比方,delete 是发微信说分手,后悔还可以撤回,truncate 和 drop 是直接扇耳光说滚,不能反悔。 3、执行的速度上,drop>truncate>delete,打个比方,drop 是神舟火箭,truncate 是和谐号动车,delete 是自行车。
LIKE
- %:0个或任意个
- _:单个
- []: []中的一个
- [^]:不在空号之内的
- 查询内容包含通配符时,由于通配符的缘故,导致我们查询特殊字符 “%”、“_”、“[” 的语句无法正常实现,而把特殊字符用 “[ ]” 括起便可正常查询。
SELECT * FROM runoob_tbl
WHERE runoob_author LIKE '%m%';
UNION
UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)
UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
排序
- ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
- ASC 升序
- DESC 降序
分组
- GROUP BY 语句根据一个或多个列对结果集进行分组。
- 可以使用 COUNT, SUM, AVG,等函数 ```sql SELECT NAME,COUNT(*) FROM employee_tbl GROUP BY NAME;
一个人拥有的记录的条数
<a name="GtIhU"></a>
## 连接
- **INNER JOIN(内连接,或等值连接)**:获取两个表中字段匹配关系的记录。简写为join
- **LEFT JOIN(左连接):**获取左表所有记录,即使右表没有对应匹配的记录。
- **RIGHT JOIN(右连接):** 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
```sql
SELECT a.`runoob_author`,a.`runoob_title`,a.`submission_date`,b.`runoob_count`
FROM runoob_tbl a
INNER JOIN tcount_tbl b
ON a.`runoob_author`=b.`runoob_author`;
空值处理
- IS NULL: 当列的值是 NULL,此运算符返回 true。
- IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
- <=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。
- NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值
- NULL 值与任何其它值的比较(即使是 NULL)永远返回 NULL,即 NULL = NULL 返回 NULL 。
注意SELECT * FROM runoob_test_tbl WHERE runoob_count IS NULL;
SELECT * FROM runoob_test_tbl WHERE runoob_count = NULL;
是不起作用的.
正则表达式
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。 |
. | 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像 ‘[.\n]’ 的模式。 |
[…] | 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 |
[^…] | 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。 |
p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。 |
* | 匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
事务
事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
1、用 BEGIN, ROLLBACK, COMMIT来实现
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
- SET AUTOCOMMIT=0 禁止自动提交
- SET AUTOCOMMIT=1 开启自动提交
SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
表的修改Alert
- 添加列
ALTER TABLE runoob_test_tbl ``**ADD **``new_table_col INT;
- 删除列(指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)
ALTER TABLE runoob_test_tbl ``**DROP **``i;
- 修改类型和字段名称
- 修改类型
ALTER TABLE runoob_test_tbl ``**MODIFY **``runoob_author CHAR(20);
将runoob_author列修改成char(20)
- 修改字段名
ALTER TABLE runoob_test_tbl ``**CHANGE **``runoob_author author CHAR(30);
- 默认值
ALTER TABLE runoob_test_tbl ADD author1 VARCHAR(50) NOT NULL DEFAULT "aa";
这个add
是添加一列
ALTER TABLE runoob_test_tbl modify author1 VARCHAR(50) NOT NULL DEFAULT "aa";
这个modify
是修改一列
- 设置默认值
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
索引
索引分单列索引和组合索引。
单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录
创建索引的时候,如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
- 添加索引
CREATE INDEX indexName ON table_name ``(``column_name``)
- 修改表结构来创建索引
ALTER table tableName ADD INDEX indexName(columnName)
- 创建表时候指定 ```sql CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
- 删除索引
`DROP INDEX ``[``indexName``]`` ON mytable``;`` `
- 唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
`CREATE UNIQUE INDEX indexName ON mytable``(字段名比如:``username``(`也可指指定长度`length``))`<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/8429887/1613283606095-44214210-ad1f-4540-87b6-752f5d7f5dd4.png#height=519&id=oBHUf&margin=%5Bobject%20Object%5D&name=image.png&originHeight=519&originWidth=778&originalType=binary&ratio=1&size=31358&status=done&style=none&width=778)
<a name="cVLju"></a>
## 使用ALTER 命令添加和删除索引
- **ALTER TABLE tbl_name ADD PRIMARY KEY (column_list):** 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
- **ALTER TABLE tbl_name ADD UNIQUE index_name (column_list):** 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
- **ALTER TABLE tbl_name ADD INDEX index_name (column_list):** 添加普通索引,索引值可出现多次。
- **ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):**该语句指定了索引为 FULLTEXT ,用于全文索引。
显示索引信息<br />` SHOW INDEX FROM table_name;`
<a name="zcOpd"></a>
# 复制表
`CREATE TABLE targetTable LIKE sourceTable; INSERT INTO targetTable SELECT * FROM sourceTable;`
<a name="dvLl3"></a>
# SQL注入
所谓SQL注入,就是通过把**SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令**。
比方:
1. 服务器根据用户发过去的用户名字查询数据
1. `select * from user where username=;`
2. 如果用户发来的是:
1. `zms;delete * from zms;`
合起来就是:`select * from user where username=zms;delete * from user `;
MyBatis:
```sql
<select id="getBlogById" resultType="Blog" parameterType=”int”>
SELECT id,title,author,content
FROM blog
WHERE id=#{id}
</select>
作者:BothEyes1993
链接:https://juejin.cn/post/6844904036106256397
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
SELECT id,title,author,content FROM blog WHERE id = ?
不管输入什么参数,打印出的SQL都是这样的。这是因为MyBatis启用了预编译功能,在SQL执行前,会先将上面的SQL发送给数据库进行编译
;执行时,直接使用编译好的SQL,替换占位符“?”就可以了。
因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。
注意:
<select id="orderBlog" resultType="Blog" parameterType=”map”>
SELECT id,title,author,content
FROM blog
ORDER BY ${orderParam}
</select>
内联参数的格式由“#{xxx}”变为了“${xxx}”。如果我们给参数“orderParam”赋值为“id”,将SQL打印出来是这样的:SELECT id,title,author,content FROM blog ORDER BY id
在编写MyBatis的映射语句时,尽量采用**“#{xxx}”**
这样的格式。若不得不使用**“${xxx}”**
这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。