MYSQL 语言入门(1)

一、基本概念

1 SQL基本概念

​ SQL(Structured Query Language)是结构化查询语言的简称,它是一种数据库查询和程序设计语言,同时也是目前使用最广泛的关系型数据库操作语言。在数据库管理系统中,使用SQL语言来实现数据的存取、查询、更新等功能。

​ SQL是由IBM公司在1974~1979年之间根据E.J.Codd发表的关系数据库理论为基础开发的,其前身是“SEQUEL”,后更名为SQL。由于SQL语言具有集数据查询、数据操纵、数据定义和数据控制功能于一体,类似自然语言、简单易用以及非过程化等特点,得到了快速的发展,并于1986年10月,被美国国家标准协会(American National Standards Institute,ANSI)采用为关系数据库管理系统的标准语言,后为国际标准化组织(International Organization for Standardization,ISO)采纳为国际标准。

标准大致页数发布日期
SQL-861986
SQL-89120页1989
SQL-92622页1992
SQL:19991700页1999
SQL:20032003
SQL:20082008
SQL:20112011

了解:

SQL标准的制定工作的是由ISO和IEC联合成立的一个技术委员会JTC1/SC32负责的。

提起SQL标准,涉及的内容其实是SQL92里头最基本或者说最核心的一部分。SQL92本身是分级的,包括入门级、过度级、中间级和完全级。不过,SQL标准包含的内容实在太多了,而且有很多特性对新的SQL产品而言也越来越不重要了。从SQL99之后,标准中符合程度的定义就不再分级,而是改成了核心兼容性和特性兼容性;也没有机构来推出权威的SQL标准符合程度的测试认证了。

我们简单了解一下SQL92和SQL99中比较常用的区别:

SQL92的连接查询包括:等值连接(即内连接)、非等值连接、自连接

SQL99的连接查询包括:等值连接、非等值连接、自连接、左(右)外连接、交叉连接(笛卡尔积)

SQL92和SQL99的连接查询语法不太一样,SQL92是通过在where后添加关联条件的;而SQL99是通过join关键字进行表的连接查询,连接条件是写在on后面的。

2 SQL作用
  • 是所有关系型数据库的统一操作规范,不同关系型数据库都支持SQL
  • 所有的关系型数据库都可以使用SQL
  • 不同数据库之间的SQL有一些区别(方言)
3 SQL语法规范
  • SQL语句可以单行或者多行书写,以;结尾(Navicat中可以不写;)

  • 可以使用空格或者缩进增加语句的可读性

  • MySQL中使用SQL不区分大小写,一般数据库名,表名,列名小写

  • 注释方式

    注释语法说明
    – 空格单行注释
    /**/多行注释
    #MySQL特有的单行注释
4 SQL分类

数据查询语言(Data Query Language,DQL):

DQL主要用于数据的查询,其基本结构是使用SELECT子句,FROM子句和WHERE子句的组合来查询一条或多条数据。

数据操作语言(Data Manipulation Language,DML):

DML主要用于对数据 增加、修改和删除的操作。
主要包括: INSERT-增加数据;UPDATE-修改数据;DELETE-删除数据。

数据定义语言(Data Definition Language,DDL):

DDL主要用针对是数据库对象(数据库、表、索引、视图)进行创建, 修改和删除操作。
主要包括: CREATE-创建;ALTER-修改;DROP-删除。

数据控制语言(Data Control Language,DCL):

DCL用来授予或回收访问数据库的权限。

主要包括: GRANT-授予用户某种权限;REVOKE-回收授予的某种权限 。

事务控制语言(Transaction Control Language,TCL):

TCL用于数据库的事务管理。

主要包括: START TRANSACTION-开启事务;SET TRANSACTION-设置事务的属性
COMMIT-提交事务;ROLLBACK-回滚事务

二、DDL操作

1. DDL操作数据库

1.1 DDL操作数据库案例
-- 查看所有的数据库
show databases;

-- 创建数据库
create database wck;

-- 删除数据库
drop database wck;

2. DDL操作数据库表

