SQL (Structured Query Language)基础
一、语法要求
- SQL语句可以单行或多行书写,以分好结尾;
- 可以使用空格和缩进来增强语句的可读性;
- 关键字不区分大小写,建议使用大写;
二、分类
- DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等…
- DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据)
- DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
- DQL(Data Query Language):数据查询语言,用来查询记录(数据)
三、语句
1、DDL
(1)基本操作
- 查看所有数据库名称:SHOW DATABASES;
- 切换数据库:USE mydb1,切换到mydb1数据库;
(2)操作数据库
-
创建数据库:CREATE DATABASE [IF NOT EXISTS] mydb1;
-
创建数据库,例如:CREATE DATABASE mydb1,创建一个名为mydb1的数据库。如果这个数据已经存在,那么会报错。例如CREATE DATABASE IF NOT EXISTS mydb1,在名为mydb1的数据库不存在时创建该库,这样可以避免报错。
-
删除数据库:DROP DATABASE [IF EXISTS] mydb1;
删除数据库,例如:DROP DATABASE mydb1,删除名为mydb1的数据库。如果这个数据库不存在,那么会报错。DROP DATABASE IF EXISTS mydb1,就算mydb1不存在,也不会的报错。
(3)完整性约束
关键字 | description |
---|---|
PRIMARY KEY | 主键列的值就是这一行的唯一标识:非空 && 唯一 |
AUTO_INCREMENT | 主键自增长 |
NOT NULL | 非空 |
UNIQUE | 唯一 |
FOREIGN KEY | 主外键是构成表与表关联的唯一途径!外键是另一张表的主键! |
(4)操作表
-
创建表:
CREATE TABLE 表名( 字段名 字段类型 【字段约束】, 字段名 字段类型 【字段约束】, ...... );
-
查看当前数据库中所有表名称:
SHOW TABLES;
-
查看指定表的创建语句:
SHOW CREATE TABLE 表名;
-
查看表结构:
DESC 表名;
-
删除表:
DROP TABLE 表名; (效率低,数据可回滚) TRUNCATE TABLE 表名 (效率高,数据不可回滚)
2、DQL
SELECT column1 ,column2 ...(column list 字段)
FROM table_name,table_name2...(table lsit 表名)
WHERE table_name.columnX = "xxx" , ... (condition 查询条件,不可以用函数)
GROUP BY column1 (对结果 column 分组)
HAVING XXX (分组后的行条件,可以用函数)
ORDER BY columnX DESC|ASC ( 对column 字段进行排序,默认DESC-升序 )
LIMIT OFFSET number1 , Row number2 (结果限定,从number1条记录开始,显示number2条数据) ;
(1)Where关键字
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
- 条件运算符: =、!=、<>、<、<=、>、>=;
- 条 件 链 接 : AND 、OR 、NOT
- 模 糊 查 询 :BETWEEN…AND… 、 IN( xxx list )、 IS NULL
- 字 段 控 制 :DISTINCT(去重) 、 IF NULL 、 AS (别名)
(2)连接查询
-
内连接 : 查询结果必须满足条件
表1 INNER JOIN 表2 ON 连接条件
-
左连接 :查询结果为左边全部数据 + 右边满足条件的数据,不满足的null
表1 LEFT JOIN 表2 ON 连接条件
-
右连接 :与左连接相反
表1 RIGHT JOIN 表2 ON 连接条件
(3)SQL的执行顺序
随着Mysql版本的更新换代,其优化器也在不断的升级,优化器会分析不同执行顺序产生的性能消耗不同而动态调整执行顺序。下面是经常出现的查询顺序:
- FROM ->
- ON -> JION ->
- WHERE ->
- GROUP BY ->
- HAVING ->
- SELECT ->
- DISTINCT ->
- ORDER BY ->
- LIMIT
(4)数据类型
类型 | description | java8类型 |
---|---|---|
int | 整型 | Integer |
double/float | 浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99; | Double/Float |
decimal | 浮点型,在表示钱方面使用该类型,因为不会出现精度缺失问题; | BigDecimal |
char | 固定长度字符串类型;char(4) 范围是0-255 | String |
varchar | 可变长度字符串类型; | String |
text | 字符串类型;表示存储较长文本 | String |
blob | 字节类型;//jpg mp3 avi | byte[] |
date | 日期类型,格式为:yyyy-MM-dd; | LocalDate |
time | 时间类型,格式为:hh:mm:ss | LocalTime |
timestamp/datetime | 时间戳类型;日期+时间 yyyyMMdd hhmmss | LocalDateTime |
3、DML
- 插入数据:
INSERT INTO 表名(列名1,列名2, …) VALUES(值1, 值2)
- 修改数据:
UPDATE 表名 SET 列名1=值1, … 列名n=值n [WHERE 条件]
- 删除数据:
DELETE FROM 表名 [WHERE 条件]
4、事务
一个事务是由一条或者多条sql语句构成,这一条或者多条sql语句要么全部执行成功,要么全部执行失败!
(1)事务的四大特性(ACID)
- 原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
- 一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
- 隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
- 持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。
(2)Mysql中得事务
在默认情况下,MySQL每执行一条SQL语句,都是一个单独的事务。如果需要在一个事务中包含多条SQL语句,那么需要开启事务和结束事务。
开启事务:start transaction;
DML语句1 ;
DML语句2 ;
DML语句3 ;
...
结束事务:commit或rollback;
常见函数
1、数学函数
函数 | description |
---|---|
ABS ( X ) | 返回 X 的绝对值 |
CELL ( X ) | 返回大于 X 的最小整数 |
FLOOR ( X ) | 返回小于 X 的最大整数 |
MOD ( X ) | 返回 x / y 的模 |
RAND ( X ) | 返回 0 ~ 1 的随机值 |
ROUND ( X , Y ) | 返回 X 的四舍五入的有 Y 位小数的值 |
TRUNCATE ( X , Y) | 返回 X 截断为 Y 位小数的结果 |
SQRT ( X ) | 返回 X 的平方根 |
POW ( X , Y ) | 返回 X 的 Y 次方 |
2、分组(聚合)函数
函数 | description |
---|---|
COUNT() | 统计指定列不为NULL的记录行数; |
MAX() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; |
MIN() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; |
SUM() | 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0; |
AVG() | 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0; |
3、字符串函数
函数 | description |
---|---|
CONCAT(S1,S2,…,Sn) | 连接S1,S2,…,Sn为一个字符串 |
CONCAT(s, S1,S2,…,Sn) | 同CONCAT(s1,s2,…)函数,但是每个字符串之间要加上s |
CHAR_LENGTH(s) | 返回字符串s的字符数 |
LENGTH(s) | 返回字符串s的字节数,和字符集有关 |
INSERT(str, index , len, instr) | 将字符串str从第index位置开始,len个字符长的子串替换为字符串instr |
UPPER(s) 或 UCASE(s) | 将字符串s的所有字母转成大写字母 |
LOWER(s) 或LCASE(s) | 将字符串s的所有字母转成小写字母 |
LEFT(s,n) | 返回字符串s最左边的n个字符 |
RIGHT(s,n) | 返回字符串s最右边的n个字符 |
LPAD(str, len, pad) | 用字符串pad对str最左边进行填充,直到str的长度为len个字符 |
RPAD(str ,len, pad) | 用字符串pad对str最右边进行填充,直到str的长度为len个字符 |
LTRIM(s) | 去掉字符串s左侧的空格 |
RTRIM(s) | 去掉字符串s右侧的空格 |
TRIM(s) | 去掉字符串s开始与结尾的空格 |
TRIM(【BOTH 】s1 FROM s) | 去掉字符串s开始与结尾的s1 |
TRIM(【LEADING】s1 FROM s) | 去掉字符串s开始处的s1 |
TRIM(【TRAILING】s1 FROM s) | 去掉字符串s结尾处的s1 |
REPEAT(str, n) | 返回str重复n次的结果 |
REPLACE(str, a, b) | 用字符串b替换字符串str中所有出现的字符串a |
STRCMP(s1,s2) | 比较字符串s1,s2 |
SUBSTRING(s,index,len) | 返回从字符串s的index位置其len个字符 |