MySql与数据库的简单介绍
1. 什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,简而言之就是存储数据的仓库。
2. 数据库的分类:
常见的有层次式数据库、网络式数据库、关系型数据库。其中关系型数据库占据着市场的主流。其中关系型数据库是建立在关系模型基础上的数据库。
3.常见的关系型数据库:
SqlServer
Oracle
MySql
DB2
...
4.MySql介绍
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL是一种关联数据库管理系统,MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL的特点是体积小、速度快、总体拥有成本低,并且开源。
mysql下载地址:https://www.mysql.com/downloads/mysql
注意:安装的路径中不要有中文和空格默认的端口3306不要修改, 保持默认即可
5.MySQL安装目录
MySQL的安装目录下:
bin目录中都是可执行文件;
my.ini文件是MySQL的配置文件;
6.MySQL相关命令
- 登录mysql客户端命令:mysql -uroot -p123 -h localhost;
-u:后面的root是用户名,这里使用的是超级管理员root;
-p:后面的123是密码,这是在安装MySQL时就已经指定的密码;
-h:后面给出的localhost是服务器主机名,它是可以省略的,例如:mysql -u root -p 123; - 退出客户端命令:quit或exit;
扩展: 通过命令启动、停止、删除服务(mysql5.5)
启动:net start 服务名称
关闭:net stop 服务名称
删除:sc delete 服务名称
(如果服务名中间有空格,就需要前后加引号) - 若出现这种提示,主要原因是:没有配置mysql的bin目录到path环境变量中!!!!
7.MySql常见的概念
数据库服务器: 安装的mysql软件就是mysql服务器。
数据库: 是数据库表的集合,数据库服务器中可以创建多个数据库。
表: 类似于一个excel表格,用于存储数据。
表记录: 即表中的一行数据。
8.SQL语言
SQL是操作关系型数据库通用的语言
SQL是非过程语言
SQL是一个标准,各大数据库厂商都根据该标准提供了实现。
数据库厂商为了增强数据库的功能,添加了一些非标准的SQL,称之为数据库的“方言”。
9.利用sql语句来操作数据库 (!掌握)
1.创建数据库
语法:CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]
2.查看数据库
语法:显示所有数据库:
SHOW DATABASES
显示数据库创建语句:
SHOW CREATE DATABASE db_name
3.修改数据库
语法:ALTER DATABASE [IF NOT EXISTS] db_name [alter_specification [, alter_specification] ...]
4.删除数据库
语法:DROP DATABASE [IF EXISTS] db_name
5.选择数据库
语法:选择数据库:use db_name;
10.利用sql语句来操作数据库表 (!掌握)
1. MySQL中常见的数据类型
(1)字符串
a)char(n) 定长字符串 stuid char(10)
b)varchar(n) 不定长字符串 username varchar(10) 255 65535(5.0以后)
(2)数值类型
TINYINT:占用1个字节,相对于java中的byte
SMALLINT:占用2个字节,相对于java中的short
INT:占用4个字节,相对于java中的int
BIGINT:占用8个字节,相对于java中的long
FLOAT:4字节单精度浮点类型,相对于java中的float
DOUBLE:8字节双精度浮点类型,相对于java中的double
(3)大数据类型
BLOB:大二进制类型,可以存入二进制类型的数据,通过这个字段,可以将图片、音频、视频等数据以
二进制的形式存入数据库。最大为4GB。
TEXT:大文本,被声明为这种类型的字段,可以保存大量的字符数据,最大为4GB。
注意:text属于mysql的方言,在其他数据库中为clob类型
(4)日期类型
DATE:日期 2015-11-05
TIME:时间 格式 'HH:MM:SS' 19:19:19
DATETIME:日期时间 2015-11-05 19:19:19 年份范围:1000~9999
TIMESTAMP:时间戳 2015-11-05 19:19:19 年份范围:1970~2038
- DATETIME和TIMESTAMP的区别?
* DATETIME和TIMESTAMP显示的结果是一样的,都是固定的"YYYY-MM-DD HH:MM:SS"的格式
* DATETIME支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。TIMESTAMP的范围
* 是'1970-01-01 00:00:00'到2037年,且其实际的存储值为1970年到当前时间的毫秒数。
* 在建表时,列为TIMESTAMP的日期类型可以设置一个默认值,而DATETIME不行。
* 在更新表时,可以设置TIMESTAMP类型的列自动更新时间为当前时间。
(5)逻辑型 : bit 0/1
2. 字段的约束 (!!重要)
主键约束:primary key 值必须唯一且不能为空 auto_increment 自动增长
唯一约束:unique 值必须唯一
非空约束:not null 值不能为空
外键约束:(放到后面单讲)
3. 新增表
语法:CREATE TABLE table_name
(
field1 datatype,
field2 datatype,
field3 datatype
)[character set 字符集] [collate 校对规则]
field:指定列名 datatype:指定列类型
例如:~创建employee表
create table employee(
id int,
name varchar(20),
gender bit,
birthday date,
entry_date date,
job varchar(20),
salary double,
resume text
);
----------------------------
注意:创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型。
创建表时,一般不需要指定字符集编码和校对规则,和数据库保持一致即可。
4. 查看表
语法:查看表结构:
desc tabName
查看当前所有表:
show tables
查看当前数据库表建表语句
show create table tabName;
5. 修改表
语法:增加列:
ALTER TABLE tabname ADD (column datatype [DEFAULT expr][, column datatype]...);
修改列:
ALTER TABLE tabname MODIFY (column datatype [DEFAULT expr][, column datatype]...);
删除列:
ALTER TABLE tabname DROP (column);
修改表名:
ALTER TABLE old_tabname RENAME TO new_tabname;
或
RENAME TABLE old_tabname TO new_tabname;
修改列名称:
ALTER TABLE tabname CHANGE [column] old_col_name new_col_name datatype
修改列的顺序:
ALTER TABLE tabname MODIFY col_name1 datatype AFTER col_name2;
修改表的字符集:
ALTER TABLE tabname CHARACTER SET character_name;
6. 删除表
语法:DROP TABLE tabname;
11.利用sql语句来操作数据库表记录
1.INSERT (!重要)
语法:
INSERT INTO tabname [(column [, column...])] VALUES (value [, value...]);
注意:
插入的数据应与字段的数据类型相同
数据的大小应在列的规定范围内
在values中列出的数据位置必须与被加入的列的排列位置相对应
字符串和日期格式的数据要用单引号引起来
如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表
- 乱码问题:
**乱码问题:客户端发送的数据是GBK的,而服务器使用的utf-8的编码来处理客户端发来的数据,两端使用的编码不一致导致乱码。
**解决方法1:在客户端可以通过 set names xxx; 通知服务器使用指定码表来处理客户端发送的数据。这种方式只对当前cmd命令窗口有效,每次新开的窗口都要设置一次。
**解决方式2:可以通过修改MySQL安装目录下的my.ini文件中的配置,来指定服务器端使用的码表。这种方式一劳永逸。
2.UPDATE (!重要)
语法:UPDATE tab_name SET col_name1=expr1 [, col_name2=expr2 …] [WHERE where_definition]
UPDATE语法可以用新值更新原有表行中的各列。
SET子句指示要修改哪些列和要给予哪些值。
WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。
3.DELETE (!重要)
语法:
delete from tab_name [WHERE where_definition]
where用来筛选要删除的记录,如果不使用where子句,将删除表中所有数据。
delete语句不能删除某一列的值(可使用update)
delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。
TRUNCATE TABLE tab_name语句也可以删除表中数据,它和delete有所不同。
delete是一条条删除记录,truncate是摧毁整表再重建相同结构的表,truncate效率更高。
4.SELECT (!!!重要)
(1)基本的查询
语法:
SELECT [DISTINCT] *|{column1, column2. column3..} FROM table_name;
select 指定查询哪些列的数据。
column指定列名。
*号代表查询所有列。
from指定查询哪张表。
DISTINCT可选,指显示结果时,是否剔除重复数据
(2)使用where子句的查询
语法:
Select *|列名 from tablename [WHERE where_definition]
(3)排序查询
语法:
SELECT column1, column2. column3.. FROM table order by column asc|desc;
Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的列名。
Asc 升序、Desc 降序
ORDER BY 子句应位于SELECT语句的结尾。
(4)聚合函数
语法:
求符合条件的记录中指定列的记录数
select count(列名)… from tablename [WHERE where_definition]
求符合条件的记录中指定列的和值
Select sum(列名)… from tablename [WHERE where_definition]
求符合条件的记录中指定列的平均值
Select avg (列名)… from tablename [WHERE where_definition]
求符合条件的记录中指定列的最大值
Select max(列名)… from tablename [WHERE where_definition]
求符合条件的记录中指定列的最小值
~求班级总分最高分和最低分
select max(ifnull(chinese, 0)+ifnull(math, 0)+ifnull(english, 0)) from exam;
select min(ifnull(chinese, 0)+ifnull(math, 0)+ifnull(english, 0)) from exam;
**(5)分组查询**
语法:
SELECT column1, column2. column3.. FROM table group by column having ...
~查询单价小于100而总价大于100的商品的名称.
select * from orders where price <100 group by product having sum(price)>100;
- **where子句和having子句都可以进行过滤, 但是使用场景有所不同:
* where子句对分组之前的数据进行过滤,不能使用聚合函数
* having子句对分组之后的数据进行过滤,可以使用聚合函数
* 使用where子句的地方都可以用having替代,但是使用having的地方一般不能用 where替代
12.数据库的备份与恢复 (!掌握)
(1)备份数据库, 在cmd窗口中:
mysqldump -uroot -p(此处一定要加空格)db_name > d:/1.sql(备份路径,后缀要以.sql结尾)
例如:mysqldump -uroot -p mydb3 > d:/1.sql
(2)恢复数据到数据库
方式一: 在cmd窗口中:
mysql -uroot -p db_name < d:/1.sql
例如:
mysql -uroot -p mydb3 < d:/1.sql
方式二: 在mysql客户端中
source d:/1.sql
13.外键约束(!!重要)
外键: 用来通知数据库表与表字段之间的对应关系, 并让数据库帮我们维护这样关系的键就叫做外键
外键作用: 维护数据的完整性 一致性
添加外键: foreign key
14.多表设计 (!!重要)
1-*:在多的一方添加列保存一的一方的主键来作为外键保存两张表之间的关系
1-1:在任意一方添加列保存另一方的主键作为外键来保存两张表之间的关系
*-*:在一张第三方的表中分别保存两张表的主键作为外键来保存两张表之间的关系,可以把多对多的关系拆分成两个一对多的关系来理解
15.多表查询(!!重要)
笛卡尔积查询: 两张表相乘得出来的结果。如果左边表有m条记录,右边有n条记录,则查询出来的结果就是m*n条。这些查询结果中包含大量错误的结果,通常不会使用这种查询。
内连接查询:左边表有且右边表也有的记录。
select * from dept,emp where emp.dept_id=dept.id;
select * from dept inner join emp on emp.dept_id=dept.id;
左外连接查询:在内连接查询的基础上,加上左边表有而右边表没有的记录
select * from dept left join emp on emp.dept_id=dept.id;
右外连接查询:在内连接查询的基础上,加上右边表有而左边表没有的记录。
select * from dept right join emp on emp.dept_id=dept.id;
全外连接查询:在内连接查询的基础上,加上左边表有而右边表没有的记录 和 右边表有而左边表没有的记录。
select * from dept full join emp on emp.dept_id=dept.id;#mysql不支持
select * from dept left join emp on emp.dept_id=dept.id
union
select * from dept right join emp on emp.dept_id=dept.id;