MYSQL简介+MYSQL简单命令(2)

五、表(Table)
表是关系型数据库的基本存储结构。
1)表是二维数据结构,有行和列
2)行(Row)是横排数据,也叫记录(Recond)
3)列(Column)是竖排数据,也叫字段(Field)
4)行与列的交叉点是 字段值
5)表与表之间也存在关系
六、结构化查询语言(SQL)
结构化查询语言(Structured Query Language),简称SQL,是数据库的标准查询语言。
可以通过DBMS对数据库进行定义数据,操纵数据查询数据,数据控制等
SQL语言之TCL:事务控制语言.
有时我们可能需要使用DML进行批量数据的删除,修改,增加。比如,在一个员工系统中,
我们想删除一个人的信息,除了删除这个人的基本信息外,还应该删除与此人有关的其他信息,
如邮箱,地址等等。那么从开始执行到结束 就会构成一个事务。
对于事务,我们要保证事务的完整性。要么成功,要么撤回。

一般情况下事务要符合四个条件(ACID):
原子性(Atomicity):
事务要么成功,要么撤回。不可切割性。
一致性(Consistency):
事务开始前和结束后,要保证数据的一致性。
转账前账号A和账号B的钱的总数为10000;
转账后账号A和账号B的钱的总数应该还是10000;
隔离性(Isolation):
当涉及到多用户操作同一张表时,数据库为会每一个用户开启一个事务。
那么当其中一个事务正在进行时,其他事务应该处于等待状态。保证事务之间不会受影响。
持久性(Durability):
当一个事务被提交后,我们要保证数据库里的数据是永久改变的。即使数据库崩溃了,
我们也要保证事务的完整性。

commit:提交
rollback:撤回,回滚。
savepoint:保存点

事务:只有DML操作会触发一个事务。
存储引擎(ENGINE):就是指表类型.
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句。
有一个默认的存储引擎为Myisam,不支持事务。

事务的验证:
第一步:start transaction
第二步:savepoint 保存点名称
第三步:DML
第四步:commit/rollback;

/*1.开启事务*/
start TRANSACTION

insert into student values(3,'王五')

#设置保存点 在这里开始回滚
#SAVEPOINT savepoint_name; 

/*2.执行DML操作*/
insert into student values(4,'ss')

/*3.将刚刚执行的DML操作进行全部回滚*/
#ROLLBACK

#设置回滚保存点
#ROLLBACK TO savepoint_name;
//提交事务
COMMIT

select * from student

Innodb 数据库引擎的数据库或表才支持事务 不用开启事务

mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb;

mysql> select * from runoob_transaction_test;

mysql> begin;

mysql> insert into runoob_transaction_test value(5);

mysql> insert into runoob_transaction_test value(6);

mysql> commit; # 提交事务

mysql> select * from runoob_transaction_test;
±-----+
| id |
±-----+
| 5 |
| 6 |
±-----+
2 rows in set (0.01 sec)

#回滚事务
mysql> begin; # 开始事务

mysql> insert into runoob_transaction_test values(7);

mysql> rollback; # 回滚

mysql> select * from runoob_transaction_test; # 因为回滚所以数据没有插入
±-----+
| id |
±-----+
| 5 |
| 6 |
±-----+
2 rows in set (0.01 sec)

ROLLBACK 回滚的用法可以设置保留点 SAVEPOINT,执行多条操作时,回滚到想要的那条语句之前。

使用 SAVEPOINT
SAVEPOINT savepoint_name; // 声明一个 savepoint

ROLLBACK TO savepoint_name; // 回滚到savepoint
删除 SAVEPOINT

保留点再事务处理完成(执行一条 ROLLBACK 或 COMMIT)后自动释放。

MySQL5 以来,可以用:
RELEASE SAVEPOINT savepoint_name; // 删除指定保留点

begin;
insert into runoob_transaction_test value(33);
SAVEPOINT savepoint_name;
insert into runoob_transaction_test value(44);
ROLLBACK TO savepoint_name;
commit;

±-----+
| id |
±-----+
| 33 |
±-----+


2、约束Constraint:
对插入表中字段的数据起到一定的条件限制。

创建数据库表
使用 create table 语句可完成对表的创建, create table 的常见形式:

create table 表名称(列声明);
以创建 students 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex)、年龄(age)、联系电话(tel)
这些内容:

create table students
(
	id int unsigned not null auto_increment primary key,
	name char(8) not null,
	sex char(4) not null,
	age tinyint unsigned not null,
	tel char(13) null default "-"
);

语句解说:
create table tablename(columns) 为创建数据库表的命令, 列的名称以及该列的数据类型将在括号内完成;

括号内声明了5列内容, id、name、sex、age、tel为每列的名称, 后面跟的是数据类型描述,
列与列的描述之间用逗号(,)隔开;

以 “id int unsigned not null auto_increment primary key” 行进行介绍:

