目录
1.SQL语句基础
1.1 SQL简介
1.2 SQL语句分类
1.3 SQL语句的书写规范
2、数据库基本操作
2.1 创建数据库
语法:
案例:
扩展:
MySQL自带数据库:
2.2 字符集和校对规则
# 查看支持的字符集
# 查看支持的校对规则
# 查看默认的字符集和校对规则
2.3 修改数据库
语法:
案例:
2.4 删除数据库
语法:
案例:
3.数据表基本操作
3.1 创建表
语法:
案例一:
案例二:
4. 数据类型:
4.1数值型:
4.2字符型:
4.3时间和日期:
4.4 其他类型:
4.5 常用的数据类型:
SQL:结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作、数据检索以及 数据维护的标准语言。使用SQL语句,程序员和数据库管理员可以完成如下的任务
改变数据库的结构
更改系统的安全设置
增加用户对数据库或表的许可权限
在数据库中检索需要的信息
对数据库的信息进行更新
MySQL致力于支持全套ANSI/ISO SQL标准。在MySQL数据库中,SQL语句主要可以划分为以下几类
DDL(Data Definition Language):数据定义语言,定义对数据库对象(库、表、列、索引)的操作。 CREATE、DROP、ALTER、RENAME、 TRUNCATE等
DML(Data Manipulation Language): 数据操作语言,定义对数据库记录的操作。 INSERT、DELETE、UPDATE、SELECT等
DCL(Data Control Language): 数据控制语言,定义对数据库、表、字段、用户的访问权限和安全 级别。
GRANT、REVOKE等
Transaction Control:事务控制
COMMIT、ROLLBACK、SAVEPOINT等
在数据库系统中,SQL语句不区分大小写(建议用大写) 。
但字符串常量区分大小写。
SQL语句可单行或多行书写,以“;”结尾。
关键词不能跨多行或简写。
用空格和缩进来提高语句的可读性。
子句通常位于独立行,便于编辑,提高可读性。
SELECT * FROM tb_table
注释:
SQL标准:
//。多行注释
“--” 单行注释
MySQL注释: “#”
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_option] ...
create_option: [DEFAULT] {
CHARACTER SET [=] charset_name
| COLLATE [=] collation_name
| ENCRYPTION [=] {'Y' | 'N'}
}
在window11的终端登陆数据库:
C:\Users\31922>mysql -uroot -p
Enter password: ******
查看此时所有的数据库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
6 rows in set (0.00 sec)
创建新的数据库TEATDATABASES并查看:
mysql> CREATE DATABASE TEATDATABASES;
Query OK, 1 row affected (0.01 sec)mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| teatdatabases |
| world |
+--------------------+使用数据库:
mysql> use teatdatabases;
退出此时所登陆的数据库,登陆新创建的数据库:
mysql> EXIT
C:\Users\31922>mysql -uroot -p teatdatabases
-u用户名 -p 默认使用的数据库
Enter password: ******
查看当前连接的数据库:
mysql> select database();
+---------------+
| database() |
+---------------+
| teatdatabases |
+---------------+
1 row in set (0.00 sec)mysql>
创建数据库表,指定编码
mysql> create database db_hj default charset=utf8mb4; 创建数据库表,指定编码
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| db_hj |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
查看当前连接的数据库
mysql> select database();
+---------------+
| database() |
+---------------+
| teatdatabases |
+---------------+
1 row in set (0.00 sec)mysql> show databases like "db_%";模糊查询
+-----------------+
| Database (db_%) |
+-----------------+
| db_hj |
+-----------------+
1 row in set (0.00 sec)查看数据库版本
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.35 |
+-----------+
1 row in set (0.00 sec)查看当前用户
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)查看所有用户:
SELECT User,Host,Password FROM mysql.user;
若此时在Linux中使用MySQL,则可以用system<命令>来查看调用linux中命令:
执行对应系统命令:
SYSTEM <命令>
system cls # 在 win中清屏
system date 等
远程连接MYSQL:
C:\Users\31922>mysql -uroot -p123456 -h192.168.17.133 -P3306 #远程连接MYSQL
用户 mysql密码 ip地址 端口
开启MySQL远程连接:
网络保证通畅
MySQL也默认没有开启远程登录(安全性)
MySQL的远程登录,是用户的权限,默认都是关闭的! !核心:修改系统用户表中的host字段,将该字段修改为 xxx%
Information_schema: 主要存储了系统中的一些数据库对象信息:如用户表信息、列信息、权限信 息、字符集信息、分区信息等。(数据字典表)
performance_schema: 主要存储数据库服务器的性能参数
mysql: 存储了系统的用户权限信息及帮助信息。
sys: 5.7新增,之前版本需要手工导入。这个库是通过视图的形式把information_schema 和 performance_schema结合起来,查询出更加令人容易理解的数据
test: 系统自动创建的测试数据库,任何用户都可以使用。
字符集是指一系列符号以及符号对应的编码的集合,比如英文字母可以使用 ASCII 编码,中文可以使用 GBK 或者 UTF-8 编码,校对规则则是指一种比较字符的规则,在排序或者比较字符的时候使用。
每个字符集都会对应多个校对规则,是一对多的关系,而且每个字符集会有默认的校对规则,当我们在 创建数据库或者表时,如果只指定字符集,则使用字符集对应的默认校对规则。
cs 大小写敏感
ci 大小写不敏感
bin 二进制编码比较
mysql> show character set;
解析:
Charset 字符集名称
Description 字符集描述
Default collation 默认校对规则
Maxlen 最大长度
mysql> show collation;
解析:
Collation 校对规则名称
Charset 哪个字符集
Id 校对规则编号
Default 是否为默认校对规则
Compiled 是否系统自带
Sortlen 这与对字符集中表示的字符串进行排序所需的内存量有关。
Pad_attribute 末尾空格是否参与比较
参考:
1、非二进制字符串( CHAR 、 VARCHAR 、 TEXT )比较时,末尾空格的处理跟列的字符序有直接关系
2、 MySQL5.7 及之前的版本,排序规则的类型都是 PAD SPACE ,会忽略字符串末尾的空格, LIKE 除外
3、 MySQL8 开始,字符序增加了一个参数 Pad_attribute ,该参数的值不同,对字符串末尾空格的处理 方式不同 NO PAD :字符串末尾的空格会和其他字符一样,不会被忽略 PAD SPACE :字符串末尾的空格会被忽略, LIKE 除外
4、如上针对的都是非二进制字符串的排序和比较,而不是储存
mysql> show create database teatdatabases;
(create database teatdatabases;) # 创建数据库的命令
utf8和utf8mb4的区别
MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的 unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。
既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字 符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符,如表情等 等(utf8的缺点)。
因此在8.0之后,建议大家使用utf8mb4这种编码。
ALTER {DATABASE | SCHEMA} [db_name] alter_option ... alter_option: { [DEFAULT] CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name | [DEFAULT] ENCRYPTION [=] {'Y' | 'N'} | READ ONLY [=] {DEFAULT | 0 | 1} }
mysql> select database();
+---------------+ | database() | +---------------+ | teatdatabases | +---------------+ 1 row in set (0.00 sec)
mysql> show create database teatdatabases;
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------+ | Database | Create Database | +---------------+-----------------------------------------------------------------------------------------------------------------------------------------+ | teatdatabases | CREATE DATABASE `teatdatabases` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ | +---------------+-----------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
mysql> alter database teatdatabases read only = 1; # read only=1 只读
Query OK, 1 row affected (0.01 sec)
mysql> show create database teatdatabases;
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Database | Create Database | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | teatdatabases | CREATE DATABASE `teatdatabases` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ /* READ ONLY = 1 */ | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
mysql> drop table td_emp1; # 此时我们删除表td_emp1时,会提示(此时是只读模式)
ERROR 3989 (HY000): Schema 'teatdatabases' is in read only mode.
mysql> alter database teatdatabases read only = 0;
Query OK, 1 row affected (0.01 sec)
mysql> drop table tb_emp1;
Query OK,0 rows affected (0.01 sec)
mysql> show tables; #,用于显示当前数据库中的所有表格(也称为表)
Empty set (0.02 sec)
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
mysql> drop database testdatabase; # 删除数据库 testdatabase
MySQL之所以成为主流:因为表与对象起相互促进的作用。
create table [if not exists] table_name (
字段1 类型 【约束条件】, # 有多个数据的话加中间“,”
字段2 类型 【约束条件】,
。。。。
字段n 类型 【约束条件】 # 最后一个数据不加“,”
);
mysql> create table t_user (id int ,name varchar(255), age int ); # 创建表
mysql> desc t_user; # 显示表结构 varchar(255)字符串(255长度)
+-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | varchar(255) | YES | | NULL | | | age | int | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 3 rows in set (0.01 sec)
mysql> show columns from t_user; # 显示表结构
+-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | varchar(255) | YES | | NULL | | | age | int | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 3 rows in set (0.01 sec)
mysql> describe t_user; # 显示表结构
+-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | varchar(255) | YES | | NULL | | | age | int | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
mysql> insert into t_user values(1, "sjt",16); # 添加元素
Query OK, 1 row affected (0.01 sec)
mysql> select * from t_user; # 查看表
+------+------+------+ | id | name | age | +------+------+------+ | 1 | sjt | 16 | +------+------+------+ 1 row in set (0.00 sec)
创建如下要求的表 tb_emp1
mysql> create database db_test;
Query OK, 1 row affected (0.00 sec)mysql> use db_test;
Database changed
mysql> select database();+------------+ | database() | +------------+ | db_test | +------------+ 1 row in set (0.00 sec)
mysql> create table tb_emp1
-> (id int(11),
-> name varchar(25),
-> deprid int(11),
-> salary float);
Query OK, 0 rows affected, 2 warnings (0.02 sec)mysql> select * from tb_emp1;
Empty set (0.00 sec)mysql> desc tb_emp1;
+--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | varchar(25) | YES | | NULL | | | deprid | int | YES | | NULL | | | salary | float | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
mysql> show create table tb_emp1\G;
*************************** 1. row *************************** Table: tb_emp1 Create Table: CREATE TABLE `tb_emp1` ( `id` int DEFAULT NULL, `name` varchar(25) DEFAULT NULL, `deprid` int DEFAULT NULL, `salary` float DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec) ERROR: No query specified
TINYINT,SMALLINT,int,BIGINT,float,double,DECIMAL(len,精确位);
注意: 这些整数类型拥有额外的选项 UNSIGNED,通常,整数可以是负数或正数。如果添加 UNSIGNED压性 那么范围将从0开始,而不是某个负数。
char(len) 定长,
varchar(len) 不定长(节约空间)# oracle 字符串使用的varchar2,
text,
DATE(),TIME (),DATETIME(),TIMESTAMP()
binary,blob,Ienum(x,Y,z)