Mysql之SQL使用简介什么是 SQL?SQL 指结构化查询语言SQL 使我们有能力访问数据库SQL 是一种 ANSI 的标准计算机语言备注:ANSI,美国国家标准化组织一、SQL语句、语法1、查:
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:为多个列定义uniquecreate 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:撤销uniquealter 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 KEYcreate 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 KEYalter 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:撤销 CHECKalter 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:撤销 DEFAULTalter 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' UTCTIME():时间。格式: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