“id” 为列的名称;
“int” 指定该列的类型为 int(取值范围为 -8388608到8388607), 在后面我们又用 “unsigned” 加以修饰, 表示该类型为无符号型, 此时该列的取值范围为 0到16777215;
“not null” 说明该列的值不能为空, 必须要填, 如果不指定该属性, 默认可为空;
“auto_increment” 需在整数列中使用, 其作用是在插入数据时若该列为 NULL,
MySQL将自动产生一个比现存值更大的唯一标识符值。在每张表中仅能有一个这样的值且所在列必须为索引列。
“primary key” 表示该列是表的主键, 本列的值必须唯一, MySQL将自动索引该列。
下面的 char(8) 表示存储的字符长度为8, tinyint的取值范围为 -127到128, default 属性指定当该列值为空时的默认值"-"。

select * from students;
insert into students(id,name,sex,age,tel)
values(Null,‘张三’,‘男’,19,158422323);
标识符
标识符用来命名一些对象, 如数据库、表、列、变量等, 以便在脚本中的其他地方引用。
MySQL标识符命名规则稍微有点繁琐, 这里我们使用万能命名规则: 标识符由字母、数字或下划线(_)组成, 且第一个字符必须是字母或下划线。
对于标识符是否区分大小写取决于当前的操作系统, Windows下是不敏感的, 但对于大多数 linux\unix 系统来说, 这些标识符大小写是敏感的。
SQL可以分为:
1.数据定义语言(DDL):Data Dafinitaion Language

--查询当前用户下有哪些数据库
show databases;
****数据库的表存在mysql安装目录的data文件夹中****


--创建数据库 【 DOS | Navicat】
create database 数据库名称; 

--创建数据库并指定字符集
--charset:字符集,表示该数据库下所有表存储的数据默认的字符集(如果不指定,则采用DBMS默认的)
create database crx655 default character set utf8

--选库
use 库名;
--删除数据库
drop database 数据库名称;
--如创建表create
create table tableName(
	字段1 类型, //int
	字段2 类型, //char(2);
	字段3 类型
)
CREATE TABLE `student` (
  id int(11)   COMMENT '学号',
  sex char(2)  COMMENT '性别'
) 
(这里的COMMENT是注释的意思)

注:mysql中char与varchar的区别:
char:定长,效率高,一般用于固定长度的表单提交数据存储 ;例如:身份证号,手机号,电话,密码等
varchar:不定长,效率偏低
删除表drop
drop table tableName
a)向表最后追加新字段
–格式:alter table tableName add (colName Type);
ALTER TABLE student ADD (ssex VARCHAR(5))
b)删除表字段语句
–格式:alter table tableName drop colName;
ALTER TABLE student DROP ssex
c)–修改表字段类型
–格式:alter table tableName modify colName newType;
ALTER TABLE student MODIFY sno VARCHAR(20)
d)–修改表字段名称
–格式:alter table tableName change oldColName newColName newType;
ALTER TABLE student CHANGE sno snum INT
e)修改表名
–格式:alter table oldName rename newName;
ALTER TABLE student RENAME stu
查看表结构
–格式:desc 表名;
数据操纵语言(DML):Data Multipartion Language
插入数据insert:要与表中的字段一一对应
–格式1:insert into tableName(字段1,字段2…,字段n) values (值1,值2…,值n)

	--格式2:insert into tableName values(值1,值2,..值n);
注:格式2要求插入的值必须和建表时字段的顺序相对应,否则容易出现错误

  删除数据delete(删除行记录)
	--格式:delete from tableName [where eid=2 and(or) ename='小赵'];

  修改数据update
	--格式:update tableName set 字段1=值1,字段2=值2 [where eid > 2];
   
  where语句可以放在 delete  update select 后面做为条件执行	   

(DDL)清空表truncate,彻底清空,无法找回。
	 只删除表中的记录,保留表的结构
--格式:truncate tableName;

DROP,TRUNCATE和DELETE的区别?
drop:删除一张表属于DDL语句
truncate:截取表,将表中的记录删除,保留表的结构,属于DDL语句,一旦删除数据不能进行回滚
delete:删除表中的记录,如果不加条件删除,作用相当于truncate,但是delete属于DML语句,数据删除以后可以进行回滚(Oracle数据库更明显)
当我们要删除很多条记录时,delete的效率要比truncate慢?
delete是一条一条进行删除的,truncate是先将表删除,则创建一张一模一样的表
DQL:数据查询语言。
–select:选择
1.查询:
1)当查询的内容与表无关时,select 查询内容;
2)当查询的内容与表有关时,select 查询内容 from 表名;
查询内容:
查询表中所有的字段:*
查询指定字段:select 字段名,字段名 from 表名;
结果集:查询得到的结果

如果查询时有条件:where 子句
用法:select 字段名,字段名 from 表名 where 条件;

2、给查询显示的列,起别名。
格式:
select 字段名1 [as] 列别名,字段名2 from 表名 [where 条件]
注意:列别名可以不加双引号或单引号,但是如果列别名中带有空格的话,
我们就需要将列别名加上双引号或单引号
select ename 姓名,sal ‘工 资’ from emp

3、where子句:
作用:起到条件限制约束等操作。有过滤的作用。
位置:放在 from子句后。
格式:
select colName from tableName where 条件。

条件:关系运算符:
>,>=,<,<=,=,!=,<>。

