SQL语句分类:
- DDL: Data Defination Language 数据定义语言
CREATE, DROP, ALTER
- DML: Data Manipulation Language 数据操纵语言
INSERT, DELETE, UPDATE 增 删 改
- DCL: Data Control Language 数据控制语言
GRANT, REVOKE, COMMIT, ROLLBACK
- DQL: Data Query Language 数据查询语言
SELECT
SQL语句构成
SQL语句构成:
Keyword组成clause
多条clause组成语句
示例:
- SELECT * SELECT子句
- FROM products FROM子句
- WHERE price>400 WHERE子句
- 说明:一组SQL语句,由三个子句构成, SELECT,FROM和WHERE是关键字
数据库操作
创建数据库:
- CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME';
- CHARACTER SET 'character set name'
- COLLATE 'collate name'
help creart database ##获取创建数据库的帮助
删除数据库
- DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';
查看支持所有字符集: SHOW CHARACTER SET;
- MariaDB [(none)]> show character set;
查看支持所有排序规则: SHOW COLLATION;
- MariaDB [(none)]> show collation;
获取命令使用帮助:
- mysql> HELP KEYWORD;
例子:create database db1;
MariaDB [(none)]> show create database db1; ##查看创建的db1书记库的默认字符集
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| db1 | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+----------------------------------------------------------------+
MariaDB [(none)]> creart database db2 character set=utf8mb4; ##添加数据库字符集
+----------+-----------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------+
| db2 | CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+-----------------------------------------------------------------+
表
表:二维关系 横行 、纵列
设计表:遵循规范
定义:字段,索引
字段:字段名,字段数据类型,修饰符
约束,索引:应该创建在经常用作查询条件的字段上
创建表
创建表: CREATE TABLE
(1) 直接创建
(2) 通过查询现存表创建;新表会被直接插入查询而来的数据
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)] [table_options]
[partition_options] select_statement
(3) 通过复制现存的表的表结构创建,但不复制数据
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) }
注意:
- Storage Engine是指表类型,也即在表创建时指明其使用的存储引擎,同一库中不同表可以使用不同的存储引擎
- 同一个库中表建议要使用同一种存储引擎类型
CREATE TABLE [IF NOT EXISTS] ‘tbl_name’ (col1 type1 修饰符, col2
type2 修饰符, ...)
字段信息
• col type1 字段名 类型
• PRIMARY KEY(col1,...)
• INDEX(col1, ...)
• UNIQUE KEY(col1, ...)
表选项:
• ENGINE [=] engine_name
SHOW ENGINES;查看支持的engine类型
• ROW_FORMAT [=]
{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
获取帮助: mysql> HELP CREATE TABLE;
获取帮助: mysql> HELP CREATE TABLE;
一、数据类型
- 数据长什么样?
- 数据需要多少空间来存放?
二、系统内置数据类型和用户定义数据类型
三、MySql支持多种列类型:
- 数值类型
- 日期/时间类型
- 字符串(字符)类型
https://dev.mysql.com/doc/refman/5.5/en/data-types.html
数据类型有哪些?
1、整型
- tinyint(m) 1个字节 范围(-128~127)
- smallint(m) 2个字节 范围(-32768~32767)
- mediumint(m) 3个字节 范围(-8388608~8388607)
- int(m) 4个字节 范围(-2147483648~2147483647)
- bigint(m) 8个字节 范围(+-9.22*10的18次方)
加了unsigned,则最大值翻倍,如: tinyint unsigned的取值范围为(0~255)int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,规定了MySQL的一些交互工具(例如MySQL命令行客户端)用来显示字符的个数。对于存储和计算来说, Int(1)和Int(20)是相同的
2、BOOL, BOOLEAN:布尔型, 是TINYINT(1)的同义词。 zero值被视为假,非zero值视为真
3、浮点型(float和double),近似值
- float(m,d) 单精度浮点型 8位精度(4字节) m总个数, d小数位
- double(m,d) 双精度浮点型16位精度(8字节) m总个数, d小数位
- 设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位
4、定点数
- 在数据库中存放的是精确值,存为十进制
- decimal(m,d) 参数m<65 是总个数, d<30且 d<m 是小数位
- MySQL5.0和更高版本将数字打包保存到一个二进制字符串中(每4个字节存9个数字)。例如, decimal(18,9)小数点两边将各存储9个数字,一共使用9个字节:小数点前的数字用4个字节,小数点后的数字用4个字节,小数点本身占1个字节
- 浮点类型在存储同样范围的值时,通常比decimal使用更少的空间。 float使用4个字节存储。 double占用8个字节
- 因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用decimal——例如存储财务数据。但在数据量比较大的时候,可以考虑使用bigint代替decimal
5、字符串(char,varchar,_text)
- char(n) 固定长度,最多255个字符
- varchar(n) 可变长度,最多65535个字符
- tinytext 可变长度,最多255个字符
- text 可变长度,最多65535个字符
- mediumtext 可变长度,最多2的24次方-1个字符
- longtext 可变长度,最多2的32次方-1个字符
- BINARY(M) 固定长度,可存二进制或字符,长度为0-M字节
- VARBINARY(M) 可变长度,可存二进制或字符,允许长度为0-M字节
- 内建类型: ENUM枚举, SET集合
char和varchar:
- • 1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格, varchar不限于此。
- • 2.char(n) 固定长度, char(4)不管是存入几个字符,都将占用4个字节, varchar是存入的实际字符数+1个字节(n< n>255),所以varchar(4),存入3个字符将
- 占用4个字节。
- • 3.char类型的字符串检索速度要比varchar类型的快
varchar和text:
- • 1.varchar可指定n, text不能指定,内部存储varchar是存入的实际字符数+1个字节(n< n>255), text是实际字符数+2个字节。
- • 2.text类型不能有默认值
- • 3.varchar可直接创建索引, text创建索引要指定前多少个字符。 varchar查询速度快于text
5.二进制数据: BLOB
- • BLOB和text存储方式不同, TEXT以文本方式存储,英文存储区分大小写,而Blob是以二进制方式存储,不分大小写
- • BLOB存储的数据只能整体读出
- • TEXT可以指定字符集, BLOB不用指定字符集
6.日期时间类型
- • date 日期 '2008-12-2'
- • time 时间 '12:25:36'
- • datetime 日期时间 '2008-12-2 22:06:44'
- • timestamp 自动存储记录修改时间 ##时间戳
- • YEAR(2), YEAR(4):年份
timestamp字段里的时间数据会随其他字段修改的时候自动刷新,这个数据类型的字段可以存放这条记录最后被修改的时间
修饰符
所有类型:
- • NULL 数据列可包含NULL值
- • NOT NULL 数据列不允许包含NULL值
- • DEFAULT 默认值
- • PRIMARY KEY 主键
- • UNIQUE KEY 唯一键
- • CHARACTER SET name 指定一个字符集
数值型
• AUTO_INCREMENT 自动递增,适用于整数类型
• UNSIGNED 无符号
(1) 直接创建
例子:
MariaDB [db1]> create table students ( ###创建表
id int unsigned auto_increment primary key,
name varchar(50) not null,
sex enum('f','m'),
age tinyint unsigned default 20 );
MariaDB [db1]> show create table students; ##查看创建表的信息
students | CREATE TABLE `students` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`sex` enum('f','m') DEFAULT NULL,
`age` tinyint(3) unsigned DEFAULT '20',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
MariaDB [db1]> desc students;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| sex | enum('f','m') | YES | | NULL | |
| age | tinyint(3) unsigned | YES | | 20 | |
+-------+---------------------+------+-----+---------+----------------+
复合主键
CREATE TABLE students2 (id int UNSIGNED NOT NULL ,name
VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));
(2) 通过查询现存表创建;新表会被直接插入查询而来的数据
MariaDB [hellodb]> show tables; 查看表列表
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| teachers |
| toc |
+-------------------+
MariaDB [hellodb]> select * from students; ##查看表内容
MariaDB [hellodb]> create table newstudents select * from students;
MariaDB [hellodb]> select * from newstudents; ##查看表内容
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
| 1 | Shi Zhongyu | 22 | M | 2 | 3 |
| 2 | Shi Potian | 22 | M | 1 | 7 |
| 3 | Xie Yanke | 53 | M | 2 | 16 |
| 4 | Ding Dian | 32 | M | 4 | 4 |
| 5 | Yu Yutong | 26 | M | 3 | 1 |
| 6 | Shi Qing | 46 | M | 5 | NULL |
| 7 | Xi Ren | 19 | F | 3 | NULL |
| 8 | Lin Daiyu | 17 | F | 7 | NULL |
| 9 | Ren Yingying | 20 | F | 6 | NULL |
| 10 | Yue Lingshan | 19 | F | 3 | NULL |
| 11 | Yuan Chengzhi | 23 | M | 6 | NULL |
MariaDB [db1]> create table newstudents select * from hellodb.students; ##跨数据库建表
(3) 通过复制现存的表的表结构创建,但不复制数据、
MariaDB [db1]> create table test like newstudents;
或者
MariaDB [db1]> create table test2 select * from hellodb.students where 1 = 0;
都可以实现只负责复制表结构不复制表内容的效果。