MySQL基础语法
一、SQL基础理解
SQL是用于管理关系数据库管理系统(RDBMS)。
SQL的适用范围:数据的增删查改,数据库模式创建和修改,数据访问控制。
SQL 指结构化查询语言,全称是 Structured Query Language。
SQL 在1986年成为 ANSI(American National Standards Institute 美国国家标准化组织)的一项标准,在 1987 年成为国际标准化组织(ISO)标准。
二、SQL能做什么?
SQL 面向数据库执行查询
SQL 可从数据库取回数据
SQL 可在数据库中插入新的记录
SQL 可更新数据库中的数据
SQL 可从数据库删除记录
SQL 可创建新数据库
SQL 可在数据库中创建新表
SQL 可在数据库中创建存储过程
SQL 可在数据库中创建视图
SQL 可以设置表、存储过程和视图的权限
三、SQL基础语句
- use RUNOOB; 命令用于选择数据库。
- set names utf8; 命令用于设置使用的字符集。
- SELECT DISTINCT 语句用于返回唯一不同的值。
SELECT TOP 50 PERCENT * FROM Websites
; 从 websites 表中选取前面百分之 50 的记录SELECT * FROM Websites WHERE name REGEXP '^[GFs]';
选取 name 以 “G”、“F” 或 “s” 开始的所有网站([GFs]为正则表达式,[GFs]标识不以这些字符开头,在这里表示“非”的意思)- Between A and B(A<=x<=B);not Between A and B (x<A或x>b)
- 如果列名称包含空格,要求使用双引号或方括号
A left join B on A.XX = B.XX and B.XXX= ‘XXX’
中on的作用:用来关联A与B的关联关系以及过滤出符合条件的B表记录- 左连接:
右连接:
全连接:
连接(内连接):
- UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
- 向A表中插入B表中一些符合条件的数据:
Insert into A(字段1, 字段2, 字段3, 字段4, 字段5, 字段6, 字段7)
Select B.字段1, B.字段2, B.字段3, B.字段4, B.字段5, B.字段6, B.字段7
from B
约束
- 在 SQL 中,我们有如下约束:
NOT NULL - 指示某列不可以存储 NULL 值。
- 在一个已创建的表的 “Age” 字段中添加 NOT NULL 约束如下所示:
ALTER TABLE Persons MODIFY Age INT NOT NULL;
- 在一个已创建的表的 “Age” 字段中删除 NOT NULL 约束如下所示:
ALTER TABLE Persons MODIFY Age INT NULL;
UNIQUE - 保证某列的每行必须有唯一的值。
- PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。
- 每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
- 单列约束(在 “P_ID” 列上创建 UNIQUE 约束)创建:
MYSQL =>UNIQUE (P_ID)
SQL Server / Oracle / MS Access =>P_ID INT NOT NULL
- UNIQUE修改:
ALTER TABLE Persons ADD UNIQUE (P_ID)
- 多列约束(在表字段1、字段2列上创建UNIQUE 约束):
新建:
CONSTRAINT 新的约束名称 UNIQUE (表字段1,表字段2)
修改:
ALTER TABLE Persons ADD CONSTRAINT新的约束名称
UNIQUE (表字段1,表字段2)
- 撤销UNIQUE约束:
MySQL =>ALTER TABLE Persons DROP INDEX 约束字段名称
SQL Server / Oracle / MS Access
=>ALTER TABLE Persons DROP CONSTRAINT约束字段名称
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。
- 确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- 使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时),其他除了关键字皆与UNIQUE一致
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
- FOREIGN KEY 约束用于预防破坏表之间连接的行为。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。 - 创建FOREIGN KEY约束(单列):
MySQL => FOREIGN KEY (ID) REFERENCES Persons(外键字段)
SQL Server / Oracle / MS Access:
=>ID INT FOREIGN KEY REFERENCES Persons(外键字段)
- 创建FOREIGN KEY约束(多列):
CONSTRAINT FK_NEW_NAME FOREIGN KEY (本表主键字段)
REFERENCES Persons(外表主键字典)
- 撤销FOREIGN KEY约束:
MySQL =>ALTER TABLE Orders DROP FOREIGN KEY FK_NEW_NAME
SQL Server / Oracle / MS Access:
=>ALTER TABLE Orders DROP CONSTRAINT FK_NEW_NAME
- 在创建表的时候指定外键约束
CREATE TABLE 表名
(
column1 datatype null/not null,
column2 datatype null/not null,
CONSTRAINT 外键约束名 FOREIGN KEY (column1,column2,... column_n)
REFERENCES 外键依赖的表 (column1,column2,...column_n)
ON DELETE CASCADE--级联删除
);
- 在创建表后增加外键约束
ALTER TABLE 表名
ADD CONSTRAINT 外键约束名
FOREIGN KEY (column1, column2,...column_n)
REFERENCES 外键所依赖的表 (column1,column2,...column_n)
ON DELETE CASCADE;--级联删除
- MySql 中如何删除未命名的外键?
删除外键需要知道外键的名称,如果创建时没有设置名称则会自动生成一个,你需要获取改外键的信息。
使用以下命令获取外键信息:
SELECT constraint_name FROM
information_schema.REFERENTIAL_CONSTRAINTS
WHERE
constraint_schema = <'db_name'> AND table_name = <'table_name'>;
SELECT * FROM
information_schema.KEY_COLUMN_USAGE
WHERE
constraint_schema = <'db_name'> AND table_name = <'table_name'> AND
referenced_table_name IS NOT NULL;
可以使用以下命令来删除外键:
ALTER TABLE <table_name> DROP INDEX <fk_name>;
CHECK - 保证列中的值能符合指定的条件。
单列:CHECK (P_ID>0);
ALTER TABLE Persons ADD CHECK (P_ID>0)
多列:CONSTRAINT chk_Person CHECK (P_ID>0 AND City=‘XX’);
ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (P_ID>0 AND City='Sandnes')
撤销CHECK约束:
单列:ALTER TABLE Persons DROP CONSTRAINT chk_Person
多列:ALTER TABLE Persons DROP CHECK chk_Person
DEFAULT - 规定没有给列赋值时的默认值。
添加:
city varchar(255) default ‘abc’ or orderDate date default GETDATE()
修改:
Mysql:
Alter table 表名 alter city set default ‘city’
SQL Server、MS Access:
Alter table表名add constraint 别名 default ‘abc’ for city
Oracle:
Alter table表名modify city default ‘abc’
撤销:
MySQL:
Alter table表名alter city drop default
SQL Server / Oracle / MS Access:
Alter table 表名 alter column city drop default
-
创建t_zhyq_base_dict_bak表并将t_zhyq_base_dict的结构与数据同步过去
create table t_zhyq_base_dict_bak as SELECT * from t_zhyq_base_dict
: -
索引分类(https://blog.csdn.net/qjl4646795/article/details/103552196):
逻辑分类:
创建主键索引:Alter table表名add primary key add(id)
创建唯一索引:Alter table表名add unique(username)
创建普通索引:Alter table表名add index INDEX_NAME(username)
创建全文索引:Alter table表名add FULLTEXT (username)
物理分类:
聚集索引、非聚集索引
CREATE INDEX INDEX_NAME ON TABLE_NAME (COLUMN_NAME)
CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME (COLUMN_NAME)
CREATE INDEX PINDEX ON PERSONS (LASTNAME)
CREATE INDEX PINDEX ON PERSONS (LASTNAME, FIRSTNAME)
Alter table table_name drop column column_name
(删除)
Alter table table_name add column column_name
(添加)
Alter table table_name drop index index_name
(删除)
Alter table table_name alter/modify column column_name column_type
(修改)- 查看数据表类型可以使用 SHOW TABLE STATUS 语句。
SHOW TABLE STATUS LIKE 'testalter_tbl'\G
- 修改数据表的名称(A改成B)
mysql> ALTER TABLE A RENAME TO B;