Mysql数据库基础
mysql数据库
- 什么是mysql?
- MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一
- MySQL 是开源的,所以你不需要支付额外的费用。
- MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
- MySQL 使用标准的 SQL 数据语言形式。
- MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
- MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。
- MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
- MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。
- 什么是数据库?
- 是按照数据结构来组织、存储和管理数据的仓库。使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。
- 关系型数据库
- 是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
- RDBMS 即关系数据库管理系统的特点:
- 1.数据以表格的形式出现
- 2.每行为各种记录名称
- 3.每列为记录名称锁对应的数据域
- 4.许多行和列组成一张表单
- 5.若干的表单组成database
- RDBMS 术语
- 数据库: 数据库是一些关联表的集合。
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
- 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
mysql数据库操作
-
针对数据库的增删改查:
- 创建数据库
#语法 CREATE DATABASE 数据库名 mysql> CREATE DATABASE DD1 >>> Query OK, 1 row affected (0.00 sec) CREATE DATABASE 数据库名 charset = "指定编码格式"
- 查询数据库
#语法 SHOW DATABASES #查询所有数据库 SHOW DATABASES; >>> +--------------------+ | Database | +--------------------+ | db1 | | DBT1 | | DD1 | | information_schema | | mysql | | performance_schema | | sys | | testdb2 | +--------------------+ 8 rows in set (0.01 sec)
- 删除数据库
#语法 DROP DATABASE 数据库名; >>> sql> DROP DATABASE DD1; Query OK, 0 rows affected (0.01 sec)
-
针对表的增删改查
-
增加表
create table t1(id int,name char(4))
-
查询表
show tables # 查看当前库下的所有表名
-
改
alter table t1 rename t2
-
删
drop table t1
-
-
针对表的增删改查
在操作表之前一定要用use语句选择你要操作的数据库
- 创建数据表
#语法 CREATE TABLE table_name( 字段名1,数据类型[列级别的约束条件][默认值] 字段名2,数据类型[列级别的约束条件][默认值] 字段名2,数据类型[列级别的约束条件][默认值] ····· ); >> mysql> CREATE TABLE tb_tese(id int,name char); Query OK, 0 rows affected (0.01 sec)
- 查询数据表
#语法 DESCRIBE 表名 >>> mysql> DESCRIBE tb_tese; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | char(1) | YES | | NULL | | +-------+- --------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
- 删除数据表
#语法 DROP TABLE 表名 >>> mysql> DROP TABLE tb_tese; Query OK, 0 rows affected (0.01 sec)
- 修改数据表
#语法 ALTER TABLE 旧表名 RENAME 新表名 >>> mysql> ALTER TABLE tb_tase RENAME tb_alter; Query OK, 0 rows affected (0.01 sec) #插曲新表名,看看是否可以查询得到 mysql> DESC tb_alter ; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | char(1) | YES | | NULL | | | age | char(1) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
-
针对数据的增删改查
- 查询数据
#语法 SELECT * FROM 表名 >> mysql> select * from tb_alter; +------+--------+------+ | id | name | age | +------+--------+------+ | 1 | 张三 | 14 | +------+--------+------+ 1 row in set (0.00 sec)
- 新增数据
#语法 INSERT INTO 表名(字段名1,字段名2···) VALUES (values1,values2···) >>> mysql> INSERT INTO tb_alter (id,name,age) values(1,"张三",14); Query OK, 1 row affected (0.00 sec)
- 修改数据
#语法 UPDATE table_name SET field1=new-value1, field2=new-value2 >>> mysql> UPDATE tb_alter SET name = "lisi"; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
- 删除数据
#语法 DELETE FROM 表名 WHERE ClAUSE >>> mysql> DELETE FROM tb_alter WHERE ID = 1; Query OK, 1 row affected (0.00 sec)
mysql数据类型
- 数值类型
- MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
- MySQL支持所有标准SQL数值数据类型。
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
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,-1.175 494 351 E-38),0,(1.175 494 351 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,-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) | 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的值 | 小数值 |
- 字符串类型
- 字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型 | 大小 | 用途 |
---|---|---|
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 | 极大文本数据 |
- 日期和时间类型
-
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
-
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
-
类型 | 大小 ( 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的约束
主键约束 :又称为主码,是表中一列或者多列的祝贺,主键约束(PRimary Key Constrint)要求主键列数据唯一,并且不能为空。主键能够唯一标识表中的兔兔爱葫芦,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度,主键和记录之间的关系如同身份证和人之间的关系,他们之间是一一对应的。主键分为两种类型:单字段主键和多字段主键
-
单字段主键是指主键有一个字段组成,SQL语句格式分为以下两种情况
-
在定义的列的同时定义主键
字段名 数据类型 PRIMARY KEY[默认值]
CREATE TABLE tb_tmp ( id int(11) PRIMARY KEY, name varchar(30), age int(11), )
-
在定义所有列之后指定主键
[CONSTRAINT <约束名>] PRIMARY KEY [字段名]
CREATE TABLE tb_emp1 ( id INT(11), name VARCHAR(30) PRIMARY KEY(id) )
-
-
多字段联合主键是指主键由多个字段联合组成
PRIMARY KEY[字段1,字段2,···,字段n]
CREATE TABLE tb_emp2 ( id INT(10), name VARCHAR(25), depid INT(10), PRIMARY KEY(id,depid) )
外键约束:外键是用来在两个表的数据库之间建立连接,他可以是一列或者多列,一个表可以有一个或者多个外键,外键对应的是参照完整性,一个表的外键可以为空值,若补位空值,则每一个外键值必须邓毅另一个表中主键的哪个值
-
外键:是表中的一个字段,他可以不是本表的主键,但对应另外一个表的主键。外键的主要作用是保证数完整性,定义外键后不能删除在另一个表中有关联联系的
-
主表(父表):对于两个有关联关系的表而言,相关联字段中主键所在的哪个表是主表
-
从表(从表):对于两个有关联关系的表而言,相关联字段中外键所在的哪个表是从表
-
创建外键的语法规则:
CONSTRAINT <外键名> FOREIGN KEY 字段名1 REFERENCES<主表名> 主键列1
CREATE TABLE tb_emp2 ( id INT(10), name VARCHAR(25), depid INT(10), CONSTRAINT fk_emp2_depid FOREIGN KEY depid REFERENCES tb_emp1 id ON UPDATE CASCADE id #同步更新 ON DELETE CASCADE id #同步删除 ##上述语句执行后就是在表tb_emp上添加了一个名叫fk_emp2_depid的外键约束,外键名称为deptid,它依赖于tb_emp1表中的主键id )
子键的外键必须关联附表的主键,切挂念字段的数据类型必须陪陪,如果类型不一样,则创建子表时就会出现错误提示
非空约束:非空约束(NOT NULL Constraint)是指字段的值不能玩诶空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错
-
语法规则:
字段名 数据类型 NOT NULL
CREATE TABLE tb_emp2 ( id INT(10), name VARCHAR(25) NOT NULL, depid INT(10), PRIMARY KEY(id,depid) )
唯一性约束:要求该列为一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者级列都不出出现重复值
-
语法规则
(1)字段名 数据类型 UNIQUE
CREATE TABLE tb_emp2 ( id INT(10), name VARCHAR(25)NOT NULL UNIQUE, depid INT(10), PRIMARY KEY(id,depid) )
(2)CONSTRAINT 约束名 UNIQUE 字段名
CREATE TABLE tb_emp2 ( id INT(10), name VARCHAR(25)NOT NULL, depid INT(10), PRIMARY KEY(id,depid) CONSTRAINT UU UNIQUE(name) )
默认约束:指定某列的默认值。如果男性同学较多,性别就可以默认为“男”。如果插入一条新纪录是没有为这个字段赋值,那么系统就会自动为这个字段赋值为“男”
-
语法规则
字段名数据类型 DEFAULT 默认值
CREATE TABLE tb_emp2
(
id INT(10),
name VARCHAR(25)NOT NULL,
depid INT(10) DEFAULT 111,
PRIMARY KEY(id,depid)
CONSTRAINT UU UNIQUE(name)
)
设置数据表的属性值自动增加:在MYSQL中,默认情况下AUTO_INCREMENT出事值为1,没新增一条记录,字段自动加1
-
语法规则
字段名 数据类型 AUTO_INCREMENT
CREATE TABLE tb_emp2 ( id INT(10)PRIMARY KEY AUTO_INCREMENT, name VARCHAR(25)NOT NULL, depid INT(10) DEFAULT 111, PRIMARY KEY(id,depid) CONSTRAINT UU UNIQUE(name) )
查询语句详解
-
基本查询语句:MySql提供select语句进行数据库查询,该语句使用当时灵活,功能丰富,语法如下
SELECT 属性列表 FROM 表名或视图名 [WHERE 表达条件式] [GROUP BY 属性名 [HAVING 条件表达式]] [ORDER BY 属性名[ASCIDESC]]
select 语句的含义是根据where子句的条件表达式,从from子句指定的基本表或试图中查找满足条件的记录,如果有group by子句,则将结果按照group by子句后的属性进行分组,该属性值相等的记录分为一组,一般会在每组上使用举个函数进行统计,如果在group by子句后带having断句,则只有满足having后面表达式的组才予输出。如果有order by子句,则会根据order by子句后面的属性进行圣墟或降序排列
-
查询表中部分字段
- 如果只需要表中的部分字段的数据,可以通过select子句指定那些字段出现在结果中。不同字段之间用逗号(,)分割,最后一列后面不需要加逗号
select id, name, age from student
-
查询表中全部字段
- 1.在select子句中将所有的字段都列出
select id, name, age, adress from student
- 2.将select子句中的属性列表指定为”*“,该符号代表所有列
select * from student
-
查询经过计算的值(也就是我们可以在select子句中进行运算)
- select子句后面不仅可以是表中的基本字段,也可以是表达式
- 查询 select name, year(now())-age from student #查询结果中的year(now())为函数嵌套,now()函数获取系统如期,year可以获取参数的年份,year(now())的结果为系统日期的年份,year(now())-age得到的是学生的出生年份 #为查找结果设置别名 select name, year(now())-age as bir from student #直接在查询结果中写表达式 select stu_id,now() from student
-
查询表中的若干记录
- DISTINCT:清除取值重复的行,表中的记录没有重复,但是经过查询有重复,可以使用DISTINCT来消除重复行
select distinct[要去重的字段] from 查询表
-
查询表中满足条件的记录
操作符 描述 = 等号,检测两个值是否相等,如果相等返回TRUE <>,!= 不等于,检测两个值是否相等,如果不相等返回True > 大于号,检测左边的值是否大于右边的值 < 小于号,检测左边的值是否小于右边的值 >= 大于等于号,检测左边的值是否大于等于右边的值 <= 小于等于号,检测左边的值是否小于等于右边的值 -
确定范围(between···and | not between ··· and)
- 如果查询条件为某个字段或不在某个范围,可以使用谓词between···and或者not between and,其中between后面为下限,and后面为上限
-
带in关键字的查询
select * from student where age in (12,20,23) # 相反,可以用not in 来查询不属于指定集合的记录
- like的字符匹配查询
[not] like '<匹配串>'
- 查询空值
select * from student where name is null
- 多重条件查询
- 可以使用运算逻辑符and或者or来连接多个查询条件,and的优先级要高于or,可以使用括号来改变优先级的顺序
#查询数据库中年龄18岁并且分数在80以上的学生 select * from student where age > 18 and garde >80 #查询计算机系或者经贸系的学生 select * from student where sdept = '计算机系' or sdept = '经贸系'
-
order by排序
- 使用order by子句对查询结果进行排序,可以根据一列或者多列对结果进行升序或者降序排列
#对查询出的结果根据age进行排序 select id, name, age from student order by age desc
-
统计函数:
-
在实际项目中,需要通过表中的基本数据进行统计,比如求某列值的和,某列值得平均值等。mysql提供统计函数进行统计
函数 说明 AVG(列名) 返回某列的平均值 COUNT(*) 返回记录的行数 COUNT(列名) 返回一列中指的个数 MAX(列名) 返回某列最大的值 MIN(列名) 返回某列最小的值 SUM(列名) 返回某个列之和
-
-
GROUP BY
- 将查询结果根据某一列或者多列的值进行分组,值相等的为一组,分组的目的一般与统计相关
- 单字段返祖
#统计不同系别的学生 select sdept,count(*) as count _sdept from student group by sdept # 将查询结果根据sdept的值进行分组
- 多字段分组
select ssex,sage count(*) from student group by ssex,sage # 此查询根据性别分为两组,然后在女生中根据年龄再次分组,男生也根据年龄再次分组
-
HAVING子句
- 可以使用HAVING子句对组进行筛选,得到符合条件组的信息。
select sno,avg(grade) from sc group by sno having avg(grade)>80 #根据sno将学生的选秀课程的成绩信息进行分组,然后统计每组的平均成绩,最后筛选出成绩大于80的分组信息
mysql连接查询
- 设计两个表或者两个表以上的被称为连接查询。连接查询是关系数据库中最重要的查询类型。连接查询分为内连接查询,外连接查询和复合条件查询。
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
select s.no,sname,cno,grade from student s inner join sc no s.sno = sc.sno # 在参加连接的表中间加上inner join,连接条件使用on 关键字给出,连接条件是相同的
本文地址:https://blog.****.net/zyh990214/article/details/107315346
推荐阅读
-
将MySQL命令行的显示数据提取为文本方法[图文]
-
MySQL修改root密码_MySQL
-
mysql5.0触发器后门尝试_MySQL
-
简单的图形计数器需要MYSQL,GD的支持_MySQL
-
MySQL的MyISAM存储引擎修复及修改最大文件大小
-
MySQL管理利器:phpMyAdmin 3.0.1.1发布下载
-
关于eval 与new Function 到底该选哪个?_基础知识
-
MySQL 半同步复制(semi_sync_replication)搭建及使用
-
HP-UX IA64 11.31系统上安装Oracle 10.2数据库相关要求
-
mysql 1045 access denied for user 解决方法_MySQL