目录
SQL的基本概念
SQL指的是结构化查询语言(Structured Query Language),定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样(独特)的地方,称为“方言”。方言只能操作某一种数据库,方言就相当于与我们的家乡话,只能在某一块区域内使用,而我们学的SQL就像是普通话,是通用的,对每一种关系型数据库都合适
作用:客户端连接服务器后,客户端使用SQL语句来操作服务器
SQL的通用语法
1. SQL 语句可以单行或多行书写,以分号结尾。
2. 可使用空格和缩进来增强语句的可读性。
3. MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
4. 3 种注释
* 单行注释: -- 注释内容 或 # 注释内容(mysql 特有)
* 多行注释: /* 注释 */
(注意:单行注释中--后面要加上空格才能跟注释内容,这样才算是单行注释)
SQL语句分类
SQL语句分类:DDL,DML,DCL,DQL
1)DDL(Data Definition Language):
数据定义语言,是对数据库或表结构的操作,关键字:create, drop,alter 等
2)DML(Data Manipulation Language):
数据操纵语言,是对表记录的操作,更新,包括增,删,改三个操作关键字:insert, delete, update 等
3)DQL(Data Query Language):
数据查询语言,是对表记录的查询,关键字:select, where 等
4)DCL(Data Control Language):
数据控制语言,对用户的创建和授权(略),用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT(授权), REVOKE(回收权限) 等
DDL语句
数据库操作
查看所有数据库
show databases;
可以看出默认MySQL服务器上有四个数据库,分别是information_schema、mysql、performance_schema、test,
数据库information_schema,提供了访问数据库元数据的方式。 元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等
数据库mysql,这个是MySQL的核心数据库,里面记录数据库用户、权限、关键字等核心的管理信息。
数据库performance_schema主要用于收集数据库服务器性能参数
数据test,是安装时候创建的一个测试数据库,是一个完全的空数据库,没有任何表,可以删除
创建数据库
1.最基础的创建数据库语句
create database 数据库名称;
例子:create database db1;
2.指定字符集和判断是否存在和设定校对规则
create database [if not exists] 数据库名称 [character set 字符集][collate 校对规则];
上面语句的if not exists和character set字符集和collate 校对规则是可写可不写的意思,所以加上大括号
实际运用:
* 创建db1数据库,判断如果不存在,再创建:
* create database if not exists 数据库名称;
* 创建db2数据库,并指定字符集
* create database 数据库名称 character set 字符集名;
例子:create database db2 character set utf8 ;
* 创建db3数据库,判断是否存在,并指定字符集为gbk
* create database if not exists db3 character set gbk;
* 创建db4数据库,判断是否存在,并指定字符集为utf8,且指定校对规则
其实每种字符集就不同的校验规则与之对应,使用不同的校验规则,在我们对后面进行数据库语句检索的时候产生的效果是很不一样的,比如说utf8对应的三种校对规则utf8_general_ci、utf8_general_cs和utf8_bin
utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。
utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果
utf8_bin:字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容
所以当你执行SELECT * FROM table WHERE txt = 'a'这条语句时,如果你指定的是utf8_general_cs或者utf8_bin这个校对规则,你就找不到 txt = 'A' 的数据库表记录,如果你指定的是utf8_general_ci 则可以
这里要注意:(表创建时没有指定字符集,则会默认使用数据库的字符集,数据库的字符集没有指定,则会默认使用数据库服务器的字符集)
查看创建数据库定义语句
show create database 数据库名称;
修改数据库
修改数据库字符集
alter database 数据库的名字 character set 字符集;
例子:alter database db1 character set gbk;
将db1数据库字符集从原来的utf8变为gbk
删除数据库
drop database [IF EXISTS] 数据库名称;
例子:drop database IF EXISTS db1;
如果存在数据库db1,则删除,不存在就不会执行删除操作,防止不存在数据库db1时删除报错
使用数据库
use 数据库名称;
查询当前正在使用的数据库
select database();
数据库表的操作
查看所有表
show tables;
查询数据库所有的表名称
mysql数据库里有24张表
查看表结构
desc 表名;
查看表的创建语句
show create table 表名;
创建表
格式如下:
create table 表名(
列名1 数据类型1,
列名2 数据类型2,
....
列名n 数据类型n
);注意:最后一列,不需要加逗号(,)
列的数据类型说明
总体来说mysql数据库包含数值型、字符串类型、日期和时间类型这么几大类
数值型:
数值类型中又细分为整数类型、浮点数类型、定点数类型和位类型
分别是tinyint、smallint、mediumint、int和bigint
整数类型 占用字节 范围 TINYINT 1 有符号:[-128,127] 或无符号:[0,255] SMALLINT 2 有符号:[-32768,32767]或无符号:[0,65535] MEDIUMINT 3 有符号:[-8333608,8388607]或无符号:[0,1677215] INT、INTEGER 4 有符号:[-21亿多,21亿多]或无符号:[0,42亿多] BIGINT 8 很大,19位数字的范围 所有整数类型都有一个可选的属性unsigned(无符号),此时上限取值是原来的2倍
还有一个属性是auto_increment(自增),该属性只能用于整数类型
浮点数类型
浮点数类型 字节 范围 FLOAT 4 [1.175494351E-38,3.402823466E+38] DOUBLE 8 [2.2…E-308,1.7…E+308]
定点数类型 字节 范围 DECIMAL(M,D) M+2 最大取值范围与DOUBLE相同,有效范围由M,D决定
位类型 字节 范围 BIT(M) 1-8 最小值BIT(1),最大值BIT(64) 浮点数和定点数都可以用(M,D)的方式来进行表示。
(M,D)表示该值一共显示M位数字(整数位+小数位),其中有D位小数。例如:score double(5,2):代表有五位数,其中两位是小数,所以说最大值就是999.99
- M:精度
- D:标度
- 注意在一些表述货币等精确数字的场景必须使用DECIMAL类型。
BIT类型用来存放多为二进制数,数据在插入BIT类型字段时,首先会转换成二进制数。因此,直接使用SELECT命令将不会看到结果。可以用bin()或hex()函数进行读取。字符串类型
MySQL中提供了多种对字符数据的存储类型
字符串类型 描述 CHAR(M) M为0-255之间的整数 VARCHAR(M) M为0-65535之间的整数 TINYBLOB 允许0-255字节 BLOB 允许0-65535字节 MEDIUBLOB 允许0-167772150字节 LONGBLOB 允许0-4294967295字节 TINYTEXT 允许0-255字节 TEXT 允许0-65535字节 MEDIUMTEXT 允许0-167772150字节 LONGTEXT 允许0-4294967295字节 VARBINARY(M) 允许长度0-M个字节的边长字节字符串 BINARY(M) 允许0-M个字节的定长字节字符串 这里要注意一下char和varchar字符串类型的区别:
char指的是固定长度字符串,长度指的是字符的个数,如果存储数据的长度不足指定长度(指的是列类型后面括号里面自己设定 的长度,则以空格的形式补足到指定长度!适合身份证号码
varchar是可变长度字符串,指的是存储数据的长度如果不足指定长度,则不会补足到指定长度,适合用户名,密码等
例如:存储字符串“abc”,CHAR(5)占用了5个字节,而VARCHAR(5)占用3个字节。
日期时间类型
- 表示年月(yyyy-MM-dd)用DATE
- 表示年月日时分秒(yyyy-MM-dd HH:mm:SS),用DATETIME
- 表示时分秒(hh:mm:ss),用TIME
日期时间类型 字节 范围 DATE 4 1000-01-01到9999-12-31 DATETIME 8 1000-01-01 00:00:00到9999-12-31 23:59:59 TIMESTAMP 4 19700101080001到2038年某个时刻 TIME 3 -838:59:59到838:59:59 YEAR 1 1901到2155 这里要注意一下TIMESTAMP时间类型,如果将来不给这个字段赋值,或赋值是null,则默认是系统当前时间来自动赋值,这是它最大的特点
例子:创建一张student表
复制表操作
create table 表名 like 被复制的表名;
删除表
不用判断表是否存在语句:drop table 表名;
判断表是否存在语句:drop table if exists 表名 ;
修改表名
alter table 表名 rename to 新的表名;
或者
rename table 原表名 to 新表名;
修改表的字符集
alter table 表名 character set 字符集名称;
添加列
alter table 表名 add 列名 列类型;
如果是添加多列:
alter table 表名 add (
列名 列类型(长度),
列名2 列类型(长度),
...
);
修改列名称和类型
alter table 表名 change 列名 修改后的新列名 新数据类型;
修改列的类型
alter table 表名 modify 列名 新数据类型;
删除列
alter table 表名 drop 列名;