Mysql之SQL使用

Mysql之SQL使用

简介
什么是 SQL?
SQL 指结构化查询语言
SQL 使我们有能力访问数据库
SQL 是一种 ANSI 的标准计算机语言
备注:ANSI,美国国家标准化组织

一、SQL语句、语法

1、查:SELECT 语句用于从表中选取数据。结果被存储在一个结果表中(称为结果集)。
sql select 语法
select 列 from table_name;
select * from table_name;

2、插:INSERT INTO 语句用于向表格中插入新的行。
sql insert 语法
insert into table_name values (值1,值2,...);
insert into table_name (列1,列2,...) values (值1,值2,...);

3、改:Update 语句用于修改表中的数据。
sql update 语法
update table_name set 列1 = 新值 where 列2 = 某值  # 列2指定谁修改,列1指定修改的内容

4、删:DELETE 语句用于删除表中的行。
sql delete 语法
delete from table_name where 列 = 值;     # 删除某一行
delete from table_name; 或 delete * from table_name;     #删除所有行(表的结构、属性和索引都是完整的)

sql truncate table 语法
truncate table table_name;      # 与delete一样删除表中所有行,效率更快

5、top:TOP 子句用于规定要返回的记录的数目。
列(s) = *
sql top 语法
select top number|precent 列(s) from table_name;     # 列(s) 表示 所有的列名称 
top number例:select top 2 * from table_name; 或 select * from table_name limit 2;
top precent例:select top 50 precent * from table_name; # 选取表中50%的记录

6、like:LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式
sql like 语法
select 列(s) from table_name where 列 like pattern;
例:select * from table_name where 列 like 'A%'(在表中搜寻以A开头的)|'%B'(以B结尾的)|'%AB%'(包含AB的);

7、in:IN 操作符允许我们在 WHERE 子句中规定多个值
sql in 语法
select * from table_name where 列 in(值1,值2,...);

8、between:操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
sql between 语法
select * from table_name where 列 between 值1 and 值2;  # 范围取头不取尾

9、alias:为列名称和表名称指定别名(Alias)。
sql alias 语法
表:select * from table_name as alias_name;
表别名例:select p.列1,p.列2,p.列3 from table_name1 as p,table_name2 as po where p.列1='值1' and p.列2='值2';
列:select 列 as alias_name from table_name;
列别名例:select 列1 as alias_name1,列2 as alias_name2 from table_name;

10、join:用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
sql join 语法
select tb1.列1,tb1.列2,tb2.列 from tb1 inner join tb2 on tb1.列3=tb2.列3 order by tb1.列1;
或
select tb1.列1,tb1.列2,tb2.列 from tb1,tb2 where tb1.列3=tb2.列3;
备注:不同的 SQL JOIN
除了在上面的例子中使用的 INNER JOIN(内连接),还可以使用其他几种连接。
下面列出了可以使用的 JOIN 类型,以及它们之间的差异。
JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行

inner join 关键字语法:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
select * from tb1 inner join tb2 on tb1.列=tb2.列;        # inner join 与join是相同的

left join 关键字语法:LEFT JOIN 关键字会从左表(tb1)那里返回所有的行,即使在右表(tb2)中没有匹配的行。
select * from tb1 left join tb2 on tb1.列=tb2.列;

right join 关键字语法:RIGHT JOIN 关键字会右表(tb2)那里返回所有的行,即使在左表(tb1)中没有匹配的行。
select * from tb1 right join tb2 on tb1.列=tb2.列;

full join 关键字语法:只要其中某个表存在匹配,FULL JOIN 关键字就会返回行
select * from tb1 full join tb2 on tb1.列=tb2.列;

11、union:用于合并两个或多个 SELECT 语句的结果集(UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同)
sql union 与 union all 语法
select * from table_name1 union select * from table_name2;
select * from table_name1 union all select * from table_name2;
备注:默认地,union 选取不同的值,如果允许重复的值,就使用 union all(列出所有的值)

12、select into:从一个表中选取数据,然后把数据插入另一个表中。常用于创建表的备份复件或者用于对记录进行存档。
sql select into 语法
select * into new_table_name [in externaldatabase] from old_table_name; # 所有列插入新表
select 列 into new_table_name [in externaldatabase] from old_table_name;  # 某一列插入新表
例:备份某张表  select * into tb1_backup from tb1;
向另一个数据库中拷贝表  select * into tb1 in 'backup.mdb' from tb1;
多表查询存入到新表   select tb1.列1,tb2.列2 into new_table_name from tb1 inner join tb2 on tb1.列3=tb2.列3;

13、create database:用于创建数据库
sql create database 语法
create database database_name;

