SQL基本知识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/brave_stone/article/details/81260719

SQL: Structured Query Language

不区分大小写,建议关键字大写,自定义字符小写

常用数据类型:int、double、varchar(50)、date(只有年月日,没有时分秒)

创建数据库:CREATE DATABASE 数据库名;

显示数据库:show databases;

使用数据库:USE 数据库名;

删除数据库:DROP DATABASE 数据库名;

创建数据表:

create table 表名(列名1 数据类型  约束,列名2 数据类型  约束,列名3 数据类型  约束);

主键约束:主键用于标识当前记录的字段,特点是非空、唯一性。一般主键不具备任何含义,只标识当前记录。

格式:1)创建表时创建主键,在字段后加 primary key

扫描二维码关注公众号,回复: 4808884 查看本文章

                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从入门到精通》刘增杰 清华大学出版社

 

猜你喜欢

转载自blog.csdn.net/brave_stone/article/details/81260719