MYSQL
SQL(结构化查询语言)组成:
DDL(Data Definition Language)(数据定义语言)
DML(Data Manipulation Language)(数据操作语言)
DQL(Data Query Language)(数据查询语言)
DCL(Data Control Language)(数据控制语言)
数据类型 有五种。
整数数据类型
TINYINT 1字节 (-128,127) (0,255) 小整数值
SMALLINT 2字节 (0, 65535) (-32 768, 32767) 大整数值
MEDIUIMINT 3字节 (-8 388 608, 8588 607) (0, 16 777 215) 大整数值
INT 4字节 (-2 147483 648, 2 147 483 647) (0. 4294967 295) 大整数值
BIGINT 8字节 (-9233372036 854 775 808, 9223 372 036854 775 807) (o, 18 446744075709 551 615) 极大整数值
浮点数据类型
FLOAT 4字节 7位小数 单精度浮点数
DOUBIE 8字节 15位小数 双精度浮点数
DECIMAL(M.D) 17字节 30位小数 小数值
DECIMAL (M,D) M表示精度,数据的总长度, D表示标度,小数点后的长度, Mx须大于D.
decimal(5,2)表示保留5位数,保留小数点2位数
字符串数据类型
CHAR(n) 0-255 定长字符串
VARCHAR(n) 0-65535 变长字符串
CHAR(n)表示定长长度
VARCHAR(n)表示变成长度
例如:char (5)和varchar (5)
当我们存入abc三个字符时, char(5)实际占用5个字符,
而varchar (5) 实际只占用3个字符.
TINYTEXT 0-255 短文本字符串
TEXT 0-65 555 长文本数据
MEDIUMTEXT 0-16 777 215 中等长度文本数据
LONGTEXT 0-4 294 967 295 极大文本数据
时间日期数据类型
DATE 3字节 YYYY-MM-DD(2000-10-10) 日期值
TIME 3字节 HH:MM:SS(12:10:05) 时间值或持续时间
YEAR 1字节 YYYY (2000) 年份值
DATETIME 8字节 YYYYMMDD HH:MM:SS (2000-10-10 12:10:05) 混合日期和时间值
TIMESTAMP 4字节 YYMMDD HHMMSS 混合日期和时间值,时间戳
二进制数据类型
TINYBLOB 0-255字节 不超过255个字符的二进制字符串
BLOB 0-65535字节 二进制形式的长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
LONGBLOB 0-4294 967295字节 二进制形式的极大文本数据
链接数据库:
显示数据库:Show databases;
创建数据库:Create database;
刪除数据库:drop database 数据库名称;
使用数据库: use 数据库名称;
创建表:create table 表名((列名)(列的数据类型)(列的约束),……);
修改表:Alter table 原表名 rename 新表名;
修改列:alter table 表名 change 原列名 新列名 列的数据类型;
添加列:alter table 表名 add 列名 列的数据类型
描述表结构:describe(desc) 表名称;
刪除列:Alter table 表名 drop 列名
创建主键约束:例:Create table 表名(id int primary key,)
唯一约束:例:Create table 表名(id int primary key,name VarChar(20) unique not null,……)
单表查询
查询所有列的商品. select * from product;
查询商品名和商品价格. select pname,price from product;
别名查询.使用的关键字是as(as可以省略的,不建议).
表别名: select * from product as p;
列别名:select pname as pn from product;
去掉重复值.select distinct price from product;
查询结果是表达式(运算查询):将所有商品的价格+10元进行显示.
select pname,price+10 from product;
条件查询where
比较运算符
< <= >= = <>
!=
大于、小于、大于(小于)等于、不等于
BETWEEN …AND…显示在某一区间的值
模糊查询,Like语句中,
%代表零个或多个任意字符,
_代表一个字符,
例如:first_name like ‘_a%’;
IS NULL 判断是否为空
逻辑运算符
and 多个条件同时成立
or 多个条件任一成立
not 不成立
排序 order by
通过order by语句 放置在select语句的最后。
SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC;
ASC 升序 (默认)
DESC 降序
聚合函数 count(不为空记录行数) sum(和) max min avg(平均值)
举例说明:
1 查询商品的总条数
SELECT COUNT() FROM product;
2 查询价格大于200商品的总条数
SELECT COUNT() FROM product WHERE price > 200;
3 查询分类为’c1’的所有商品的总和
SELECT SUM(price) FROM product WHERE category_id = ‘c1’;
4 查询分类为’c2’所有商品的平均价格
SELECT AVG(price) FROM product WHERE category_id = ‘c2’;
5 查询商品的最大价格和最小价格
SELECT MAX(price) as 最贵的,MIN(price) as 最便宜的 FROM product;
Group by 子句
Group by 概述:
Group by 从字面上将是根据指定的规则对数据进行分组,所谓的分组就是将一个数据集划分成若干个小区域,最后根据小区域进行数据处理。
分组group by 子句是在where 条件过滤后的结果完成的,如果没有where 条件则直接付from 表中的数据进行分组。
在有分组的sql语句中,投影的列就会有限制,要求select中的列必须满足一下其中一个条件,否则就是无效的投影:
1.使用了聚合函数的列
2.该列在group By 子句中
所以说, group by 一般和聚合函数一起才有使用意义。
标准结构:
Select 列A, 聚合函数(聚合函数规范) from 表名 where 过滤条件 group by 列A…
Having 子句
错误原因是聚合是在分组后进行的,WHERE子句是在分组前执行的,所以在WHERE子句里执行聚合函数是不行的。
Having和where的区别二者都是过滤条件,where运行在分组前,因此不能执行任何聚合函数。having是运行在分组后,只能用做聚合函数的过滤。
sql的执行顺序
第一步:执行FROM
第二步: WHERE条件过滤
第三步: GROUP BY分组
第四步:执行SELECT投影列
第五步: HAVING条件过滤
第六步:执行ORDER BY排序
子查询
概念:当一个查询是另一个查询的条件时,称乏为子查询。
嵌套在select中
完整的查询sql
select列1,列2,…
from表1,表2,…
where列1=值,…
group by列1,列2,
having聚合函数(列1)=值, .
order by 列1,列2,
在from子句中嵌套子查询
From里的子查询可以是任意查询语句, 然后将其结果作为外部查询的表。
标准结构:
select列1,列2,列N…from (子查询) as表别名
注意:嵌套在from子句中的子查询,必须给一个表别名
在where子句中嵌套子查询
in运算符in运算符允许我们在where子句中规定多个值。
例如:查询张三,王五,赵十二的sql成绩select name, sqlscore from studentScorewhere name in (.张三.,王五,赵十二,) ;
Not in 运算符
与in运算符相反,表示不在集合值里面
all运算符
和子查询的结果逐一比较,必须全部满足时表达式的值才为真
例如:查询学生科目成绩表,显示比王五同学所有分数都高的学生的信息select * from studentSubjectScorewhere score >all ( select score from studentSubjectScore where name= 王五 )and name!= '王五
any运算符
和子查询的结果逐一比较,其中一条记录满足条件则表达式的值就为真。
例如:查询学生科目成绩表,显示比王五同学某一科成绩都高的学生的信息select * from studentSubjectScorewhere score>any ( select score from studentSubiectScore where name= 王五 )and name!= 王五,
在groupby中嵌套:
group by中嵌套和select中嵌套类似,要求子查询只能返回单行单列值
在having中嵌套:
having中嵌套子查询和where中嵌套子查询类似, 只能用到聚合函数
在order by中嵌套:
order bu中嵌套子查询和select中嵌套子查询类似,要求子查询只能返回
单行单列值