14、create table:用于创建数据库中的表
sql create table 语法
create table table_name(列1 数据类型,列2 数据类型,...)
备注:常用数据类型有 int(size)-整数、decimal(size,d)-带小数数字、char(size)-固定长度字符串、varchar(size)-可变长字符串
数据类型后续会继续补充

15、create index:用于在表中创建索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
sql create index 语法
create index index_name on table_name(列);   # 简单的索引,允许使用重复的值
create index index_name on table_name(列1 desc,列2);      # 默认是升序,希望降序在列名称后添加保留字 desc,索引不止一个列可以逗号隔开

sql create unique index 语法      # 唯一的索引
create unique index index_name on table_name(列);    # 唯一的索引意味着两个行不能拥有相同的索引值

16、DROP:删除索引、表以及数据库
sql drop 语法
删除索引:drop index index_name on table_name;
删除表:drop table table_name;
删除库:drop database database_name;

17、alter table : 语句用于在已有的表中添加、修改或删除列。
sql alter table 语法
添加列:alter table table_name add 列 数据类型;
删除列:alter table table_name drop column 列;
改变列中数据类型:alter table table_name modify column 列 需要修改的类型;
只修改列的数据类型的方法:
通常可以写成 alter table 表名 modify column 列名 新的列的类型
例如:student表中列sname的类型是char(20),现在要修改为varchar(20),SQL语句如下
     alter table student modify column sname varchar(20);
同时修改列名和列的数据类型的方法:
通常可以写成 alter table 表名 change column 旧列名 新列名 新的列类型
例如:student表中列sname的类型是char(20),现在要修改为stuname varchar(20),SQL语句如下
     alter table student change column sname stuname varchar(20);

alter table table_name add <新列名> <数据类型> [约束条件][FLRST(添加列到表的最前面)|AFTER(指定列后面)  <已存在的列>]; # 添加列
alter table table_name <旧列名> <新列名> <新数据类型>; # 修改列名
alter table table_name modify <列名> <数据类型>; # 修改列的数据类型
alter table table_name modify <列1(想要改变的列)> <数据类型> FLRST|AFTER <列2>; # 修改列的位置
alter table table_name drop <列>;  # 删除列
alter table <旧表名> rename to <新表名>; # 修改表名

18、auto increment:会在新记录插入表中时生成一个唯一的数字
通常希望在每次插入新记录时,自动地创建主键字段的值。可以在表中创建一个 auto-increment 字段。
sql auto-increment 语法
create table table_name(id int not null auto_increment,name varchar(255) not null,PRIMARY key(id)); #id定义为auto_increment主键

19、view(视图): 视图是可视化的表。视图包含行和列,就像一个真实的表
注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。

sql create view 语法
create view view_name as select 列(s) from table_name where 条件;
注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。

更新视图:create or replace view view_name as select 列(*) from table_name where 条件;
删除视图:drop view view_name;

二、SQL 约束(constraints)

sql约束:约束用于限制加入表的数据的类型。是一种限制,它通过对表的行或列的数据做出限制,来确保表数据的完整性、唯一性
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。

1、not null 约束:强制列不接受 NULL 值,强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
例:create table table_name(id int not null,name varchar(255) not null); # 强制id和name不能为空

2、unique 约束:唯一标识数据库表中的每条记录,确保表中的一列数据没有相同的值
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束
例:create table时在id列创建unique约束
create table table_name(id int not null,name varchar(255) not null, unique (id));
例2:为多个列定义unique
create table table_name(id int not null,name varchar(255) not null, constraint uc_personID unique (id,name))
例3:表已创建情况下,创建unique约束
alter table table_name add unique(id);
多个:alter table table_name add constraint uc_personid unique(id,name);
例4:撤销unique
alter table table_name drop index uc_personid;

3、PRIMARY KEY 约束:PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。 primary key = unique +  not null 
例:create table时在id列创建PRIMARY KEY约束
create table table_name(id int not null,name varchar(255) not null, PRIMARY KEY(id));
例2:为多个列定义PRIMARY KEY
create table table_name(id int not null,name varchar(255) not null, constraint pk_personID PRIMARY KEY (id,name))
例3:表已创建情况下,创建PRIMARY KEY约束
alter table table_name add PRIMARY KEY(id);
多个:alter table table_name add constraint pk_personid PRIMARY KEY(id,name);
例4:撤销PRIMARY KEY
alter table table_name drop index uc_personid;

