ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL数据库

2021-09-24 18:32:00  阅读:190  来源: 互联网

标签:name 数据库 id 数据表 MySQL NULL 主键 select


一、 mysql数据库概述

关系型数据库,默认监听端口:tcp:3306 。mariadb,mysql;

关系型:构建模型是关系-实体图,E-R图;

实体:具有属性的对象

联系:实体与实体之间的关系

属性:用来描述实体

实体集:实体的集合

 

 

二、 mysql安装与配置

  1. mysql的编译安装
  2. yum安装或者apt-get

以CentOS7为例:

1) 配置安装环境

IP,防火墙,Selinux

2) 配置yum源

echo -e “[local]\nname=local\nbaseurl=file:///mnt\nenabled=1\ngpgcheck=0” > /etc/yum.repos.d/local.repo

mount /dev/sr0 /mnt

3) 安装

yum install -y mariadb-server mariadb

  1. MySQL数据库配置:

1) 配置文件: /etc/my.cnf

一般配置写在:[mysqld]字段下。

2) 为mysql数据库本地登录的root用户赋予密码:

mysqladmin -u root password ‘123.com'

 

  1. 数据库本地登录

mysql -u root -p123.com [数据库名]

三、 数据库操作:

  1. 查看命令:

1) 查看数据库:

show databases;

2) 进入数据库:

use 数据库名称;

3) 查看数据表

show tables;

4) 查看数据表的结构:

desc 表名称;

5) 查看表中的数据:

select * from 表名称\G; (\G:数据以行的形式输出。)

  1. 数据库操作:

1) 创建数据库

create database 数据库名称;

2) 删除数据库

drop database 数据库名称;

  1. 数据表操作:

1) 创建数据表

create table 数据表名称(字段名  数据类型,...);

例子:

create table stu_info(stuID int, stuName varchar(20), stuSex varchar(20), stuAge tinyint, stuAddress varchar(200), stuPhone varchar(11));

2) 删除数据表

drop table 数据表名称;

3) 修改数据表

alter table 数据表名称();

  1. 数据结构:

mysql数据库中的数据类型

(1)精准数字

int:整型,-2^31~2^31-1,占用4字节

tinyint:整型,0~255,占用1字节

decimal[(p[,s])]:p,数据长度;s,小数点后保留位数;

numeric[(p[,s]):-10^38+1~10^38-1

(2)浮点数

real:正负十进制数;-3.40E+38~3.40E+38

float:-1.79E+308~-2.23E-308、0以及2.23E+308~1.79E-308

(3)字符串

nchar:定长字符串;char(10),定长10个字符

nvarchar:可变长度字符串,varchar(10),最大10个字符

char:2倍的nchar存储容量

varchar:2倍的nvarchar存储容量

text:存储文本数据

(4)日期

date:只存储日期;公元元年~地球爆炸

time:只存储时间;精确到毫秒;10:13:00-000

datetime:存储日期及时间;1753-1-1至9999-1-1; 2021-08-20:10:13:00-000

(5)货币

money:存储货币值,取值范围为正负922 337 213 685 477.580 8之间

(6)二进制

bit:位数据类型,只取0或1为值

binary:存储固定长度二进制数据;1~8000

  1. 数据操作:

1) 数据添加

insert [into] 数据表名称(字段1, 字段2,.....)  values(数字, ‘字符串’....)

注意: 字段数量一定要等于值的数量。

全表插入数据:

insert into stu_info values(2, 'John', 'male', 21, 'lanou for china', '11011011011');

2) 数据删除

全表删除:

delete from 数据表名称;

指定行删除:(使用where子句)

delete from 数据表名称 where 字段=值;

3) 数据更新

全表更新:

update 数据表名称 set 字段=新值;

指定单字段更新:(使用where子句)

update 数据表名称 set 字段=新值 where 字段=值;

指定多字段更新:

update 数据表名称 set 字段1=新值1, 字段2=新值2  where 字段=值;

案例:

update stu_info set stuPhone='13337373377',stuAddress='dalian for china'  where stuID=2;

 

4) 数据查询

