文章目录
- 一、安装
- 二、MySQL语法总结
- 三、MySQL命令
- 1.库database
- 2.数据表table
- (0)前提准备
- (1)show tables;
- (2)desc <表名>
- (3) create table <表名> (<列名> <列名类型>);
- (4)drop table <表名>
- (5)select <列名> from <表名>;
- (6) insert into <表名> (<列名>) values (<对应列名数值>);
- (5)update <表名> set <列名> = <新值> WHERE <列名> = <某值>
- (6)alter table <表名> drop <列名>
- (7)alter table <表名> add <列名> <类型>
- (8)alter table <表名> modify <列名> <新的类型>
- (9)alter table <表名> change <旧列名> <新列名> <新的类型>
- (10)alter table <表名> alter <列名> set default <值>
- (11)alter table <表名> alter <列名> drop default
- (11)alter table <旧表名> rename <新表名>
- (12)delete from <表名> where <谓词语句>
- 2.视图view
- 3.权限
- 三、数据类型
一、安装
安装分两种方式:推荐第一种
安装方式 | 环境变量和配置文件 |
---|---|
Installer.exe安装 | 自动配置,无需手动 |
ZIP安装 | 需要自己配置环境变量和配置文件 |
https://www.cnblogs.com/ayyl/p/5978418.html
二、MySQL语法总结
换行只要不加分号,就相当于接着上一行写。
和C语言的语法一样,语句的结尾要加上分号。
大小写不区分,如输入的库名bank和Bank其实都是同一个。
三、MySQL命令
1.库database
命令 | 作用 |
---|---|
create database <库名>; | 创建一个库 |
drop database <库名>; | 删除某个库 |
show databases; | 显示所有库 |
use <库名>; | 使用指定库 PS:使用该命令后所有Mysql命令都只针对该数据库。 |
(1)create database <库名>;
mysql> create database student;
Query OK, 1 row affected (0.01 sec)
(2)drop database <库名>;
mysql> drop database student;
Query OK, 0 rows affected (0.02 sec)
(3)show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
7 rows in set (0.00 sec)
(4)use database_name:
mysql> use world;
Database changed
2.数据表table
PS:使用该命令前需要使用 use 命令来选择要操作的数据库
命令 | 作用 |
---|---|
show tables | 显示指定数据库的所有表 (包括view视图 |
desc <表名> | 显示表的各列的属性 |
create table <表名> (<列名> <列名类型>); | 在某个表内创建内容 |
drop table <表名> | 删除某个表 |
select <列名> from <表名>; | 显示表的数据 |
insert into <表名> (<列名>) values (<对应列名数值>); | 输入表的数据 |
update <表名> set <列名> = <新值> WHERE <列名> = <某值> | 更新表中的数据 |
alter table <表名> drop <列名> | 删除表的某个属性 |
alter table <表名> add <列名> <类型> | 添加表的某个属性 |
alter table <表名> modify <列名> <新的类型> | 修改表中某个列的类型 |
alter table <表名> change <旧列名> <新列名> <新的类型> | 修改表中某个列的名字和类型 |
alter table <表名> alter <列名> set default <值> | 修改某个列的默认值 |
alter table <表名> alter <列名> drop default <值> | 删除某个列的默认值 |
delete from <表名> where <谓词语句> | 删除表中特定的行 |
(0)前提准备
mysql> create database student;
Query OK, 1 row affected (0.06 sec)
mysql> use student;
Database changed
(1)show tables;
不仅会列出table表,也会列出view视图。
mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| person |
+-------------------+
1 row in set (0.00 sec)
(2)desc <表名>
desc account;
(3) create table <表名> (<列名> <列名类型>);
mysql> create table person(
-> name char(10),
-> id decimal(4)
-> );
Query OK, 0 rows affected (0.07 sec)
(4)drop table <表名>
drop table account;
(5)select <列名> from <表名>;
前提:现在有一个表person
+------+------+
| name | id |
+------+------+
| Jack | NULL |
| Sam | 1 |
+------+------+
选择特定的列
select f1,f2,...,fN from <表名>;
mysql> select name from person;
+------+
| name |
+------+
| Jack |
| Sam |
+------+
2 rows in set (0.00 sec)
选择所有的列
select * from <表名>
mysql> select *from person;
+------+------+
| name | id |
+------+------+
| Jack | NULL |
| Sam | 1 |
+------+------+
2 rows in set (0.00 sec)
(6) insert into <表名> (<列名>) values (<对应列名数值>);
选择特定列插入:
insert into <表名> (f1, f2,...,fi) values (v1,v2,...,vi);
mysql> insert into person(name) values('Jack');
Query OK, 1 row affected (0.05 sec)
mysql> select * from person;
+------+------+
| name | id |
+------+------+
| Jack | NULL |
+------+------+
1 row in set (0.00 sec)
不选择列名则代表选择所有的列名:
insert into <表名> values (v1,v2,...,vN);
mysql> select * from person;
+------+------+
| name | id |
+------+------+
| Jack | NULL |
+------+------+
1 row in set (0.00 sec)
mysql> insert into person values('Sam',0001);
Query OK, 1 row affected (0.01 sec)
mysql> select * from person;
+------+------+
| name | id |
+------+------+
| Jack | NULL |
| Sam | 1 |
+------+------+
2 rows in set (0.00 sec)
插入多条数据:
insert into <表名> (f1, f2,...,fi) values (vA1,vA2,...,vAi),(vB1,vB2,...,vBi),......,(vC1,vC2,...,vCi);
insert into <表名> values (vA1,vA2,...,vAN),(vB1,vB2,...,vBN),......,(vC1,vC2,...,vCN);
mysql> insert into person values ('Tim',123),('Back',666);
Query OK, 2 rows affected (0.06 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from person;
+------+------+
| name | id |
+------+------+
| Jack | NULL |
| Sam | 1 |
| Tim | 123 |
| Back | 666 |
+------+------+
4 rows in set (0.00 sec)
可以直接从别的表中选择数据插入
格式:insert into <表名> <查询结果>
insert into account
select loan_number, branch_name, 200
from loan
where branch_name = 'Perryridge';
(5)update <表名> set <列名> = <新值> WHERE <列名> = <某值>
(6)alter table <表名> drop <列名>
alter table loan drop loan_number;
(7)alter table <表名> add <列名> <类型>
默认添加到最后一列处
alter table loan add loan_number char(30);
指定插到第一列
alter table loan add loan_number char(30) FIRST;
指定插到某一列后
alter table loan add loan_number char(30) after branch_name;
(8)alter table <表名> modify <列名> <新的类型>
修改类型
alter table loan modify loan_number char(20);
修改类型同时设置属性
alter table loan modify loan_number char(20) not null;
alter table loan modify loan_number char(20) default 100;
(9)alter table <表名> change <旧列名> <新列名> <新的类型>
不能只修改列名
alter table loan change loan_number myloan_number char(30);
(10)alter table <表名> alter <列名> set default <值>
设置默认值
alter table loan alter loan_number set default 100;
PS:也可以通过修改类型的同时修改:aler table loan modify loan_number char(20) default 100;
(11)alter table <表名> alter <列名> drop default
删除默认值
alter table loan alter loan_number drop default;
(11)alter table <旧表名> rename <新表名>
alter table loan alter loan_number rename myloan;
(12)delete from <表名> where <谓词语句>
delete from account
where branch_name = 'Perryridge'
2.视图view
命令 | 作用 |
---|---|
create view <视图名> (列名) as <查询语句> | 创建视图 |
select <列名> from <视图> | 查询视图 |
drop view <视图名> | 删除视图 |
(1)create view <视图名> (列名) as <查询语句>
①格式1:create view <视图名> as <查询语句>
视图的列名没有被指定,那么它就从select 后的列名继承而来,即相同列名。
A view consisting of branches and their customers
CREATE VIEW all_customer AS
(SELECT branch_name, customer_name
FROM depositor, account
WHERE depositor.account_number = account.account_number )
UNION
(SELECT branch_name, customer_name
FROM borrower, loan
WHERE borrower.loan_number = loan.loan_number);
②格式2:create view <视图名> (列名) as <查询语句>
CREATE VIEW all_customer(bname,cname) AS
(SELECT branch_name, customer_name
FROM depositor, account
WHERE depositor.account_number = account.account_number )
UNION
(SELECT branch_name, customer_name
FROM borrower, loan
WHERE borrower.loan_number = loan.loan_number);
(2)像table一样使用查询
Find all customers of the Perryridge branch
SELECT customer_name
FROM all_customer
WHERE branch_name = 'Perryridge';
(3)drop view <视图名>
drop view all_customer;
3.权限
(1)grant赋予权限
①格式1:grant <privilege list> on <表名或视图名> to <user list>
权限:
- select: allows read access to relation,or the ability to query using the view
- insert: the ability to insert tuples
- update: the ability to update using the SQL update statement
- delete: the ability to delete tuples.
- all privileges: used as a short form for all the allowable privileges
Example: grant users U1, U2, and U3 select authorization on the branch relation:
grant select on branch to U1, U2, U3
②格式2:grant <privilege list> (列名) on <表名或视图名> to <user list>
To give database user ‘Zhang’ the privilege of modifying balance on table account,
GRANT UPDATE(balance) ON account TO Zhang;
(2)revoke撤销权限
格式:revoke <privilege list> on <表名或视图名> from <user list>
Example
revoke select on branch from U1, U2, U3
PS:If the same privilege was granted twice to the same user by different grantees, the user may retain the privilege after the revocation.
三、数据类型
1.整型(int)
MySQL数据类型 | 字节 | 范围(有符号) |
---|---|---|
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 查询结果集中的显示宽度,和实际的取值范围无关。
2.浮点型(float 和 double)
MySQL | 字节 | 含义 |
---|---|---|
float(m,d) | 单精度浮点型 | 8位精度(4字节) |
double(m,d) | 双精度浮点型 | 16位精度(8字节) |
设一个字段定义为 float(5,3),如果插入一个数 123.45678,实际数据库里存的是 123.457,但总个数还以实际为准,即 6 位。
3.定点数(decimal)
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
decimal(m,d)
参数 :
m:总位数(小数点左侧和右侧),默认是 18,m<65
d :小数点右侧存储的最大位数 ,默认是 0,d<30并且d<m
4.字符串(char,varchar)
MySQL数据类型 | 长度 | 字符 |
---|---|---|
char(n) | 固定长度 | 最多255个字符 |
varchar(n) | 可变长度 | 最多255个字符 |
tinytext | 可变长度 | 最多255个字符 |
text | 可变长度 | 最多65535个字符 |
mediumtext | 可变长度 | 最多2的24次方-1个字符 |
longtext | 可变长度 | 最多2的32次方-1个字符 |
ENUM(x,y,z,etc.) | 允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。 | 注释:这些值是按照你输入的顺序存储的。可以按照此格式输入可能的值:ENUM(‘X’,‘Y’,‘Z’) |
SET | 与 ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。 |
char 和 varchar:
1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以 char 类型存储的字符串末尾不能有空格,varchar 不限于此。
2.char(n) 固定长度,char(4) 不管是存入几个字符,都将占用 4 个字节,varchar 是存入的实际字符数 +1 个字节(n<=255)或2个字节(n>255),所以 varchar(4),存入 3 个字符将占用 4 个字节。
3.char 类型的字符串检索速度要比 varchar 类型的快。
varchar 和 text:
1.varchar 可指定 n,text 不能指定,内部存储 varchar 是存入的实际字符数 +1 个字节(n<=255)或 2 个字节(n>255),text 是实际字符数 +2 个字节。
2.text 类型不能有默认值。
3.varchar 可直接创建索引,text 创建索引要指定前多少个字符。varchar 查询速度快于 text, 在都创建索引的情况下,text 的索引似乎不起作用。
5.二进制数据(_Blob)
1._BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。
2._BLOB存储的数据只能整体读出。
3._TEXT可以指定字符集,_BLO不用指定字符集。
6.日期时间类型
MySQL数据类型 | 含义 |
---|---|
date | 日期 ‘2008-12-2’ |
time | 时间 ‘12:25:36’ |
datetime | 日期时间 ‘2008-12-2 22:06:44’ |
timestamp | 自动存储记录修改时间 |
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
7.数据类型的属性
(1)关键字
MySQL关键字 | 含义 |
---|---|
NULL | 数据列可包含NULL值 |
NOT NULL | 数据列不允许包含NULL值 |
DEFAULT | 默认值 |
PRIMARY KEY | 主键 |
FOREIGN KEY | 外键 |
AUTO_INCREMENT | 自动递增,适用于整数类型 |
UNSIGNED | 无符号 |
CHARACTER SET name | 指定一个字符 |
(2)PRIMARY KEY主键
PRIMARY KEY含义
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。(有重复的值的列不能当作主键)
主键列不能包含 NULL 值。(现版本声明为主键自动声明为Not Null)
每个表都应该有一个主键,但可以有多个。
理解:主键是这个表特有的数据,表明这个表的独特之处。如果一个表要有两个主键,才能满足其他的表的外键需求,那么证明需要拆分这个表来达到更好的设计。
表创建时在 “Id_P” 列创建 PRIMARY KEY :
格式:primary key(<列名>)
create table branch(
branch_name varchar(30) NOT NULL,
branch_city varchar(30),
assets decimal(12),
primary key(branch_name)
);
(3)FOREIGN KEY外键
格式:foreign key(<列名>) references <表名>(<列名>)
注意:references
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)
(4)CHECK
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
);