SQL: Structured Query Language
不区分大小写,建议关键字大写,自定义字符小写
常用数据类型:int、double、varchar(50)、date(只有年月日,没有时分秒)
创建数据库:CREATE DATABASE 数据库名;
显示数据库:show databases;
使用数据库:USE 数据库名;
删除数据库:DROP DATABASE 数据库名;
创建数据表:
create table 表名(列名1 数据类型 约束,列名2 数据类型 约束,列名3 数据类型 约束);
主键约束:主键用于标识当前记录的字段,特点是非空、唯一性。一般主键不具备任何含义,只标识当前记录。
格式:1)创建表时创建主键,在字段后加 primary key
create table test( id INT PRIMARY KEY, ……)
添加自增长的主键格式为 id int primary key auto_increment,
2) 创建表时创建主键,在表创建的最后指定主键
create table test ( id int, username varchar(50), primary key(id) )
3)多字段联合主键:主键由多个字段联合组成。例如:
CREATE TABLE test ( name VARCHAR(25),
depId INT(11),
salary FLOAT,
PRIMARY KEY(name, depId) )
外键约束:两个表的数据间建立链接。作用:保持数据一致性、完整性。
注:1)外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。从表插入数据时会检查外键字段在主表中的主键字段中是否存在,若不存在则不能插入。
2)主表删除记录时会检查主键值在从表中是否存在,若从表外键存在相应值,则主表不能删除该记录。
3)外键可以不是本表的主键,但必须对应另外一个表的主键。
4)一个表中不能有相同名称的外键。
创建外键语法规则:
[CONSTRAINT <外键名>] FOREIGN KEY 字段名1 [,字段名2,...]
REFERENCES <主键名> 主键列1 [,主键列2,...]
例如上图所示外键的创建:创建父表:
CREATE TABLE parent (
学号 INT(10) PRIMARY KEY,
姓名 VARCHAR(30) NOT NULL,
身份证号 VARCHAR(20)
)
创建子表并添加外键约束:
CREATE TABLE child (
id INT(11) PRIMARY KEY,
姓名 VARCHAR(30) NOT NULL,
学号 INT(10),
语文 FLOAT,
数学 FLOAT,
CONSTRAINT fk_out FOREIGN KEY (学号) REFERENCES parent(学号)
)
显示所有数据表:show tables;
查看表中的结构:DESC 表名;
删除表:drop table 表名;
修改表结构:alter
添加字段: ALTER TABLE 表名 ADD 新字段名 类型(长度) [约束] [FIRST | AFTER 已存在字段名];
修改列的类型长度及约束:alter table 表名 modify 列名 类型(长度) 约束;
修改列名:alter table 表名 change 旧列名 新列名 类型(长度) 约束;
删除列:alter table 表名 drop 列名;
删除表的外键约束:ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;
修改表名:rename table 表名 to 新表名;
修改表的字符集:alter table 表名 character set 字符集;
(增)插入表记录:insert
插入部分列:insert into 表名 (列名1, 列名2, 列名3) values (值1, 值2, 值3);
插入所有列:insert into 表名 values (值1,值2,值3, 值4);
注意:插入的数据应与字段的数据类型相同;数据的大小应该在列的长度范围内;在values中列出的数据位置必须与被加入列的排列位置相对应;除了数值类型外,其它的字段类型的值必须使用引号引起;如果要插入空值,可以不写字段,或者插入 null;对于自动增长的列在操作时,直接插入null值即可。
例如:INSERT INTO test (sid,username) VALUES(1002, 'ligang' );
(删)删除表记录:delete、truncate
delete from 表名 [where 条件];
truncate table 表名;
注:删除方式:delete 一条一条删除,不清空auto_increment记录数。
truncate 直接将表删除,重新建表,auto_increment将置为零,从新开始。
drop把表结构都删掉了,以后不再需要此表使用。truncate保留表结构,清空表数据,自增长主键从新开始。delete用于删除部分记录,不清空auto_increment记录数。效率方面:drop > truncate > delete
(改)更新表记录:update
update 表名 set 字段名=值,字段名=值 where 条件;
(查)选择表记录:select
select 字段1,字段2,字段3 from 表名 [where 条件];
//注意mysql查询两个以上字段不能加括号,如SELECT(username,tel) FROM users WHERE tel=346;是错误的
select distinct * from 表名;//加distinct去除重复结果
限制结果:不同数据库SQL实现不同
SQLServer:SELECT TOP 5 pro_name FROM tableName;
MySQL: SELECT pro_name FROM tablename LIMIT 5 OFFSET 2;//从第3条记录开始取5条记录,OFFSET标志起始位 置,第一行记录OFFSET=0, limit限制返回最大记录条数。
对返回结果排序:select 最后一句写ORDER BY
SELECT pro_name, pro_price FROM tableName ORDER BY pro_price, pro_name;//先按价格排序,然后按名称排序。
SELECT pro_price FROM tableName ORDER BY pro_price DESC;//DESC表示降序排序
SELECT pro_name, pro_price FROM tableName ORDER BY pro_price DESC, pro_name;//对多个列不同顺序排序,使用DESC关键字跟在每一列后,若果想在多个列上进行降序排序,必须对每一列指定DESC关键字。
where条件子句
where条件种类如下:
比较运算符 |
> < <= >= = <> |
大于、小于、大于(小于)等于 不等于 |
BETWEEN ...AND... |
显示在某一区间的值(含头含尾) |
|
IN(set) |
显示在in列表中的值,例:in(100,200) |
|
LIKE 通配符 |
模糊查询,Like语句中有两个通配符: % 用来匹配多个字符;例first_name like ‘a%’; _ 用来匹配一个字符。例first_name like ‘a_’; |
|
IS NULL |
判断是否为空 is null; 判断为空 is not null; 判断不为空 |
|
逻辑运算符 |
and |
多个条件同时成立 |
or |
多个条件任一成立 |
|
not |
不成立,例:where not(salary>100); |
!=和<>通常可以互换。但并非所有DBMS都支持这两种不等于操作符。例如,Microsoft Access支持<>而不支持!=
MySQL两种均支持
小例子:SELECT prod_name, prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10;
SELECT prod_name, prod_price FROM Products WHERE (vend_id = 'DLL01' OR vend_id = ‘BRS01’) AND prod_price >= 10;
IN操作符:IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值。
SELECT prod_name, prod_price FROM Products WHERE vend_id IN ( 'DLL01', 'BRS01' ) ORDER BY prod_name;
为什么要使用IN操作符?其优点为:
在有很多合法选项时,IN操作符的语法更清楚,更直观。
在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理。
IN操作符一般比一组OR操作符执行得更快。
IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。
NOT操作符:WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件。
SELECT prod_name FROM Products WHERE NOT vend_id = 'DLL01' ORDER BY prod_name;
LIKE通配符:
1)百分号(%)通配符:%表示任何字符出现任意次数
SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE 'Fish%';//匹配以Fish开头的prod_name
SELECT prod_name FROM Products WHERE prod_name LIKE 'F%y';//匹配F开头y结尾的prod_name,如果值后面跟空格,则不是以y结尾,所以Fish bean bag toy就不会检索出来。
除了能匹配一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。但是不会匹配名称为NULL的行。
2)下划线(_)通配符:只匹配单个字符。
COUNT(*):统计表的总行数,包括空值,COUNT(字段名):统计指定字段下总行数,忽略空值行。
SELECT COUNT(*) AS cust_num FROM customers;
SUM(列名):返回指定列的总和
AVG() MAX() MIN() 平均值、最大值、最小值
SELECT s_id,AVG(f_price) AS avg_price FROM fruits GROUP BY s_id;
子查询
1)ANY关键字:接在一个比较操作符后面,表示若与子查询返回的任何值比较为TRUE则返回TRUE
2)ALL关键字:同时满足所有内层查询条件,返回TRUE
SELECT num1 FROM tb11 WHERE num1>ANY(SELECT num2 FROM tb12);
3)EXISTS关键字:子查询至少返回一行,则EXISTS结果为TRUE,此时外层查询语句继续执行;
子查询没有返回任何行,则EXISTS结果为FALSE,外层查询将不执行。
合并查询结果
UNION关键字:将多条SELECT查询结果合成单个结果集,合并时两个表对应列数和数据类型必须相同,各个SELECT语句间用UNION或UNION ALL 关键字分隔。
UNION分隔:执行时删除重复记录;UNION ALL分隔:不删除重复行也不对结果进行自动排序。
SELECT coulmn,... FROM table1
UNION [ALL]
SELECT coulmn,... FROM table2
为表取别名:表名 AS 表别名
SELECT * FROM orders AS o WHERE o.o_num=100;
创建存储过程:
CREATE PROCEDURE Proc_name(OUT param1 INT)//指定输入输出参数[IN|OUT|INOUT] param_name type
BEGIN
SELECT COUNT(*) INTO param1 FROM table1;
END;
创建存储函数:
CREATE FUNCTION func_name ( [func_paprameter] )
RETURNS type
.......
定义变量:DECLARE var_name type [DEFAULT value];
为变量赋值:SET var_name=value;
SELECT col_name INTO var_name 查询条件;
调用存储过程:CALL sp_name( parameter )
创建视图:
CREATE VIEW news_view
AS SELECT c.commentID,n.newsID,n.newsRate,n.newsTitle,n.newsContent,n.newsDate FROM news_Comment AS c,news AS n
WHERE c.newsID=n.newsID=1;
查看视图:DESC news_view
References:
[1]《MySQL5.7从入门到精通》刘增杰 清华大学出版社