单表查询:

(1) 全表查询:

select * from 数据表名称;

(2) 条件查询(where子句)

条件表达式:

 

 

like通常结合通配符查询:

_:通配单个字符

%:通配所有字符

select * from stu_info where stuName like ‘T%’;

(3) 排序查询

默认是升序排列,若要降序排列:desc

select * from stu_info order by stuAge desc;

(4) 分页查询

select * from 数据表名称 limit 起始行号,步长(查询多少行);

(查询从起始行号下一行开始)

案例:

select * from stu_info limit 0,3;

(5) 聚合查询

sum():求和

select sum(stuAge) from stu_info;

avg():平均值

select avg(stuAge) from stu_info;

min():最小值

select min(stuAge) from stu_info;

max():最大值

select max(stuAge) from stu_info;

下午:

(6) 特定字段查询

select stuName,stuAge from stu_info;

(7) 将查询结果存储到新表

create table stu_info_new(select * from stu_info);

(8) 统计查询count()

select count(*)  from stu_info;

(9) 去重查询

select distinct stuSex from stu_info;

(10) 别名显示结果集:

select stuName [as] 姓名 from stu_info;

(11) 分组查询

select sum(stuAge) age, stuSex from stu_info group by stuSex;

分组前条件查询:

select sum(stuAge) age, stuSex from stu_info where stuSex='female' group by stuSex;

分组后条件查询:

select sum(stuAge) age, stuSex from stu_info  group by stuSex having sum(stuAge) > 45;

 

多表查询:

1) 联合查询

select * from A union all select * from B

注意:A和B表的数据结构要一致

2) 子查询

select * from stu_info where stuName in (select stuName from stu_info_new);

3) 内连接查询

select * from A,B where A.name=B.name;  或者

 select * from A inner join B on A.name=B.name;

4) 外连接查询:(两张或多张表必须有共同的字段名称)

左外连接查询:

select * from A left join B on A.name=B.name;

完整显示左边的表数据。

右外连接查询:

select * from A right join B on A.name=B.name;

完整显示右边的表数据。

数据库扩展:

一、 主键

主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS(数据据库管理系统) 更快的查找到表中的记录,都会在表中设置一个主键。

 

主键分为单字段主键和多字段联合主键,本节将分别讲解这两种主键约束的创建、修改和删除。

 

使用主键应注意以下几点:

 

    每个表只能定义一个主键。

    主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则。

    一个字段名只能在联合主键字段表中出现一次。

    联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。

 

在创建表时设置主键约束

在创建数据表时设置主键约束,既可以为表中的一个字段设置主键,也可以为表中多个字段设置联合主键。但是不论使用哪种方法,在一个表中主键只能有一个。下面分别讲解设置单字段主键和多字段联合主键的方法。

1)设置单字段主键

在 CREATE TABLE 语句中,通过 PRIMARY KEY 关键字来指定主键。

 

在定义字段的同时指定主键,语法格式如下:

 

<字段名> <数据类型> PRIMARY KEY [默认值]

例 1

在 test_db 数据库中创建 tb_emp3 数据表,其主键为 id,SQL 语句和运行结果如下。

 

mysql> CREATE TABLE tb_emp3

    -> (

    -> id INT(11) PRIMARY KEY,

    -> name VARCHAR(25),

    -> deptId INT(11),

    -> salary FLOAT

    -> );

Query OK, 0 rows affected (0.37 sec)

mysql> DESC tb_emp3;

+--------+------------------+------+------+---------+-------+

| Field  | Type              | Null | Key | Default | Extra |

+--------+------------------+------+------+---------+-------+

| id         | int(11)          | NO   | PRI | NULL    |       |

| name   | varchar(25) | YES  |       | NULL    |       |

| deptId | int(11)           | YES  |       | NULL    |       |

| salary | float              | YES  |        | NULL    |       |

+--------+-----------------+--------+------+----------+------+

4 rows in set (0.14 sec)

 

 

或者是在定义完所有字段之后指定主键,语法格式如下:

 

[CONSTRAINT <约束名>] PRIMARY KEY [字段名]