(1)null在条件中,不能使用=或!=来判断,应该使用is 或者is not

(2)范围查询:针对于某一个字段来说。
1:可以使用>,>=和<,<=来进行范围限制
2:还可以使用between and来限制。
格式:
colName [not] between val1 and val2;
注意: between val1 and val2 相当于闭区间[val1,val2]
它等于 >= <= 这个范围
(3)集合作为条件写法:同一个字段有多个值的情况下使用。
使用:in|not in
格式:colName [not] in (元素1,元素2,…);
注意:in 相当于 or,比较的都是同一字段
not in 相当于 and,比较的都是同一字段

集合的其他用法:
all与any
格式:
>all(元素1,元素2,元素3…)
:大于集合中最大的元素。
<all(元素1,元素2,元素3…)
:小于集合中最小的元素。
>any(元素1,元素2,元素3…)
:大于集合中最小的元素。
<any(元素1,元素2,元素3…)
:小于集合中最大的元素。

注意:在mysql中,集合函数(>all,>any,<all,<any)不适用与直接加数字
>any(10,20,30) – 不允许
但是我们可以将(10,20,30)转换为子查询即可

(4)模糊查询:like关键字
格式: colName like value。
通常与通配符%连用
%:0或0个以上的字符
_:匹配一个字符。

4、排序:
当在查询表中数据时,记录比较多,有可能需要进行排序,此时我们可以使用order by子句。
位置语法:
select 字段 from 表名 where 条件 order by 字段 排序规则

注:排序规则有两个:
升序:asc(默认)
降序:desc

注:当order by后面是一个字段时,就按照该字段的排序规则进行排序
如果order by后面是多个排序规则,那么会先按照第一个排序规则进行排序,在第一个排序结果相同时,
会按照第二个排序规则进行排序

desc:1)查询表结构 – desc 表名
2)排序的降序规则 – order by 字段 desc

如果设计表时,字段名叫desc,会怎么样?
在使用该字段时,会出现错误,解决办法,将该字段进行转义
字段名

5、去重:有的时候我们可以需要对重复的记录进行去重操作
比如,查询表中有哪些职位,此时,一种职位只需要显示一条记录就够。
关键字:distinct
语法:SELECT DISTINCT 列名称 FROM 表名称
位置: 必须写在select关键字后。
注:distinct可以对一个字段进行去重,也可以对多个字段进行去重(联合去重,就是多个字段组合起来唯一即可)
约束Constraint:
对插入表中字段的数据起到一定的条件限制。

创建数据库表
使用 create table 语句可完成对表的创建, create table 的常见形式:

create table 表名称(列声明);
以创建 students 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex)、年龄(age)、联系电话(tel)
这些内容:

create table students
(
	id int unsigned not null auto_increment primary key,
	name char(8) not null,
	sex char(4) not null,
	age tinyint unsigned not null,
	tel char(13) null default "-"
);

语句解说:
create table tablename(columns) 为创建数据库表的命令, 列的名称以及该列的数据类型将在括号内完成;

括号内声明了5列内容, id、name、sex、age、tel为每列的名称, 后面跟的是数据类型描述,
列与列的描述之间用逗号(,)隔开;

以 “id int unsigned not null auto_increment primary key” 行进行介绍:

“id” 为列的名称;
“int” 指定该列的类型为 int(取值范围为 -8388608到8388607), 在后面我们又用 “unsigned” 加以修饰, 表示该类型为无符号型, 此时该列的取值范围为 0到16777215;
“not null” 说明该列的值不能为空, 必须要填, 如果不指定该属性, 默认可为空;
“auto_increment” 需在整数列中使用, 其作用是在插入数据时若该列为 NULL,
MySQL将自动产生一个比现存值更大的唯一标识符值。在每张表中仅能有一个这样的值且所在列必须为索引列。
“primary key” 表示该列是表的主键, 本列的值必须唯一, MySQL将自动索引该列。
下面的 char(8) 表示存储的字符长度为8, tinyint的取值范围为 -127到128, default 属性指定当该列值为空时的默认值"-"。

select * from students;
insert into students(id,name,sex,age,tel)
values(Null,‘张三’,‘男’,19,158422323);

约束分五种:
主键约束:primary key
要求作为主键的字段的字段值非空且唯一

非空约束: not null
要求有非空约束的字段不可以为null值。

唯一性约束:unique
要求有唯一性约束的字段不可以重复,但是可以为null.

检查性约束:
enum(条件) — gender enum(‘f’,‘m’)

--mysql的check约束无效,所以一般在mysql中不使用check约束
check(条件)--- check(gender in('f','m')) 
要求在插入数据时必须符合字段的检查条件,但是可以为null

序列:作为主键的字段,通常不是表中的主要信息,可以用来当成信息记录的序号。
序号最好是有序的序列。
auto_increment 关键字,用来对有主键约束的字段做自增操作。
用法:
create table tname(
tid int primary key auto_increment,

);

  函数:last_insert_id();
  作用:获取序列最后一次的值。
  select last_insert_id();

猜你喜欢

转载自blog.csdn.net/weixin_40645193/article/details/107323251
今日推荐