Sql是结构化查询语言,是专门用来与数据库通信的语言。
优点:①sql不是某个特点数据库供应商专有的语言,它使你几乎能与所以数据库打交道;②简单易学;③灵活使用它,可以进行非常复杂和高级的数据库操作。
Sql语句不区分大小写,通配符 *,可以查询出所有的列,如果不要求查询所有列,不建议使用 *,因为这样会降低检索和应用的性能。通配符大的优点是可以检索出未知道的列。
使用distinct关键字可以让mysql只返回不同的(唯一的行)值。distinct关键字放在列名前面。
主键(primary key):一列(或一组列),其值可以唯一标识表中每一行。
表中的任何列都可以作为主键,只要它满足:①任意两行都不具有相同的主键值;②每一行都必须具有一个主键值(主键值不允许为NULL值);③主键列中的值不允许修改或者更新;④主键值不能重用,(如果某行从列中删除,它的主键值不能赋给以后的新行)。
主键的作用:①保证实体的完整性;②加快数据库的操作速度;③在表中添加新记录时,DBMS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。④ DBMS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录
外键:如果一张表中有一个非主键的字段指向了别一张表中的主键,就将该字段叫做外键。(它是相对于主键说的,是建立表之间 的联系的必须的前提。)
外键的作用:①对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败。②对父表的作用:对父表的主键字段进行删和改时,如果对应的主键在子表中被引用,操作就会失败。③为了一张表记录的数据不要太过冗余。④保持数据的一致性、完整性。
使用外键的前提:①表储存引擎必须是innodb,否则创建的外键无约束效果。② 外键的列类型必须与父表的主键类型完全一致。③ 外键的名字不能重复。④ 已经存在数据的字段被设为外键时,必须保证字段中的数据与父表的主键数据对应起来。
缺点:设置外键一定程度上降低数据库的速度,降低数据库的性能(①数据库需要维护外键的内部管理;②外键等于把数据的一致性事务实现,全部交给数据库服务器完成;③有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;④.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;)
(完整性: 是指主键上的值不能为空. 比如关系R(学生号,学生姓名,成绩)学生号为主键那它就不能为空否则违反规则.
一致性:就是要始终保证数据的正确性 比如你去银行转钱你转1000但卡里只有300执行事务时查询到你金额不足就会返回拒绝执行而不是把你卡里的300转走,依然保持你卡里之前的金额300这就是一致性.恢复到事务的初始状态.)
MySQL是一种关联数据库管理系统(数据库管理系统简称DBMS),关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
优点:①成本,它是开源的,一般可以免费使用。②性能,mysql执行很快。③可信赖④简单,mysql很容易安装和使用。
缺点:它并不总是支持其他的DBMS提供的功能和特性。
(1)Mysql是开源的,所以你不需要支付额外的费用。
(2)Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
(3)MySQL使用标准的SQL数据语言形式。
(4)Mysql可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
(5)Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言。
(6)MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
(7)Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。
学习mysql:
1、当我们连上服务器后,先选库“use test;”(如果不知道有那些库可以用“show databases;”来查看):
创建一个数据库:“create database 数据库名 charset utf8;”(“create database gy1 charset utf8;”)
删除一个数据库“drop databases 数据库名;”(“drop databases gy1;”)
2、再选表“show tables;”(如果不知道有那些表,可以用“show tables;”来查看):
简单的建表语句:create table stu(snum int,
sname varchar(10) )engine myisam charset utf8;
)
删除一个表:drop table stu;
给表改名字:rename table stu to newstu;
往表中插入数据:insert into newstu values (1,zhangsan),(2,lisi),(3,xiaoming);
查询表中所以数据:select * from newstu;
清除表中全部数据:truncate newstu;
truncate和delete的区别:
truncate相当于删除原来的表,重新创建一个一模一样新的表,而delete是删除所以层面来操作的。如果全部清除数据,truncate速度更快。
把数据库改名?
Mysql中,表/列可以改名,database不能改名。
语句可以换行,遇到 ; 时才结束。
\c退出语句。
查看表结构:desc 表名;
创建一个员工表:
create table class(
id int primary key auto_increment,
sname varchar(10) not null default ' ',
sex char(1) not null default ' ',
company varchar(20) not null default ' ',
salary decimal(6,2) not null default 0.00,
fanbu smallint not null default 0
)engine myisam charset utf8;
set names gbk;(命令行窗口的默认编码为gbk,而我们在mysql服务端设为utf8,所以存储和调取数据时,编码格式不一致,SET NAMES GBK 实际是通知服务器,我是gbk,你得负责翻译!)
3、插入操作
插入1:
insert into class
(id,sname,sex,company,salary,fanbu)
values
(1,'张三','男','西南',888.88,234);
select * from class;
插入2:(id是自增型,可以不写)
insert into class
(sname,sex,salary)
values
('张三','男',888.88);
如果不声明插入的列,则默认依次插入所以列
insert into class
values
(null,'李四','男','百度',888.666,232);
或者
insert into class
values
(3,'李四','男','百度',888.666,232);
insert into class
(sname,company,salary,fanbu)
values
('孙权','江东霸主',555.88,233),
('曹操','天下暴君',333.88,145);
4、修改操作:
①
update class
set fanbu=100
where id=6;
②
update class set sex='男',fanbu=120 where sname='孙权';
5、删除操作
把工资等于888.88到删除
delete from class where salary=888.88;
delete from class(把表中所有的数据都删除了)
6、查询操作
select sname,company,salary,fanbu from class where id=3;
7、建表:
学号 |
姓名 |
家乡 |
入学时间 |
0101 |
张三 |
北京 |
2019.4.23 |
建表的过程就是声明字段的过程,建表时要考虑能够存放内容的空间大小,但又不浪费。
存储同样的数据,不同的列类型,所占据的空间和效率是不一样。
重点:列类型的存储范围和占据的字节关系。
8、Mysql三大类型:
(1)数值型:
列类型 |
需要的存储量 |
TINYINT |
1 字节 |
SMALLINT |
2 个字节 |
MEDIUMINT |
3 个字节 |
INT |
4 个字节 |
INTEGER |
4 个字节 |
BIGINT |
8 个字节 |
FLOAT(X) |
4 如果 X < = 24 或 8 如果 25 < = X < = 53 |
FLOAT |
4 个字节 |
DOUBLE |
8 个字节 |
DOUBLE PRECISION |
8 个字节 |
REAL |
8 个字节 |
DECIMAL(M,D) |
M字节(D+2 , 如果M < D) |
NUMERIC(M,D) |
M字节(D+2 , 如果M < D) |
一个字节8位:无符号0-->2^8-1即0-->255
有符号-2^7-->2^7-1即-128-->127
两个字节16位:无符号0-->2^16-1即0-->65535
有符号-2^15-->2^15-1即-32768-->32767
(2)整型
int系列,默认是有符号的。
修改表结构:alter table class1 add score tinyint unsigned not null default 0;
加unsigned (表示无符号)可以影响存储的范围:
alter table class1 add age1 tinyint(1) unsigned not null default 0;
(M)unsigned zerofill
M表示补0宽度,和zerofill配合使用才有作用。
alter table class1 add snum smallint(5) zerofill not null default 0;
(3)小数型
Float(M,D),decimal(M,D)
M叫“精度”表示“总位数”,D叫“标度”,表示“小数位(小数点右边的位数)”
float有时会损失精度,对于银行这些建议用定点decimal。
Char和varchar,分别称为定长和变长类型。
对于char(N),不够N个长度,用空格在尾部补够N个长度,浪费了尾部。(不论够不够指定长度实际都占据n个长度)
对于varchar(N),不用空格补齐,但列内容前,有1-2个字节来标志该列的内容长度。
Char如何占据M个字符宽度?
如果实际存储内容不足M个,则后面加空格补齐。取出来时,再把后面的空格去掉。(所以,如果内容最后有空格,将会被清除)
速度上:定长速度快点。
注意:char(M)、varxhar(M)限制的是字符,而不是字节。
即char(2)、charset utf8,能存储2个字符,比如‘中国’。
concat用来连接字符的。
select concat(ca,!),concat(vca,!) from test;
text文本类型,可以存储较大的文本段,搜索速度较慢。因此,不是特别大的数据建议用char、varchar(1万字,varchar就够了)来代替。Test不用加默认值,加了也没有用。
text文本类型一般用来存储文章内容,新文内容等。声明text列时不用给默认值。
create table test(
article text
);就可以了。
lob是二进制类型,用来存储图片、音频等二进制信息。
Blob在于防止因为字符集的问题,导致信息丢失。
4、日期:
create table test(
star varchar(20) not null default ' ',
birth date not null default '0000-00-00'
)engine myisam charset utf8;
insert into test
values
('张国荣','1993-02-12');
时间类型:00:00:00
alter table test add sige time not null default '00:00:00';
insert into test
values
('小米','1999-02-03','21:32:12');
列类型 |
需要的存储量 |
DATE |
3 个字节 |
DATETIME |
8 个字节 |
TIMESTAMP |
4 个字节 |
TIME |
3 个字节 |
YEAR |
1 字节 |
Date能存储时间:1000-01-01到9999-12-31
time -838:59:59和838:59:59
datetime:1000-01-01 00:00:00到9999-12-31 23:59:59
year(1901-2155)