4、FOREIGN KEY 约束:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY
外键
外键用来在两个表数据之间建立链接,它可以是一列或多列。一个表可以有一个或多个外键
外键对应得是参照完整性,一个表得外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键得某个值。
FOREIGN KEY 约束用于预防破坏表之间连接的动作。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
例:create table时在id列创建 FOREIGN KEY 约束
create table table_name1(id int not null,name varchar(255) not null,Id_P int, PRIMARY KEY(id),FOREIGN KEY (Id_P) REFERENCES table_name2(Id_P));
例2:为多个列定义 FOREIGN KEY 
create table table_name1(id int not null,name varchar(255) not null,Id_P int, PRIMARY KEY(id) constraint fk_pertb2 FOREIGN KEY (Id_P)
REFERENCES table_name2(Id_P) )
例3:表已创建情况下,创建 FOREIGN KEY 约束
alter table table_name add ADD FOREIGN KEY (Id_P) REFERENCES table_name1(Id_P);
多个:alter table table_name add constraint pk_personid PRIMARY KEY(id,name);
例4:撤销 FOREIGN KEY 
alter table table_name drop FOREIGN KEY fk_pertb2;

外键约束
mysql> create table bookcategory(
    -> category_id int primary key,
    -> category varchar(20),
    -> parent_id int);
mysql> create table bookinfo(
    -> book_id int primary key,
    -> book_category_id int,
    -> constraint fk_cid foreign key(book_category_id) references bookcategory(category_id));

5、CHECK 约束:用于限制列中的值的范围
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
例:create table时在id列创建 CHECK 约束
create table table_name(id int not null,name varchar(255) not null,CHECK(id>0));
例2:为多个列定义 CHECK 约束
create table table_name(id int not null,name varchar(255) not null, constraint chk_tbname CHECK(id>0 and name='xxx'));
例3:表已创建情况下,创建 CHECK 约束
alter table table_name ADD constraint chk_tbname CHECK (Id_P>0 AND name='xxx'); 
例4:撤销 CHECK
alter table table_name drop constraint chk_tbname;

6、DEFAULT 约束:用于向列中插入默认值
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
例:create table时在id列创建 DEFAULT 约束,类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值
create table table_name(id int not null,name varchar(255) not null DEFAULT 'lxq',timedate date DEFAULT GETDATE());
例2:表已创建情况下,创建 DEFAULT 约束
alter table table_name alter name set DEFAULT 'lxq2';
例3:撤销 DEFAULT
alter table table_name ALTER name DROP DEFAULT;

三、sql函数

1、date

函数及描述
NOW():返回当前的日期和时间
CURDATE():返回当前的日期
CURTIME():返回当前的时间
DATE():提取日期或日期/时间表达式的日期部分
EXTRACT():返回日期/时间按的单独部分
DATE_ADD():给日期添加指定的时间间隔
DATE_SUB():从日期减去指定的时间间隔
DATEDIFF():返回两个日期之间的天数
DATE_FORMAT():用不同的格式显示日期/时间

四、数字类型

MySQL中,有三种主要的类型:文本、数字和日期/时间类型
1、Text 类型

CHAR(size):保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。

VARCHAR(size):保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。
注释:如果值的长度大于 255,则被转换为 TEXT 类型。

TINYTEXT:存放最大长度为 255 个字符的字符串。

TEXT:存放最大长度为 65,535 个字符的字符串。

BLOB:用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。

MEDIUMTEXT:存放最大长度为 16,777,215 个字符的字符串。

MEDIUMBLOB:用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。

LONGTEXT:存放最大长度为 4,294,967,295 个字符的字符串。

LONGBLOB:用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。

ENUM(x,y,z,etc.):允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。
注释:这些值是按照你输入的顺序存储的。
可以按照此格式输入可能的值:ENUM('X','Y','Z')

SET:与 ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。

2、Number 类型

TINYINT(size):-128 到 127 常规。0 到 255 无符号*。在括号中规定最大位数。

SMALLINT(size):-32768 到 32767 常规。0 到 65535 无符号*。在括号中规定最大位数。

MEDIUMINT(size):-8388608 到 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。

INT(size):-2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。

BIGINT(size):-9223372036854775808 到 9223372036854775807 常规。0 到 18446744073709551615 无符号*。在括号中规定最大位数。

FLOAT(size,d):带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。

DOUBLE(size,d):带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。

DECIMAL(size,d):作为字符串存储的 DOUBLE 类型,允许固定的小数点。
重点:这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。

3、Date 类型

DATE():日期。格式:YYYY-MM-DD
注释:支持的范围是从 '1000-01-01' 到 '9999-12-31'

DATETIME():*日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS
注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'

TIMESTAMP():*时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的描述来存储。格式:YYYY-MM-DD HH:MM:SS
注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC

TIME():时间。格式:HH:MM:SS 注释:支持的范围是从 '-838:59:59' 到 '838:59:59'
YEAR():2 位或 4 位格式的年。
注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。

重点:即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,
TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD

猜你喜欢

转载自blog.51cto.com/13266497/2149615