例 2

在 test_db 数据库中创建 tb_emp4  数据表,其主键为 id,SQL 语句和运行结果如下。

 

mysql> CREATE TABLE tb_emp4

    -> (

    -> id INT(11),

    -> name VARCHAR(25),

    -> deptId INT(11),

    -> salary FLOAT,

    -> PRIMARY KEY(id)

    -> );

Query OK, 0 rows affected (0.37 sec)

mysql> DESC tb_emp4;

+--------+------------------+------+------+----------+--------+

| Field  | Type               | Null | Key | Default | Extra |

+--------+------------------+------+------+----------+-------+

| id       | int(11)            | NO   | PRI  | NULL  |         |

| name | varchar(25)   | YES  |        | NULL   |         |

| deptId | int(11)          | YES  |         | NULL   |         |

| salary | float             | YES  |          | NULL   |        |

+--------+-----------------+--------+-------+----------+------+

4 rows in set (0.14 sec)

 

2)在创建表时设置联合主键

所谓的联合主键,就是这个主键是由一张表中多个字段组成的。

 

比如,设置学生选课数据表时,使用学生编号做主键还是用课程编号做主键呢?如果用学生编号做主键,那么一个学生就只能选择一门课程。如果用课程编号做主键,那么一门课程只能有一个学生来选。显然,这两种情况都是不符合实际情况的。

 

实际上设计学生选课表,要限定的是一个学生只能选择同一课程一次。因此,学生编号和课程编号可以放在一起共同作为主键,这也就是联合主键了。

 

主键由多个字段联合组成,语法格式如下:

 

PRIMARY KEY [字段1,字段2,…,字段n]

注意:当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。

例 3

创建数据表 tb_emp5,假设表中没有主键 id,为了唯一确定一个员工,可以把 name、deptId 联合起来作为主键,SQL 语句和运行结果如下。

 

mysql> CREATE TABLE tb_emp5

    -> (

    -> name VARCHAR(25),

    -> deptId INT(11),

    -> salary FLOAT,

    -> PRIMARY KEY(name,deptId)

    -> );

Query OK, 0 rows affected (0.37 sec)

mysql> DESC tb_emp5;

+--------+------------------+------+-----+---------+-------+

| Field  | Type              | Null | Key | Default | Extra |

+--------+------------------+------+-----+---------+-------+

| name   | varchar(25) | NO   | PRI | NULL |         |

| deptId  | int(11)          | NO   | PRI | NULL |         |

| salary  | float              | YES |        | NULL |         |

+--------+------------------+-------+------+--------+-------+

3 rows in set (0.14 sec)

 

在修改表时添加主键约束

主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。但是需要注意的是,设置成主键约束的字段中不允许有空值。

 

在修改数据表时添加主键约束的语法格式如下:

 

ALTER TABLE <数据表名> ADD PRIMARY KEY(<字段名>);

查看 tb_emp2 数据表的表结构,SQL 语句和运行结果如下所示。

 

mysql> DESC tb_emp2;

+--------+-----------------+------+-------+---------+-------+

| Field  | Type             | Null | Key | Default | Extra |

+--------+-----------------+------+-------+---------+-------+

| id        | int(11)          | NO   |         | NULL   |         |

| name  | varchar(30) | YES  |         | NULL   |         |

| deptId | int(11)          | YES  |         | NULL  |         |

| salary | float             | YES  |         | NULL   |         |

+--------+-----------------+-------+-------+----------+------+

4 rows in set (0.14 sec)

 

例 4

修改数据表 tb_emp2,将字段 id 设置为主键,SQL 语句和运行结果如下。

 

mysql> ALTER TABLE tb_emp2

    -> ADD PRIMARY KEY(id);

Query OK, 0 rows affected (0.94 sec)

Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC tb_emp2;

+--------+-----------------+------+-----+---------+-------+

| Field  | Type             | Null  | Key| Default | Extra |

+--------+-----------------+------+-----+---------+-------+

| id       | int(11)           | NO  | PRI | NULL    |       |

| name | varchar(30)  | YES |        | NULL    |       |

