文章目录
1. 什么是SQL?
SQL(Structured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。它可以应用到所有关系型数据库中,例如:MySQL、Oracle、SQL Server等。
SQ标准(ANSI/ISO)有:
- SQL-92:1992年发布的SQL语言标准;
- SQL:1999:1999年发布的SQL语言标准;
- SQL:2003:2003年发布的SQL语言标准;
这些标准就与JDK的版本一样,在新的版本中总要有一些语法的变化。不同时期的数据库对不同标准做了实现。
虽然SQL可以用在所有关系型数据库中,但很多数据库还都有标准之后的一些语法,我们可以称之为“方言”。例如MySQL中的LIMIT语句就是MySQL独有的方言,其它数据库都不支持!当然,Oracle或SQL Server都有自己的方言。
2. SQL语法规范
- SQL语句可以在单行或多行书写,以分号结尾
- 可使用空格和缩进来增强语句的可读性
- SQL不区别大小写,关键字建议使用大写. (java是区分大小写的)
MySql中的常用数据类型
Mysql没有字符的概念,全是字符串
- int:整型
- double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
- decimal:浮点型,在表单钱方面使用该类型,因为不会出现精度缺失问题;
- char:固定长度字符串类型; char(255),数据的长度不足指定长度,补足到指定长度!
- varchar:可变长度字符串类型; varchar(65535), zhangSan+8
- text(clob):字符串类型;
- blob:字节类型;(什么是字节类型的数据?图片,音乐,电影)jdbc
- date:日期类型,格式为:yyyy-MM-dd;(年月日)
- time:时间类型,格式为:hh:mm:ss(时分秒)
- timestamp:时间戳类型;日期+时间 yyyy-MM-dd hh:mm:ss(年月日 时分秒)
3. SQL语句分类
3.1 DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
创建、删除、修改:库、表结构!!!
3.1.1 DDL操作数据库相关的指令
- 查看所有数据库:SHOW DATABASES;
- 切换(选择要操作的)数据库:USE 数据库名;
- 查看数据库中的表:show tables;
- 创建数据库:CREATE DATABASE
[IF NOT EXISTS]mydb1[CHARSET=utf8]- 注:
[IF NOT EXISTS]:可选, 代表 mydb1假设不存在,则创建
[CHARSET=utf8]:可选,代表 设置编码为utf8 , 默认编码就是utf8
- 注:
- 删除数据库:DROP DATABASE
[IF EXISTS]mydb1- 注:
[IF EXISTS]:可选, 代表 mydb1假设存在,则删除
- 注:
- 修改数据库编码:ALTER DATABASE mydb1 CHARACTER SET utf8
默认编码就是utf8
3.1.2 DDL语句对表的操作
- 创建表:
CREATE TABLE [IF NOT EXISTS] 表名(
列名 列类型,
列名 列类型,
…
列名 列类型
);
-
查看当前数据库中所有表名称:SHOW TABLES;
-
查看指定表的创建语句:SHOW CREATE TABLE 表名;
-
查看表结构:DESC 表名;
-
删除表:DROP TABLE 表名; 删除库 DROP DATABASE 库名
-
修改表:前缀:ALTER TABLE 表名
- 修改之添加列:
ALTER TABLE 表名 ADD (
列名 列类型,
列名 列类型,
…
); - 修改之修改列类型(如果被修改的列已存在数据,那么新的类型可能会影响到已存在数据):ALTER TABLE 表名 MODIFY 列名 列类型;
- 修改之修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 列类型;
- 修改之删除列:ALTER TABLE 表名 DROP 列名;
- 修改表名称:ALTER TABLE 原表名 RENAME TO 新表名;
- 修改之添加列:
3.2 DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
增、删、改:表记录
3.2.1 DML语句往表中插入数据
DML(数据操作语言,包括对表的增、删、改操作。)
插入数据
格式一:INSERT INTO 表名(列名1,列名2, …) VALUES(列值1, 列值2, …);
在表名后给出要插入的列名,其他没有指定的列等同与插入null值。所以插入记录总是插入一行,不可能是半行。
在VALUES后给出列值,值的顺序和个数必须与前面指定的列对应
格式二:INSERT INTO 表名 VALUES(列值1, 列值2);
没有给出要插入的列,那么表示插入所有列。
值的个数必须是该表列的个数。
值的顺序,必须与表创建时给出的列的顺序相同。
3.2.2 DML之修改数据
格式:
UPDATE 表名 SET 列名1=列值1, 列名2=列值2, … [WHERE 条件]
条件(条件可选的):
条件必须是一个boolean类型的值或表达式:UPDATE t_person SET gender=‘男’, age=age+1 WHERE sid=‘1’;
运算符:=、!=、<>、>、<、>=、<=、BETWEEN…AND、IN(…)、IS NULL、NOT、OR、AND
条件子句展示:
WHERE age >= 18 AND age <= 80
WHERE age BETWEEN 18 AND 80
WHERE name=‘zhangSan’ OR name=‘liSi’
WHERE name IN (‘zhangSan’, ‘liSi’)
WHERE age IS NULL, 不能使用等号 age=NULL 永远是false
WHERE age IS NOT NULL
3.2.3 DML之删除数据
删除的第一种形式:
DELETE FROM 表名 [WHERE 条件];(回滚)
删除的第二种形式:(不能回滚)
TRUNCATE TABLE 表名:TRUNCATE是DDL语句,它是先删除drop该表,再create该表。而且无法回滚!!!
3.3 DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;(root)
DCL:给数据库管理系统增加一个用户,给用户分配权限(读/写)
3.4 DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
3.4.1 DQL数据查询语言
注意:查询不会修改数据库表记录!
查询所有列
SELECT * FROM 表名;
SELECT * FROM student;
其中“*”表示查询所有列
查询指定列
SELECT 列1 [, 列2, … 列N] FROM 表名;
SELECT id, name, chinese, english FROM 表名;
完全重复的记录只一次(去重)
当查询结果中的多行记录一模一样时,只显示一行。一般查询所有列时很少会有这种情况,但只查询一列(或几列)时,这总可能就大了!
SELECT DISTINCT * | 列1 [, 列2, ... 列N] FROM 表名;
SELECT DISTINCT chinese FROM emp;
保查询员工表的工资,如果存在相同的工资只显示一次!
列运算数量类型的列可以做加、减、乘、除运算(只是把查询结果进行计算,不会更新到表里面去)
SELECT chinese*1.5 FROM student;
SELECT chinese+english FROM student;
字符串类型可以做连接运算
SELECT CONCAT(’$’, name) FROM student;
转换NULL值(NULL和任何值相加都是NULL)
有时需要把NULL转换成其它值,例如chinese+1000时,如果chinese列存在NULL值,那么NULL+1000还是NULL,而我们这时希望把NULL当前0来运算。
SELECT IFNULL(chinese, 0)+1000 FROM student;
–> IFNULL(chinese, 0):如果chinese中存在NULL值,那么当成0来运算。
给列起别名
你也许已经注意到了,当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列名起个别名,这样在结果集中列名就显示别名了
SELECT IFNULL(chinese, 0)+1000 AS 分数 FROM student;
其中AS可以省略
一、条件查询(WHERE)
与前面介绍的UPDATE和DELETE语句一样,SELECT语句也可以使用WHERE子句来控制记录。
- 查询语文成绩在57并且数学成绩在60分以上的同学(AND)
SELECT * FROM student WHERE chinese>57 and math>60; - 查询数学成绩在80到100分的同学(AND ,BETWEEN AND)
SELECT * FROM student WHERE math>=80 AND math<=100;
SELECT * FROM student WHERE math BETWEEN 80 AND 100; - 查询张三、李四、王五的成绩 in(选项1,选项2,选项3)
SELECT * FROM student WHERE name in(‘zhangsan’,‘lisi’,‘wangwu’);
二、模糊查询(LIKE) 只能对字符串进行操作
模糊查询需要使用运算符:LIKE,其中_匹配一个任意字符,注意,只匹配一个字符而不是多个;%匹配0~N个字符。
- 查询名字以黄开头,并且名字长度为3的同学
SELECT * FROM student WHERE name LIKE ‘黄__’; - 如果我们想查询以L开头,名字几个字都可以 LIKE ‘l%’;
SELECT * FROM student WHERE name LIKE ‘l%’; - 查询名字中包含i的同学 LIKE ‘%i%’
SELECT * FROM student WHERE name LIKE ‘%i%’;
注意:字段值为NULL的查询不出来!
NULL不是字符串
三、排序查询
Order by
- 升序
SELECT * FROM student ORDER BY chinese ASC;
–> 按chinese排序,升序!
–> 其中ASC是可以省略的 - 降序
SELECT * FROM student ORDER BY math DESC;
–> 按math排序,降序!
–> 其中DESC不能省略 - 使用多列作为排序条件(组合排序)
SELECT * FROM student ORDER BY chinese ASC, math DESC;
–> 使用chinese升序排,如果chinese相同时,使用math的降序排
四、聚合函数
聚合函数就是对一组数据进行运算的函数
聚合函数用来做某列的纵向运算。
- COUNT
SELECT COUNT(chinese) FROM student;
–>计算student表中chinese列不为NULL的记录的行数 - MAX
SELECT MAX(math) FROM emp;
–> 查询最高数学成绩 - MIN
SELECT MIN(english) FROM emp;
–> 查询最低英语成绩 - SUM
SELECT SUM(math) FROM student;
–> 查询数学成绩总和 - AVG
SELECT AVG(chinese) FROM emp;
–> 查询语文平均成绩
五、分组查询(GROUP BY)
按条件分类的意思
分门别类的意思
1、 什么是分组查询?
分组查询就是对查询结果按照某种条件进行分组!然后可以通过聚合函数来获得组相关的信息。
– 分组
– group by
– 对查询出来的记录按条件进行分门别类
– 按名字分组
SELECT * FROM student GROUP BY NAME;
SELECT * FROM stu
– 按性别分组(2组)
– select 后面的显示字段应该是和组相关的信息吧
SELECT * FROM stu GROUP BY gender
SELECT gender FROM stu GROUP BY gender
六、分组条件查询(HAVING)
之前的条件过滤是在分组之前。例如:
对年龄大于二十的记录按性别进行分组,并统计每组的人数。
SELECT sex,count(*) 人数FROM stu WHERE age>20 GROUP BY sex;
而HAVING是对分组之后的组相关数据进行过滤
– having是对组相关的信息进行过滤
– 对年龄大于二十的记录按性别进行分组,并统计每组的人数。只显示组人数大于1的。
SELECT gender 组名称,COUNT(* ) 人数 FROM stu WHERE age>20 GROUP BY gender HAVING COUNT(*)>1
七、限制查询(LIMIT)
LIMIT是MySql的方言!
什么是方言!就是我独有的东西,而别人没有!
限制查询就是对查询结果的记录行数进行限制。
LIMIT后面两个参数的含义
LIMIT A,B;
A:记录开始的索引
B:要限制查询的记录行数
SELECT * FROM stu LIMIT 0,2; – 第一页 起始索引 0 (1-1)*2
SELECT * FROM stu LIMIT 2,2; – 第二页 起始索引 2 (2-1)*2
SELECT * FROM stu LIMIT 4,2; – 第三爷 起始索引 4 (3-1)*2
各种查询语句中用到的主要关键字总结及出现顺序
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY(对组相关信息进行排序)
LIMIT