一、mysql数据库概述
说明:mysql最新的是8.0,我们基础阶段学的是5.7。
1、DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。
2、DB:数据库(Database)
3、SQL:结构化查询语言,(Structure Query Language),专门用来操作/访问数据库的通用语言。
4、MySQL:其中的一款关系型数据库管理系统。
关系:一对一,一对多,多对多
5、MySQL是一种开放源代码的关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。而2009年,SUN又被Oracle收购。目前 MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,使得很多互联网公司选择了MySQL作为网站数据库(Facebook, Twitter, YouTube,阿里的蚂蚁金服,去哪儿,魅族,百度外卖,腾讯)。
二、mysql的下载安装与卸载
三、启动和停止mysql服务
方式1:图形界面(此电脑->管理->服务->mysql->启动/停止此服务)
方式2:命令<注意:命令行要用管理员身份运行 >
net stop mysql服务名 net start mysql服务名
四、mysql服务的连接(注意:确认服务是开启的)
方式1:使用命令行客户端连接mysql服务
mysql -h主机IP地址 -P端口号 -u用户名 -p回车
Enter password:输入密码
如果是连接本机的mysql服务器,端口号是3306,那么“-hlocalhost -P3307”可以省略。
如果输入mysql命令报“不是内部或外部命令”,把mysql安装目录的bin目录配置到环境变量path中
例如: mysql -hlocalhost -P3307 -uroot -p回车
Enter password:123456
方式2:可以使用其他客户端(可视化工具)连接
五、mysql的使用
1、查看所有的数据库 show databases;
2、创建自己的数据库 create database 数据库名;
3、使用自己的数据库 use 数据库名;
说明:如果没有使用use语句,后面针对数据库的操作也没有加“数据名”的限定,那么会报“ERROR 1046 (3D000): No database selected”(没有选择数据库)
使用完use语句之后,如果接下来的SQL都是针对一个数据库操作的,那就不用重复use了,如果要针对另一个数据库操作,那么要重新use。
4、查看某个库的所有表格 show tables; #要求前面有use语句 show tables from 数据库名;
5、创建新的表格
说明:如果是最后一个字段,后面就用加逗号,因为逗号的作用是分割每个字段。
create table 表名称(
字段名 数据类型,
字段名 数据类型
);
#创建学生表 create table student( id int, name varchar(20) #说名字最长不超过20个字符 );
6、查看一个表的数据 select * from 数据库名称;
7、添加一条记录 insert into 表名称 values(值列表);
#添加两条记录到student表中 insert into student values(1,'张三'); insert into student values(2,'李四');
8、查看表的创建信息 show create table 表名称\G
#查看student表的详细创建信息 show create table student\G
#结果如下*************************** 1. row *************************** Table: student Create Table: CREATE TABLE `student` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.00 sec)
上面的结果显示student的表格的默认字符集是“latin1”不支持中文。
9、查看数据库的创建信息 show create database 数据库名\G
#查看atguigudb数据库的详细创建信息 show create database atguigudb\G
#结果如下 *************************** 1. row *************************** Database: atguigudb Create Database: CREATE DATABASE `atguigudb` /*!40100 DEFAULT CHARACTER SET latin1 */ 1 row in set (0.00 sec)
10、删除表格 drop table 表名称;
11、删除数据库 drop table 数据库名;
六、设置mysql的编码方式
修改配置文件
(1)注意:先停止服务
(2)找到配置文件
mysql5.7版本:在mysql的数据目录下,有一个my.ini文件
例如:D:\ProgramFiles\MySQL\MySQLServer5.7_Data下有一个my.ini文件
(3)修改my.ini,然后保存
注意:建议修改配置文件使用notepad++等高级文本编辑器,使用记事本等软件打开修改后可能会导致文件编码修改为“含BOM头”的编码,从而服务重启失败。
[mysql] no-beep default-character-set=UTF8 #默认字符集 [mysqld] port=3307 datadir=D:/ProgramFiles/MySQL/MySQLServer5.7_Data/Data character-set-server=UTF8 #服务器端字符集
(4)重启服务
7.1 数值类型:包括整数和小数
整数:tinyint,smallint,mediumint,int,bigint,bit(位)
小数:float,double,decimal,real,numeric
1、整数类型
说明:
int(M):没有指定(M),默认显示(11)。最多能存储和显示11位整数。
(M)这个M在字段的属性中指定了unsigned(无符号)和zerofill(零填充)的情况下才有意义。表示当整数值不够M位时,用0填充。如果整数值超过M位,就按照实际位数存储。
create table temp( num1 int(4) unsigned zerofill, num2 int(4) );
insert into temp values(1,1); insert into temp values(12345,12345);
mysql> select * from temp; +-------+-------+ | num1 | num2 | +-------+-------+ | 0001 | 1 | | 12345 | 12345 | +-------+-------+ 2 rows in set (0.00 sec)
create table temp( num bit );
insert into temp values(1101); //报错ERROR 1406 (22001): Data too long for column 'num' at row 1
bit类型,如果没有指定(M),默认是1位。这个1位,那么表示只能存1位的二进制值。这里(M)是表示二进制的位数。
create table temp( num bit(4) );
小数类型如果没有指定(M,D),就按照它实际能表示的范围和精度来检查。
小数类型如果指定(M,D),说明这个小数最多只能是M位,这个M位包括整数位+小数位,这个D表示小数点后最多是D位。整数部分最多M-D位。
create table temp( num1 double, num2 double(5,2) #整数部分最多3位,总的位数是5位,范围[-999.99, 999.99] );
insert into temp values(123456.789123, 123.789123); #成功
mysql> select * from temp; +---------------+--------+ | num1 | num2 | +---------------+--------+ | 123456.789123 | 123.79 | #发生小数点后有截断现象,并且会四舍五入 +---------------+--------+ 1 row in set (0.00 sec)
字符串类型:
(1)char和varchar
(2)tinytext,text,mediumtext,longtext
(3)binary, varbinary:存二进制字符串
(4)tinyblob,blob,mediumblob , longblob:以文本形式存二进制的数值,一般存储图片,视频等数据
char:不同于Java中的char,Java中的char是单字符类型,只能存储1个字符。
mysql中的char是字符串类型,可以存储1个或者多个字符。
如果char没有指定(M),默认只能存储1个字符,如果指定(M)可以存储M个字符。
create table temp( c1 char, c2 char(3) );
insert into temp values('男','女');#成功 insert into temp values('尚硅谷','尚硅谷');#失败ERROR 1406 (22001): Data too long for column 'c1' at row 1 insert into temp values('男','尚硅谷');#成功
create table temp( name varchar(3) #最多不超过3个字符 ); insert into temp values('尚硅谷'); insert into temp values('尚硅谷真好');#ERROR 1406 (22001): Data too long for column 'name' at row 1 insert into temp values('好'); drop table temp; create table temp( name varchar(65535) ); #ERROR 1074 (42000): Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead 因为当前的表是UTF8,一个汉字占3个字节
binary存储二进制字符串。
binary如果没有指定(M),默认是1个字节。
binary如果指定(M),不能超过M个字节。
create table temp( c1 binary, c2 binary(3) );
insert into temp values('a','a');#成功 insert into temp values('ab','ab');#失败 ERROR 1406 (22001): Data too long for column 'c1' at row 1 insert into temp values('尚','尚');#失败 ERROR 1406 (22001): Data too long for column 'c1' at row 1 insert into temp values('a','尚');#成功 insert into temp values('a','尚硅谷'); ERROR 1406 (22001): Data too long for column 'c2' at row 1
year:存储年份。
date:存储日期。
time:存储时间。
datetime:存储日期+时间
timestamp:存储日期+时间
datetime和timestamp的区别:
(1)范围不同
(2)底层存储方式不同,timestamp底层存储的是毫秒值,距离1970-1-1 0:0:0 0毫秒秒的毫秒值。
两个日期比较大小或日期计算时,timestamp更方便更快。
(3)timestamp会根据用户的时区不同,显示不同的结果。
create table temp( d1 datetime, d2 timestamp ); insert into temp values('2021-9-2 14:45:52','2021-9-2 14:45:52'); #修改当前的时区 set time_zone = '+9:00'; insert into temp values('202192144552','202192144552'); #ERROR 1292 (22007): Incorrect datetime value: '202192144552' for column 'd1' at row 1 insert into temp values('20210902144552','20210902144552'); ```mysql insert into temp values('2021&9&2 14%45%52','2021#9#2 14@45@52'); ```
year:
year可以指定4位数,也可以指定2位数。如果是2位数的话,那么[70,99]相当于19xx年,如果是[0, 69]相当于20xx年。这个0年,如果是以整数的0添加的话,那么是0000年,如果是以日期/字符串的'0'添加的话,是2000年。
create table temp( d year ); insert into temp values(2021); insert into temp values(85); insert into temp values(22); insert into temp values(69); insert into temp values(0); insert into temp values('0');
mysql> select * from temp; +------+| d | +------+ | 2021 | | 1985 | | 2022 | +------+ 3 rows in set (0.00 sec)
1、枚举类型:多个字符串中选一个
2、集合类型:多个字符串中选1个或多个
3、JSON类型(后面大家再学习)
演示枚举类型:
create table temp( gender enum('男','女'), hobby set('睡觉','打游戏','泡妞','写代码') );
insert into temp values('男','睡觉,打游戏'); #成功 insert into temp values('男,女','睡觉,打游戏'); #失败 #ERROR 1265 (01000): Data truncated for column 'gender' at row 1 insert into temp values('妖','睡觉,打游戏');#失败 ERROR 1265 (01000): Data truncated for column 'gender' at row 1 insert into temp values('男','睡觉,打游戏,吃饭'); ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
7.5 其他类型
空间类型
SQL:结构化查询语言,(Structure Query Language),专门用来操作/访问数据库的通用语言。
8.1、语法
(1)mysql的sql语法不区分大小写
A:数据库的表中的数据是否区分大小写。这个的话要看表格的字段的数据类型、编码方式以及校对规则。
ci(大小写不敏感),cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关,区分大小写)
B:sql中的关键字,比如:create,insert等,不区分大小写。但是大家习惯上把关键字都“大写”。
(2)命名时:尽量使用26个英文字母大小写,数字0-9,下划线,不要使用其他符号
(3)建议不要使用mysql的关键字等来作为表名、字段名、数据库名等,如果不小心使用,请在SQL语句中使用`(飘号)引起来
(4)数据库和表名、字段名等对象名中间不要包含空格
(5)同一个mysql软件中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名
mysql> show tables; +---------------------+ | Tables_in_atguigudb | +---------------------+ | student | | temp | +---------------------+ 2 rows in set (0.00 sec) mysql> create table temp(id int); ERROR 1050 (42S01): Table 'temp' already exists
(6)标点符号:
必须成对
必须英文状态下半角输入方式
字符串和日期类型的数据值使用单引号''
列的别名可以使用双引号"",给表名取别名不要使用双引号。取别名时as可以省略
如果列的别名没有包含空格,可以省略双引号,如果有空格双引号不能省略。
mysql> select * from student; +------+------+ | id | name | +------+------+ | 1 | 张三 | | 2 | 李四 | +------+------+ 2 rows in set (0.00 sec) mysql> select id "学号",name "姓名" from student; +------+------+ | 学号 | 姓名 | +------+------+ | 1 | 张三 | | 2 | 李四 | +------+------+ 2 rows in set (0.00 sec)
说明:列的别名有空格时,请加双引号,列的别名中没有空格,可以加也可以不加。
(7)SQL脚本中如何加注释
单行注释:#注释内容
单行注释:--空格注释内容 其中--后面的空格必须有
多行注释:/* 注释内容 */
8.2 SQL的分类
DDL语句:数据定义语句(Data Define Language),例如:create,alter,drop等
DML语句:数据操作语句,例如:增(insert),删(delete),改(update),查(select)
因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类,DQL(数据查询语言),DR(获取)L
DCL语句:数据控制语句,例如:grant,commit,rollback等
create table tt( id int, #编号 `name` varchar(20), -- 姓名 gender enum('男','女') /* 性别只能从男或女中选择一个, 不能两个都选,或者选择男和女之外的 */ );