| deptId | int(11)         | YES  |        | NULL    |       |

| salary | float            | YES  |        | NULL    |       |

+--------+----------------+-------+------+-----------+------+

4 rows in set (0.12 sec)

 

通常情况下,当在修改表时要设置表中某个字段的主键约束时,要确保设置成主键约束的字段中值不能够有重复的,并且要保证是非空的。否则,无法设置主键约束。

删除主键约束

当一个表中不需要主键约束时,就需要从表中将其删除。删除主键约束的方法要比创建主键约束容易的多。

 

删除主键约束的语法格式如下所示:

 

ALTER TABLE <数据表名> DROP PRIMARY KEY;

例 5

删除 tb_emp2 表中的主键约束,SQL 语句和运行结果如下。

 

mysql> ALTER TABLE tb_emp2

    -> DROP PRIMARY KEY;

Query OK, 0 rows affected (0.94 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

由于主键约束在一个表中只能有一个,因此不需要指定主键名就可以删除一个表中的主键约束。

二、 外键

  1. 基本概念

 

1) MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。

 

2) 外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接。

 

3) 如果需要更好的性能,并且不需要完整性检查,可以选择使用MyISAM表类型,如果想要在MySQL中根据参照完整性来建立表并且希望在此基础上保持良好的性能,最好选择表结构为innoDB类型。

 

4) 外键的使用条件

 

① 两个表必须是InnoDB表,MyISAM表暂时不支持外键

 

② 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;

 

③ 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

 

5) 外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作。

 

  1. 使用方法

 

创建外键的语法:

 

外键的定义语法:

 

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)

 

REFERENCES tbl_name (index_col_name, ...)

 

[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

 

[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

 

该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。

 

ON DELETE、ON UPDATE表示事件触发限制,可设参数:

 

① RESTRICT(限制外表中的外键改动,默认值)

 

② CASCADE(跟随外键改动)

 

③ SET NULL(设空值)

 

④ SET DEFAULT(设默认值)

 

⑤ NO ACTION(无动作,默认的)

示例

1)创建表1

create table repo_table(

repo_id char(13) not null primary key,

repo_name char(14) not null)

type=innodb;

创建表2

mysql> create table busi_table(

-> busi_id char(13) not null primary key,

-> busi_name char(13) not null,

-> repo_id char(13) not null,

-> foreign key(repo_id) references repo_table(repo_id))

-> type=innodb;

2)插入数据

insert into repo_table values("12","sz"); //success

insert into repo_table values("13","cd"); //success

insert into busi_table values("1003","cd", "13"); //success

insert into busi_table values("1002","sz", "12"); //success

insert into busi_table values("1001","gx", "11"); //failed,提示:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`smb_man`.`busi_table`, CONSTRAINT `busi_table_ibfk_1` FOREIGN KEY (`repo_id`) REFERENCES `repo_table` (`repo_id`))

3)增加级联操作

mysql> alter table busi_table

-> add constraint id_check

-> foreign key(repo_id)

-> references repo_table(repo_id)

-> on delete cascade

-> on update cascade;

ENGINE=InnoDB DEFAULT CHARSET=gb2312; //另一种方法,可以替换type=innodb;

 

3、相关操作

外键约束(表2)对父表(表1)的含义:

在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update/on delete子句。

CASCADE

删除包含与已删除键值有参照关系的所有记录

SET NULL

修改包含与已删除键值有参照关系的所有记录,使用NULL值替换(只能用于已标记为NOT NULL的字段)

RESTRICT

拒绝删除要求,直到使用删除键值的辅助表被手工删除,并且没有参照时(这是默认设置,也是最安全的设置)

NO ACTION

啥也不做

 

三、 自动增长列

语法:

auto_increment unique;

或者

auto_increment primary key;

特点:默认起始值为1,步长为1;

案例:

create table user(userID int not null auto_increment unique, username varcar(20) not null primary key, password varchar(20) not null);

 

标签:name,数据库,id,数据表,MySQL,NULL,主键,select
来源: https://www.cnblogs.com/qhy8686/p/15331656.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有