2.1 MySQL中常见的数据类型
类型描述
int整型
double浮点型
varchar字符串型
date日期类型,格式为:yyyy-MM-dd
2.2 详细数据类型
2.2.1 整数类型
整数类型大小表数范围(有符号)表数范围(无符号)作用
TINYINT1字节(-128,127)(0,255)小整数值
SMALLINT2字节(-32768,32767)(0,65535)大整数值
MEDIUMINT3字节(-8388608,8388607)(0,16777215)大整数值
INT/INTEGER4字节(-214748364,2147483647)(0,4294967295)大整数值
BIGINT8字节(-9233372036854775808,9223372036854775807)(0,18446744073709551615)极大整数值

​ MySQL支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。显示宽度并不限制可以在列内保存的值的范围.

2.2.2 浮点数类型
浮点数类型大小作用
FLOAT4字节单精度浮点数值
DOUBLE8字节双精度浮点数值

注意事项:
浮点数类型的宽度不会自动扩充,使用时需要指定长度。
如:score double(4,1) 总体长度是4 精度为1位。

2.2.3 字符串类型
字符串类型大小描述
CHAR(M)0~255字符允许长度0~M个字符的定长字符串
VARCHAR(M)0~65535字符允许长度0~M个字符的变长字符串
BINARY(M)0~255字节允许长度0~M个字节的定长二进制字符串
VARBINARY(M)0~65535字节允许长度0~M个字节的变长二进制字符串
TINYBLOB0~255字节二进制形式的短文本数据(长度为不超过255个字符)
TINYTEXT0~255字节短文本数据
BLOBbinary large object二进制形式的长文本数据
TEXT长文本数据
MEDIUMBLOB0~16777215字节二进制形式的中等长度文本数据
MEDIUMTEXT0~16777215字节中等长度文本数据
LOGNGBLOB0~4294967295字节二进制形式的极大文本数据
LONGTEXT0~4294967295字节极大文本数据

​ CHAR和VARCHAR类型相似,均用于存于较短的字符串,主要的不同之处在于存储方式。CHAR类型长度固定,VARCHAR类型的长度可变。因为VARCHAR类型能够根据字符串的实际长度来动态改变所占字节的大小,所以在不能明确该字段具体需要多少字符时推荐使用VARCHAR类型,这样可以大大地节约磁盘空间、提高存储效率。
注意事项:
​ CHAR和VARCHAR表示的是字符的个数,而不是字节的个数。

2.2.4 日期和时间类型
类型格式取值范围
TIME‘HH:MM:SS’(‘-838:59:59’, ‘838:59:59’)
DATE‘YYYY-MM-DD’(‘1000-01-01’, ‘9999-12-31’)
YEARYYYY(1901, 2155), 0000
DATETIME‘YYYY-MM-DD HH:MM:SS’(‘1000-01-01 00:00:00’, ‘9999-12-31 23:59:59’)
TIMESTAMP时间戳‘YYYY-MM-DD HH:MM:SS’(‘1970-01-01 00:00:01’ UTC, ‘2038-01-19 03:14:07’ UTC)

TIMESTEMP类型的数据指定方式与DATETIME基本相同,两者不同之处在于以下几点:

  1. 数据的取值范围不同,TIMESTEMP类型的取值范围更小
  2. 如果我们对TIMESTAMP类型的字段没有明确赋值,或是被赋与了NULL值,MySQL会自动将该字段赋值为系统当前的日期与时间
2.3 DDL-创建数据库表

语法:

create table 表名(
	字段1	数据类型,
    字段2 数据类型(长度)
);
-- 注意:最后一个字段不要加逗号,可以给字段的数据类型指定长度

练习1:创建商品分类表

表名:category
表中的字段:
	分类编号:cid,整型
	分类名称:cname,字符串类型,长度为20

SQL实现:

-- 切换到bjsxt01数据库
use bjsxt01;
-- 创建表
create table category(
	cid int,
    cname varchar(20)
);

练习2:创建学生表

表名:student
表中的字段:
	学号:sid,整型
	姓名:sname,字符串类型,长度为10
	性别:sex,字符串类型,长度为1
	年龄:age,整型
	入学日期:createdate,日期类型
	班级:clazz,字符串类型,长度为15
	邮箱:email,字符串类型,长度为25

SQL实现:

create table student(
	sid int,
    sname varchar(10),
    sex char(1),
    age int,
    createdate date,
    clazz varchar(15),
    email varchar(25)
);
2.4 DDL-查看数据库表
-- 显示当前数据库的所有的表
show tables;
-- 显示某个表的结构 desc 表名
desc student;
-- 查看某个表完整的建表语句 show create table 表名
show create table student;
2.5 DDL-删除数据库表
-- 删除当前数据库中的某个表  drop table 表名
drop table student;
2.6 DDL-修改数据库表
2.6.1 修改表名
-- 语法格式:rename table 旧表名 to 新表名;

-- 修改student表名为stu
rename table student to stu;

-- 显示所有表
show tables;
2.6.2 向表中添加字段
-- 语法格式:alter table 表名 add 字段名称 字段类型;

-- 案例:向学生表中添加字段address,长度为50
alter table stu add address varchar(50); -- 默认添加到最后
alter table stu add address2 varchar(50) first; -- 添加到第一个
alter table stu add address3 varchar(50) after age; -- 添加到age字段之后

-- 查看表结构
desc stu;
2.6.3 修改表中字段
-- 语法格式: alter table 表名 modify 字段名称 字段类型;(修改字段类型和长度)

-- 案例:修改学生表中的字段address,长度改为30
alter table stu modify address varchar(30);

-- 语法格式:alter table 表名 change 旧字段名 新字段名 类型(长度); (修改字段名 )

-- 案例:修改学生表中的字段address,修改为city,长度为10
alter table stu change address city varchar(10);
2.6.4 删除表中字段
-- 语法格式:alter table 表名 drop 字段名;

-- 案例:删除学生表中 address2字段
alter table stu drop address2;

三、DML操作

1. 插入数据

-- 语法格式:
-- 1. 插入部分或全部字段 insert into 表名(字段名1,字段名2,...,字段名n) values(值1,值2,...,值n);
-- 2. 插入全部字段 insert into 表名 values(值1,值2,...,值n);

-- 案例:向学生表中插入数据
-- 方式1:插入全部字段,将所有字段名都写出来
insert into stu(sid,sname,sex,age,createdate,clazz,email) values(1,'张飞','男',50,'1990-05-05','1班','zhangfei@qq.com');

-- 方式2:插入全部字段,可以不写字段名
insert into stu values(2,'刘备','男',30,'1995-06-06','2班','liubei@qq.com');

-- 方式3:插入指定字段的值
insert into stu(sid,sname,age,createdate) values(3,'赵云',19,now());
insert into stu(sid,sname,createdate) values(4,'曹操',sysdate());
insert into stu(sid,createdate) values(5,current_date());

注意事项:

  1. 值与字段必须要对应,个数相同、数据类型相同
  2. 值的数据大小,必须在字段指定的长度范围内
  3. varchar char date类型的值必须使用单引号,或者双引号包裹
  4. 如果要插入空值,可以忽略不写,或者写null
  5. 如果插入指定字段的值,必须要上写列名
  6. 字符串日期类型支持 “2000-12-23” “2000/12/23” “2000.12.23”

2. 修改数据

-- 语法格式
-- update 表名 set 字段1=值1,字段2=值2,...,字段n=值n where 条件;
-- update 表名 set 字段1=值1,字段2=值2,...,字段n=值n; -- 慎用:不加条件会修改所有的数据

-- 案例1:将sid=1的学生性别改为女
update stu set sex='女' where sid=1;
-- 案例2:将sid=2的学生性别改为女,年龄改为30,班级改为11班
update stu set sex='女',age=30,clazz='11班' where sid=2;

3. 删除数据

-- 语法格式
-- delete from 表名 where 条件;
-- delete from 表名; -- 慎用:删除表中的所有数据
-- truncate table 表名; -- 慎用:删除表中的所有数据

-- 案例1:删除sid=5的学生信息
delete from stu where sid=5;
-- 案例2:删除stu表中所有的数据
-- 方式一:
delete from stu;
-- 方式二:
truncate table stu; -- 推荐使用

