数据类型:在创建表的时候为表中字段指定数据类型,只有数据符合类型要求才能存储起来
**原则:**够用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间。
分类:
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
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,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,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 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
类型 | 大小 | 用途 |
---|---|---|
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 | 极大文本数据 |
类型 | 大小 ( 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 | 混合日期和时间值,时间戳 |
概述:数据库中的表结构确立后,表中的数据代表的意义就已经确定。通过MySQL运算符进行运算,就可以获取到表结构以外的另一种数据。例如,学生表中存在一个birth字段,这个字段表示学生的出生年份。而运用MySQL的算术运算符用当前的年份减学生出生的年份,那么得到的就是这个学生的实际年龄数据。
分类:
算术运算符 | 说明 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ 或 DIV | 除法运算,返回商 |
% 或 MOD | 求余运算,返回余数 |
比较运算符 | 说明 |
---|---|
= | 等于 |
< 和 <= | 小于和小于等于 |
> 和 >= | 大于和大于等于 |
<=> | 安全的等于,两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0 |
<> 或!= | 不等于 |
IS NULL 或 ISNULL | 判断一个值是否为 NULL |
IS NOT NULL | 判断一个值是否不为 NULL |
LEAST | 当有两个或多个参数时,返回最小值 |
GREATEST | 当有两个或多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
逻辑运算符 | 说明 |
---|---|
NOT 或者 ! | 逻辑非 |
AND 或者 && | 逻辑与 |
OR 或者 || | 逻辑或 |
XOR | 逻辑异或 |
位运算符 | 说明 |
---|---|
| | 按位或 |
& | 按位与 |
^ | 按位异或 |
<< | 按位左移 |
>> | 按位右移 |
~ | 按位取反,反转所有比特 |
概述:
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
. | 匹配除 “\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 次。 |
正则表达式示例:
SELECT ‘abc’ REGEXP ‘^a’;
SELECT ‘abc’ REGEXP ‘a$’;
SELECT ‘abc’ REGEXP 'c$’;
SELECT ‘abc’ REGEXP ‘.b’;
SELECT ‘abc’ REGEXP ‘.c’;
SELECT ‘abc’ REGEXP ‘a.’;
SELECT ‘abc’ REGEXP ‘[xyz]’;
SELECT ‘abc’ REGEXP ‘[xaz]’;
SELECT ‘a’ REGEXP ‘[^abc]’;
SELECT 'stab’REGEXP ‘.ta*b’;
SELECT 'stb’REGEXP ‘.ta*b’;
SELECT ''REGEXP ‘a*’;
SELECT ‘stab’ REGEXP ‘.ta+b’;
SELECT ‘stb’ REGEXP ‘.ta+b’;
SELECT 'stb’REGEXP ‘.ta?b’;
SELECT 'stab’REGEXP ‘.ta?b’;
SELECT 'staab’REGEXP ‘.ta?b’;
SELECT ‘a’ REGEXP ‘a|b’;
SELECT ‘b’ REGEXP ‘a|b’;
SELECT ‘b’ REGEXP ‘^(a|b)’;
SELECT ‘a’ REGEXP ‘^(a|b)’;
SELECT ‘c’ REGEXP ‘^(a|b)’;
SELECT ‘auuuuc’ REGEXP ‘au{4}c’;
SELECT ‘auuuuc’ REGEXP ‘au{3}c’;
SELECT ‘auuuuc’ REGEXP ‘au{3,5}c’;
SELECT ‘auuuuc’ REGEXP ‘au{4,5}c’;
SELECT ‘auuuuc’ REGEXP ‘au{5,10}c’;
SELECT 'xababy’REGEXP ‘x(abab)y’;
SELECT 'xababy’REGEXP ‘x(ab)*y’;
SELECT 'xababy’REGEXP ‘x(ab){1,2}y’;
分类:
一对一关系:
一对多或多对一关系:
多对多关系:
格式:
select…from …wherec > all(查询语句)
–等价于:
select…from … where c > result1 and c > result2 and c > result3
特点:
– 查询年龄大于‘1003’部门所有年龄的员工信息
select * from emp3 where age > all(select age from emp3 where dept_id = '1003’);
–查询不属于任何一个部门的员工信息
select* from emp3 where dept_id != all(selectdeptno from dept3);
格式:
select …from …where c > any(查询语句)
–等价于:
select …from … where c > result1 or c > result2 or c > result3
特点:
– 查询年龄大于‘1003’部门任意一个员工年龄的员工信息
select * from emp3 where age > all(select age from emp3 where dept_id = '1003’);
格式:
select …from …where c in(查询语句)
–等价于:
select …from … where c = result1 or c = result2 or c =result3
特点:
– 查询研发部和销售部的员工信息,包含员工号、员工名字
select eid,ename,t.name from emp3 where dept_id in (select deptno from dept3 where name = ‘研发部’ or name = ‘销售部’) ;
格式:
select …from …where exists(查询语句)
特点:
– 查询公司是否有大于60岁的员工,有则输出
select * from emp3 a where exists(select * from emp3 b where a.age > 60);
– 查询有所属部门的员工信息
select* from emp3 a where exists(select* from dept3 b where a.dept_id =b.deptno);
show databases; 查看所有数据库
create databases 数据库名; 创建数据库
use 数据库名; 使用数据库
功能 | SQL |
---|---|
查看当前数据库的所有表名称 | show tables; |
查看指定某个表的创建语句 | show create table 表名; |
查看表结构 | desc 表名 |
删除表 | drop table 表名 |
表添加列 | alter table 表名 add 列名 类型(长度) [约束]; |
修改列名和类型 | alter table 表名 change 旧列名新列名类型(长度) 约束; |
表删除列 | alter table 表名 drop 列名; |
修改表名 | rename table 表名 to 新表名; |
普通创建表:
create table [if not exists]表名(
字段名1 类型【宽度】 【约束条件】 [comment ‘字段说明’],
字段名2 类型【宽度】 【约束条件】 [comment ‘字段说明’],
字段名3 类型【宽度】 【约束条件】 [comment ‘字段说明’]
)[表的一些设置];
insert into student values(1001,‘男’,18,‘1996-12-23’,‘北京’,83.5);
updatestudent set address ='重庆’;
updatestudent set address ='北京’where id =1004
– 删除sid为1004的学生数据
delete from student where sid = 1004;
– 删除表所有数据
delete from student;
– 清空表数据
truncate table student;
truncate student;
区别:delete和truncate原理不同,delete只删除内容,而truncate类似于drop table ,可以理解为先将整个表删除,然后再创建该表。
概述:表中数据的限制条件
目的:就是为了保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复。
分类:
概述:
添加单列主键:
create table 表名(
…
<字段名> <数据类型> primary key
… );
create table 表名(
…
[constraint <约束名>] primary key [字段名] );
添加多列主键(联合主键):
create table 表名(
…
primary key (字段1,字段2,…,字段n)
);
除此之外,还可以在表创建之后对表结构修改来对主键进行操作
alter table <表名> add primary key(字段列表);
alter table <数据表名> drop primary key;
概述:
特点:
添加自定义约束:
create table t_user1(
id int primary key auto_increment,
name varchar(20) );
自定义约束初始值设置:
– 方式1,创建表时指定
create table t_user2 (
id int primary key auto_increment,
name varchar(20)
)auto_increment=100;
alter table t_user2 auto_increment=100;
问:delete和truncate在删除后自增列的变化
答:delete数据之后自动增长从断点开始,truncate数据之后自动增长从默认起始值开始。
概述:非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
添加非空约束:
删除非空约束:
概述:唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况
添加唯一约束:
删除唯一约束:
概述:MySQL 默认值约束用来指定某列的默认值。
添加默认约束:
删除默认约束:
alter table <表名> modify column <字段名> <类型> default null;
概述:
插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
zerofill默认为int(10)
当使用zerofill时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128+127,无符号为0256
添加零填充约束:
<字段名> <数据类型> zerofill;
概述:
特点:
创建外键约束:
[constraint <外键名>] foreign key 字段名 [,字段名2,…] references <主表名> 主键列1 [,主键列2,…]
alter table <数据表名> add constraint <外键名> foreign key(<列名>) references <主表名> (<列名>);
外键约束下,添加数据:必须先给主表添加数据,不然由于外键约束,主表不存在该列的值,就无法给从表添加数据。
外键约束下,删除数据:主表的数据被从表依赖时,不能删除,否则可以删除;从表的数据可以随便删除。
删除外键约束:
alter table <表名> drop foreign key <外键约束名>;
多对多关系下添加外键约束:在两个表为多对多关系是需要一个中间表,将中间表作为从表,分别与其他两个表建立外键约束。
概述:
语法格式:
SELECT
selection_list /要查询的列名称/
FROM
table_list /要查询的表名称/
WHERE
condition /行条件/
GROUP BY
grouping_columns /对结果分组/
HAVING
condition /分组后的行条件/
ORDER BY
sorting_columns /对结果分组/
LIMIT
offset_start, row_count /结果限定/
select * from product;
select pname,price from product;
– 表别名:
select * from product as p;
– 列别名:
select pname as pn from product;
select distinct price from product;
select pname,price+10 from product;
select * from product where pname = ‘海尔洗衣机’;
select * from product where price = 800;
select * from product where price != 800;
select * from product where price <> 800;
select * from product where not(price = 800);
select * from product where price > 60;
select * from product where price >= 200 and price <=1000;
select * from product where price between 200 and 1000;
select * fromproduct where price = 200 or price = 800;
select * fromproduct where price in (200,800);
select * fromproduct where pname like ‘%裤%';
select * fromproduct where pname like ‘海%’;
select * fromproduct where pname like ‘_蔻%’;
select * fromproduct where category_id is null;
select * fromproduct where category_id is not null;
select least(10, 20, 30); – 10
select least(10, null , 30); --null
select greatest(10, 20, 30);
select greatest(10, null, 30); --null
特点:
排序查询示例:
select * from product order by price desc;
select * from product order by price desc,category_id asc;
select distinct price from product order by price desc;
概述:之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
聚合函数 | 作用 |
---|---|
count() | 统计指定列不为NULL的记录行数; |
sum() | 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0 |
max() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; |
min() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; |
avg() | 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0 |
聚合查询示例:
select count(*) from product;
select count(*) from product where price > 200;
select sum(price) from product where category_id = ‘c001’;
select max(price) from product;
select min(price) from product;
select avg(price) from product where category_id = ‘c002’;
注意:
如果count函数的参数为星号(*),则统计所有记录的个数。而如果参数为某字段,不统计含null值的记录个数。
这两个函数忽略null值的存在,就好该条记录不存在一样。
max和min两个函数同样忽略null值的存在。
概述:分组查询是指使用group by字句对查询信息进行分组
格式:select 字段1,字段2… from 表名 group by 分组字段 having 分组条件;
注意:
总结:where不能在group by后面出现,分组后筛选只能使用having。
概述:分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式。例如数据共有30条,每页显示5条,第一页显示1-5条,第二页显示6-10条。
格式:
select 字段1,字段2… from 表明 limit n
select 字段1,字段2… from 表明 limit m,n
m: 整数,表示从第几条索引开始
n: 整数,表示查询多少条数据
–从第4条开始显示,显示5条
select* from product limit 3,5
概述:将一张表的数据导入到另一张表中
insert into Table2(field1,field2,…) select value1,value2,… from Table1
insert into Table2 select *from Table1
要求:目标表(Table2)必须存在。
SELECT value1, value2 into Table2 from Table1
要求:目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。
概述:
格式:
select from 表1,表2,表3….;
概述:内连接查询求多张表的交集
隐式内连接(SQL92标准):select * from A,B where 条件;
显示内连接(SQL99标准):select * from A inner join B on 条件;
– 查询人数大于等于3的部门,并按照人数降序排序
select deptno,count(1) as total_cnt from dept3,emp3 where dept3.deptno= emp3.dept_id group by deptno having total_cnt >= 3 order by total_cnt desc;
select deptno,count(1) as total_cnt from dept3 join emp3 on dept3.deptno= emp3.dept_id group by deptno having total_cnt >= 3 order by total_cnt desc;
概述:连接结果不仅包含符合连接条件的行,同时也包含自身不符合条件的行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUU5reKN-1666602441451)(D:\智慧笔囊\mysql\assets\1666428799461.png)]
格式(outer可以省略):
select * from A left outer join Bon 条件;
select * from A right outer join Bon 条件;
select * from A full outer join B on 条件;
问:内连接和外连接的区别?
答:内连接的结果是两个表都符合条件的,但外连接是至少有一方是不符合条件的,通俗的来说,就是至少有一个表的值是都存在的。
注意:注意:oracle里面有full join,可是在mysql对full join支持的不好。我们可以使用union来达到目的。
概述:子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含select嵌套的查询。
特点:
– 查询年龄最大的员工信息,显示信息包含员工号、员工名字,员工年龄
select eid,ename,age from emp3 where age = (select max(age) from emp3);
– 查询年研发部和销售部的员工信息,包含员工号、员工名字
select eid,ename,t.name from emp3 where dept_id in (select deptno,name from dept3 where name = ‘研发部’ or name = ‘销售部’) ;
– 查询研发部20岁以下的员工信息,包括员工号、员工名字,部门名字
select eid,age,ename,name from (select * from dept where name = '研发部 ')t1,(select * from emp3 where age <20)t2
概述:MySQL有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表来用。
注意:自关联时,表必须给表起别名。
格式:
select字段列表 from 表1 a ,表1 b where 条件;
或者
select字段列表 from 表1 a [left] join 表1 b on 条件;
注意:注意:oracle里面有full join,可是在mysql对full join支持的不好。我们可以使用union来达到目的。
概述:子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含select嵌套的查询。
特点:
– 查询年龄最大的员工信息,显示信息包含员工号、员工名字,员工年龄
select eid,ename,age from emp3 where age = (select max(age) from emp3);
– 查询年研发部和销售部的员工信息,包含员工号、员工名字
select eid,ename,t.name from emp3 where dept_id in (select deptno,name from dept3 where name = ‘研发部’ or name = ‘销售部’) ;
– 查询研发部20岁以下的员工信息,包括员工号、员工名字,部门名字
select eid,age,ename,name from (select * from dept where name = '研发部 ')t1,(select * from emp3 where age <20)t2
概述:MySQL有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表来用。
注意:自关联时,表必须给表起别名。
格式:
select字段列表 from 表1 a ,表1 b where 条件;
或者
select字段列表 from 表1 a [left] join 表1 b on 条件;
----------根据黑马程序员课程的学习总结