内容概览:
1.语法特点
- SQL对关键字大小写不敏感;
- SQL语句可以用单行活多行书写,以分号结束;
- SQL注释:
-- 单行注释,-- 后面一定要加一个空格
# 单行注释,#后面可加可不加空格
SELECT * FROM emp; -- 这里是注释
/*
多行注释
多行注释
*/
2.数据库系统
- 数据库(Database)是一个以某种组织方式存储在磁盘上数据的集合;
- 数据库应用系统指基于数据库的应用软件;
- 数据库分类:关系型数据库(RDBMS)和非关系型数据库(NoSQL);
常见关系型数据库:存的数据是一张张表,表与表之间存在关系
1.Oracle数据库(老大,最赚钱的数据库)
2.MySQL数据库(最流行的中型数据库)
3.SQL Server数据库(Windows上最好的数据库)
4.PostgreSQL(功能最强大的开源数据库)
5.SQLite(最流行的嵌入式数据库)
常见非关系型数据库
1.redis(最好的缓存数据库)
2.MongoDB(最好的文档型数据库)
3.Elasticsearch(最好的搜索数据库)
4.Cassandra(最好的列式数据库)
5.HBase(优秀的分布式、列式数据库)
3.SQL和数据库管理系统的关系
- SQL是一种用于操作数据库的语言,SQL适用于所有关系型数据库;
- MySQL、Oracle、SQLServer是一个数据库软件,这些数据库软件支持标准SQL,通过SQL可以使用这些软件,不过每个数据库系统会在标准的SQL基础上扩展自己的SQL语法;
- 大部分NoSQL数据库有自己的操作语言,对SQL支持的并不好。
4.关系型数据库管理系统组成
- 数据库管理系统(DBMS)主要由数据库(Database)和表(Table)组成,一个系统可以由很多数据库,每个数据库可以由很多表。
5.常用图形化界面
- Navicat:一套快速、可靠的数据库管理工具,Navicat是以直觉化的图像用户界面而建的,可以兼容多种数据库,支持多种操作系统。
# 1.新建连接
“文件” -> “新建连接” -> “MySQL” -> 填写“连接名”、“用户名”和“密码” -> “测试连接” -> “确定”
# 2.执行命令
“新建查询” -> 输入SQL语句 -> 左键单击选中要执行SQL语句 -> “运行已选择的”
- SQLyog:一个快速而简洁的图形化管理MySQL数据库工具,它能够在任何地点有效地管理你地数据库,由业界著名地Webyog公司出品。
- MySQL Workbench:官方提供的图形化管理工具,分为社区版和商业版,社区版完全免费,商业版则是按年收费,支持数据库创建、涉及、迁移、备份、导出和导入功能,并支持主流操作系统。
- DataGrip:由JetBrains公司出品,是一款数据库管理客户端工具,方便连接到数据库服务器、执行SQL、创建表、创建索引及导出数据库等。
6.DDL数据定义语言
- DDL(Data Definition Language),数据定义语言,该语言包括以下内容:
对数据库的常用操作:
功能 | SQL |
---|---|
查看所有数据库 | show databases; |
创建数据库 | create database [if not exists] mydb [chaset=utf8] |
切换(选择要操作的)数据库 | use mydb; |
删除数据库 | drop database [if exists] mydb; |
修改数据库编码 | alter database mydb character set utf8; |
对表结构的常用操作:
- 创建表:
create table [if not exists] 表名 (
字段1 类型[(宽度)] [约束条件] [comment '字段说明'],
字段2 类型[(宽度)] [约束条件] [comment '字段说明'],
字段3 类型[(宽度)] [约束条件] [comment '字段说明']
) [表的一些设置];
创建表是创建一张空表,指定表名,有几列,每列叫什么名字,及每列存储的数据类型:
use mydb;
create table if not exists student (
sid int,
name varchar(20),
gender varchar(20),
age int,
birth date,
address varchar(20)
);
- 其它操作:
功能 | SQL |
---|---|
查看当前数据库所有表名 | show tables; |
查看指定某个表的创建语句 | show create table 表名; |
查看表结构 | desc 表名; |
删除表 | drop table 表名; |
修改表结构:
alter table 表名 add 列名 类型(长度) [约束];
- 例如:
# 为student表添加一个新字段:系别dept,类型为varchar(20)
alter table student add dept varchar(20);
修改列名和类型:
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
- 例如:
alter table student change dept department VARCHAR(30);
删除列:
alter table 表名 drop 列名;
- 例如:
alter table student drop department;
修改表名:
rename table 旧表名 to 新表名
- 例如:
rename table student to stu;
7.DML数据操作语言
- DML是指数据操作语言,英文全称Data Manipulation Language,用来对数据库中表的数据记录进行更新。
插入insert
- 数据插入
# 向表中插入某些列数据
insert into 表(列名1, 列名2, 列名3, ...) values (值1, 值2, 值3, ...);
# 向表中插入所有列数据
insert into 表 values(值1, 值2, 值3, ...);
- 例如:
insert into student(sid, name, gender, age, birth, address)
values(1001, '张三', '男', 18, '1996-12-23', ‘北京’);
insert into student values(1002, '李四', '男', 19, '1995-11-22', '湖北');
insert into student values(1003, '赵六', '男', 21, '1994-11-22', '湖北'),
(1004, '钱七', '男', 22, '1993-9-22', '广州');
删除delete
# 从表中删除满足指定条件的行,不加条件就是删除所有表内容
# 只删除表内容,不删除表
delete from 表名 [where 条件];
# 清空表数据:类似于drop table,先将整个表删了,再创建该表
truncate table 表名或truncate 表名;
- 例如:
delete from student where sid = 1004;
更新update
update 表名 set 字段名=值, 字段名=值...;
update 表名 set 字段名=值, 字段名=值... where 条件;
- 例如:
# 将所有学生的地址都修改为重庆
update student set address = '重庆';
# 将id为1002的学生地址修改为北京
update student set address = '北京' where sid > 1002;
# 将id为1004学生地址修改为北京,年龄修改为23,生日修改为1992-10-22
update student set address='北京', age = age + 1, birth = '1992-10-22' where sid = 1004
8.约束
- 概念:constraint,实际上就是表中数据的限制条件
- 作用:表在设计时加入约束的目的是为了保证表中记录完整性和有效性,如,用户表有哪些列的值(如:手机号)不能为空,有些列的值(如:身份证号)不能重复。
- 分类:
(1) 主键约束(primary key) PK
(2) 自增长约束(auto_increment)
(3) 非空约束(not null)
(4) 唯一性位数(unique)
(5) 默认约束(default)
(6) 零填充约束(zerofill)
(7) 外键约束(foreign key) FK
8.1 主键约束
- 概念:
MySQL主键约束时一个列或多个列的组合,其值能唯一地标识表中每一行,方便再RDBMS中尽快找到某一行,主键约束相当于唯一约束+非空约束的组合,主键约束不允许重复,也不允许出现空值;每个表最多允许一个主键,主键约束的关键字为 primary key
,当创建主键约束时,系统默认会再所在列和列祝贺上建立对应的唯一索引。
- 操作:
添加单列主键
# 方式一:
create table 表名(
...
<字段名> <数据类型> primary key
...
);
# 方式二:
create table 表名(
...
[constraint <约束名>] primary key [字段名]
);
- 例如:
# 方式一:
create table empl(
eid int primary key,
name VARCHAR(20),
deptId int,
salary double
);
# 方式二:
create table employee (
eid int,
name varchar(20),
deptId int,
salary double,
constraint pk1 primary key(eid) -- constraint pk1可以省略
);
添加多列联合主键
- 联合主键就是这个主键由一张表中多个字段组成,需要注意,当主键由多个字段组成时,不能直接再字段名后面声明主键约束,与此同时,一张表只能有一个主键,联合主键也是一个主键
create table 表名(
...
primary key(字段1, 字段2, ..., 字段n)
);
- 例如:
create table employ(
name varchar(20),
deptId int,
salary double,
primary key(name, deptId)
);
还可以通过修改表结构来添加主键
create table 表名(
...
);
alter table <表名> add primary key(字段列表);
- 例如:
create table emp(
eid int,
name varchar(20),
deptId int,
salary double
);
# 1.添加单列主键
alter table emp add primary key (eid);
# 2.添加多列主键
alter table emp add primary key (eid, name);
删除主键
- 一个表中不需要主键约束时,就需要从表中将其删除,删除主键约束的方法比创建主键约束容易多。
alter table <表名> drop primary key;
- 例如:
alter table emp drop primary key;
8.2 自增长约束
- 概念:在MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库根据定义自动赋值,没增加一条记录,主键就会自动以相同步长进行增长。可以给字段添加
auto_increment
属性来实现主键的自增长。
字段名 数据类型 auto_increment
- 例如:
create table user1(
id int primary key auto_increment,
name varchar(20)
);
# 向表中插入数据
insert into user1 values(NULL, '张三');
insert into user1(name) values('李四');
- 特点:(a) 默认情况下,auto_increment初始值为1,每新增一条记录,字段值自动加1;(b)一个表中只能有一个字段使用auto_increment约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分);(c) auto_increment约束必须具备Not NULL属性;(d) auto_increment约束字段只能是整数类型(TINYINT,SMALLINT,INT,BIGINT等);(e) auto_increment约束字段的最大值受该字段数据类型约束,如果达到上限,auto_increment就会失效。
指定自增字段初始值
# 方法一:
create table user2(
id int primary key auto_increment,
name varchar(20)
) auto_increment=100;
insert into user2 values(NULL, '张三');
insert into user2(name) values('李四');
# 方法二:
create table user3(
id int primary key auto_increment,
name varchar(20)
);
alter table user3 auto_increment=100;
insert into user3 values(NULL, '张三');
insert into user3(name) values('李四');
delete和truncate在删除后自增列变化
- delete数据后,自增长从断点开始;
delete from user3;
insert into user3 values(NULL, '张三');
insert into user3(name) values('李四');
- truncate数据后,自增在从默认起始值(设置的默认初始值也被重置为1)开始;
truncate user3;
insert into user3 values(NULL, '张三');
insert into user3(name) values('李四');
8.3 非空约束
- 概念:MySQL非空约束(not null)指字段不能为空,对于使用了非空约束的字段,用户添加数据时每有指定值时,数据库系统会报错。
# 方式一:
<字段名> <数据类型> not null,
# 方式二:
alter table 表名 modify 字段 类型 not null;
- 例如:
# 方式一:
create table user4(
id int,
name varchar(20) not null,
address varchar(20) not null
);
# 方式二:
create table user5(
id int,
name varchar(20),
address varchar(20)
);
alter table user5 modify name varchar(20) not null;
alter table user5 modify address varchar(20) not null;
- **删除非空约束:**将后面的
not null
去掉
alter table user4 modify name varchar(20);
alter table user4 modify address varchar(20);
8.4 唯一约束
- 概念:唯一约束(unique key)是指所有记录中字段值不能出现重复,例如,为id字段加上唯一性约束后,每条记录id都是唯一的,不能出现重复的情况。
# 方式一:
<字段名> <数据类型> unique,
# 方式二:
alter table 表名 add constraint 约束名 unique(列);
- 例如:
# 方式一:
create table user6(
id int,
name varchar(20),
phone_number varchar(20) unique
);
# 方式二:
create table user7(
id int,
name varchar(20),
phone_number varchar(20)
);
alter table user7 add constraint unique_pn unique(phone_number);
- 删除约束
# 方式一对应删除操作:名字为对应列的名字
alter table user7 drop index phone_number;
# 方式二对应删除操作:
alter table user7 drop index unique_pn;
8.5 默认约束
- MySQL默认值约束用来指定某列的默认值。
# 方式一
<字段名> <数据类型> default <默认值>
# 方式二:
alter table 表名 modify 列名 类型 default 默认值;
- 例如:
# 方式一:
create table user8(
id int,
name varchar(20),
address varchar(20) default '北京'
);
insert into user8(id, name) values(12, '张三');
# 方式二:
create table user9(
id int,
name varchar(20),
address varchar(20)
);
alter table user9 modify address varchar(20) default '北京';
insert into user9(id, name) values(12, '张三');
- 删除默认值约束
alter table user9 modify address varchar(20) default null;
8.6 零填充约束
- 概念:插入数据时,当该字段值小于定义长度时,会在该值的前面补上相应的0,zerofill默认int(10),当使用zerofill时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原来的两倍,如有符号[-128, 127] -> 无符号 [0, 256]。
# 操作:
create table user10(
id int zerofill,
name varchar(20)
);
# 删除
alter table user10 modify id int;
9.数据类型
数据类型指在创建表的时候,为表中字段指定数据类型,只有数据符合类型要求才能存储起来,使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用打的,这样就能节省存储空间。
- 数值类型
类型 | 大小 | 范围(无符号,unsigned) | 范围(有符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 byte | (0, 255) | (-128, 127) | 小整数值 |
SMALLINT | 2 bytes | (0, 65535) | (-32768, 32767) | 大整数类型 |
MEDIUMINT | 3 bytes | (0, 16777215) | (-8388608, 8388607) | 大整数类型 |
INT或INTEGER | 4 bytes | (0, 4294967295) | (-2147483648, 2147283647) | 大整数类型 |
BIGINT | 8 bytes | (0,18446744073709551615) | (-9223372036854775808, 922372036854775807) | 极大整数 |
FLOAT | 4 bytes | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | (-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) | 单精度浮点类型 |
DOUBLE | 8 bytes | (2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0, (-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) | 双精度浮点数值类型 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
- 日期和时间类型
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
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:01' UTC 到 '2038-01-19 03:14:07' UTC结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYY-MM-DD hh:mm:ss | 混合日期和时间值,时间戳 |
- 字符串类型
类型 | 大小 | 用途 |
---|---|---|
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 | 极大文本数据 |