truncate 和 delete的对比:

  1. 这两种操作都可以删除表中的数据
  2. delete为数据操作语言DML;truncate 为数据定义语言DDL。
  3. delete操作是将表中所有记录一条一条删除直到删除完;truncate 操作则是保留了表的结构,重新创建了这个表,所有的状态都相当于新表。因此,truncate 操作的效率更高。
  4. delete操作可以回滚;truncate 操作会导致隐式提交,因此不能回滚(后面会讲解事务的提交和回滚)。
  5. delete操作执行成功后会返回已删除的行数(如删除4行记录,则会显示“affected rows:4”);truncate 操作不会返回已删除的行量,结果通常是“affected rows:0”。
    delete操作删除表中记录后,再次向表中添加新记录时,对于设置有自增约束字段的值会从删除前表中该字段的最大值加1开始自增;truncate 操作会重新从1开始自增。

四、表的约束

1. 约束的作用

​ 可以对表中的数据做一些限制, 从而保证数据的正确性, 有效性, 和完整性。

​ 违反约束的不正确数据是无法插入到表中的。

2. 约束的分类

约束名关键字作用
主键primary key不可重复, 不能为空,即唯一 + 非空
唯一unique不可重复
非空not null不能为空
默认值default赋予默认值
检查(Mysql8提供)check取值范围
外键foreign key表与表之间的关系

3. 主键约束

3.1 添加主键约束
-- 语法格式:字段名 字段类型 primary key

-- 案例1:创建一个带有主键的emp表 字段 eid int  ename varchar(10)  esex char(1)
-- 方式一
create table emp(
	eid int primary key,  -- 设置主键 非空唯一
	ename varchar(10),
	esex char(1)
);

-- 方式二
-- 删除emp表
drop table emp;
create table emp(
	eid int,
	ename varchar(10),
	esex char(1),
	primary key(eid)  -- 指定主键为eid字段
);

-- 方式三
-- 删除emp表
drop table emp;
create table emp(
	eid int primary key,
	ename varchar(10),
	esex char(1)
);
-- 创建表时不指定主键, 然后通过DDL语句进行设置
alter table emp add primary key(eid);
3.2 测试主键的唯一 和非空
-- 插入正常数据
insert into emp values(1,"宋江","男");

-- 插入一条数据, 主键为空
insert into emp values(null,"李逵","男");
-- Column 'eid' cannot be NULL 主键不能为空 

-- 插入一条数据, 主键重复
insert into emp values(1,"孙二娘","女");
-- Duplicate entry '1' for key 'emp.PRIMARY' 主键冲突
3.3 哪些字段可以作为主键?
  • 通常针对业务去设计主键, 每张表都设计一个主键id, 并且只能有一个主键.
  • 主键是给数据库和程序使用, 所以主键没有意义没有关系, 只要能保证不重复就好, 比如身份证就可以作为主键.
3.4 删除主键约束
-- 使用DDL 删除表中的主键约束
alter table emp drop primary key;

-- 查看表结构
desc emp;

-- 删除唯一约束(了解)
-- 添加了唯一约束为 eid int not null, 通过设置字段属性删除唯一约束 
alter table emp modify eid int;
3.5 主键自增

自己添加数据可能出现重复, 我们通常希望在每次插入新记录时, 数据库自动生成主键字段的值。

-- 语法格式: 关键字 auto_increment	 表示自增长(字段类型必须为整数类型)

-- 案例:为emp表eid字段添加主键约束, 并设置为自增
-- 创建主键自增的emp表
drop table emp;
create table emp(
	eid int primary key auto_increment,
	ename varchar(10),
	esex char(1)
);
-- 测试主键自增
insert into emp values(null,'张三','男');
insert into emp values(default,'李四','男');
insert into emp(ename, esex) values('王五', '男');

4. 非空约束

-- 语法格式: 字段名 字段类型 not null

-- 案例:创建emp表,eid为主键约束,自增,ename为非空约束
-- 删除存在的emp表 
drop table emp;
create table emp(
	eid int primary key auto_increment,
	ename varchar(10) not null,
	esex char(1)
);
-- 测试非空约束
insert into emp values(default,null,'n');
-- Column 'ename' cannot be null  ename不能为空

5. 唯一约束

-- 语法格式: 字段名 字段类型 unique

-- 案例:emp表 eid 主键约束,自增  ename 非空约束 esex唯一约束
-- 删除存在的emp表 
drop table emp;
create table emp(
	eid int primary key auto_increment,
	ename varchar(10) not null,
	esex char(1) unique
);
-- 测试唯一约束 添加两个性别为男
insert into emp values(default,'zs','男');
insert into emp values(default,'lisi','男');
-- Duplicate entry 'n' for key 'emp.esex'  esex重复

6. 默认值约束

-- 语法格式: 字段名 字段类型 default '值'

-- 案例:emp表 eid 主键约束,自增  ename 非空约束 esex默认值'男'
-- 删除存在的emp表 
drop table emp;
create table emp(
	eid int primary key auto_increment,
	ename varchar(10) not null,
	esex char(1) default '男'
);
-- 查看emp表结构 
desc emp;
-- 测试默认值约束
insert into emp values(default,'zs',default);

-- 错误用法
insert into emp values(default,'zs',null); 

7. 检查约束

语法格式:

字段名 字段类型 check(字段='值' or 字段='值')
字段名 字段类型 check(字段>n or 字段<m)
字段名 字段类型 check(字段>n and 字段<m)

案例:emp表 eid 主键约束, 自增 ename 非空约束 esex默认值’男’并检查 男|女

-- 删除存在的emp表 
drop table emp;
create table emp(
	eid int primary key auto_increment,
	ename varchar(10) not null,
	esex char(1) default '男' check(esex='男' or esex='女')
);
-- 查看emp表结构 
desc emp;
-- 测试检查约束
insert into emp values(default,'lisi','n');
-- Check constraint 'emp_chk_1' is violated 不符合字段要求

五、综合案例

1. 需求

需求1: 创建数据库wck

需求2: 创建数据库表student

  • 建立一张用来存储学生信息的表
  • 字段包含学号、姓名、性别,年龄、入学日期、班级,email等
  • 学号是主键 = 不能为空 + 唯一
  • 年龄 不能为空 检查 年龄在1-150岁之间
  • 姓名不能为空
  • 性别默认值是男 检查 男|女
  • Email唯一

需求3: 添加五条测试数据

  • 实现一次插入一条数据
  • 实现一次插入多条数据

需求4: 删除编号为1的学生信息

需求5: 修改编号为2, 性别改为相反

需求6: 验证表中的约束

2. 实现

-- 创建数据库
create database wck;

-- 切换到指定的数据库
use wck; 

-- 删除学生表
drop table student;

-- 创建表Student
create table student(
   id int primary key auto_increment comment '学号',
   name varchar(30) not null comment '姓名',
   age int not null check(age>=1 and age<=150) comment '年龄',
   sex char(1) default '男' check(sex='男' or sex='女') comment '性别',
   hiredate date comment '入学日期',
   email varchar(50) unique comment '邮箱'
);

-- 查看表结构
desc student;

-- 插入数据
insert into student values(default, '吕布', 20, '男', '2000-02-02', 'lvbu@qq.com');

-- 插入多条数据
insert into student values(default, '宋江', 30, '男', '2001-02-02', 'songjiang@qq.com'),
(default, '貂蝉', 30, '女', '2010-03-02', 'diaochan@qq.com')

-- 查看数据
select * from student;

-- 删除编号为1的数据
delete from student where id=1;

-- 修改编号为2的数据,性别改为相反的
update student set sex='女' where id=2;

-- 验证主键约束  1062 - Duplicate entry '3' for key 'PRIMARY'
insert into student values(3, 'tom', 30, '男', '2001-02-02', 'tom@qq.com');

-- 验证非空约束  1048 - Column 'name' cannot be null
insert into student values(default, null, 30, '男', '2001-02-02', 'lucy@qq.com');

-- 验证检查约束  3819 - Check constraint 'student_chk_2' is violated.
insert into student values(default, '关羽', 30, '中', '2001-02-02', 'guanyu@qq.com');

-- 验证唯一约束  1062 - Duplicate entry 'tom@qq.com' for key 'email'
insert into student values(default, '伊藤舞雪', 30, '男', '2001-02-02', 'tom@qq.com');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值