admin 管理员组

文章数量: 888299

(MY)SQL基本语句


简介:

SQL是Structure Query Language的缩写,是使用关系模式的数据库应用语言。面对一个陌生的数据库时,通常需要一种方式与它进行交互来完成用户所需要的各个工作,这时候就得用到SQL语言。

SQL使用入门:
SQL主要划分为以下三种类别:
1. DDL(Data definition Language),数据定义语句,这些语句定义了不同数据段,数据库,表,列,索引等数据库对象。
2. DML(Date Manipulation Language), 数据操作语句,用于添加,删除,更新和查询数据库记录,并检查数据完整性。
3. DCL(Date Control Language), 数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库,表,字段,用户访问权限和安全级别。

一. DDL语句

简单来说,DDL语句就是对数据库内部的对象进行创建,删除,修改等操作语言。和DML最大的区别在于DML只是对表内部进行数据操作,而不涉及表的定义,结构的修改,更不会涉及其他对象。DDL主要更多的由数据库管理员使用,开发人员用的比较少。

show databases;/*显示所有数据库*/create database database_name;/*创建一个新的数据库*/drop database database_name;/*删除一个数据库*/use database_name;/*使用某个数据库*/show tables;/*显示这个数据库中的所有表*//*创建一张表*/
create table table_name(
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints,
...
column_name_n column_type_n constraints,
);
/*例子*/
create table student(Sno varchar(9) not null primary key comment '学生学号',Sname varchar(8) not null comment '学生姓名',Ssex char(2) not null comment '学生性别',Sdate date not null comment '学生入学日期',Spoint double(3,1) comment '学生绩点'
);  desc table_name;/*查看这个表的结构*/show create table table_name;/*显示创建表的SQL语句*/drop table table_name;/*删除一张表*//*下面的[]表示可选*/
/*修改表类型*/
alter table table_name modify [column] column_difinition[first|after col_name];
/*例子*/
alter table student modify Sno char(12);/*增加表字段*/
alter table table_name add [column] column_difinition[first|after col_name];
/*例子*/alter table student add Shome varchar(2) not null;/*删除表字段*/
alter table table_name drop [column] col_name;
/*例子*/alter table student drop Shome;/*字段改名*/
alter table table_name change [column] old_name column_definition [first|after col_name]
/*例子*/alter table student change Spoint Sdegree double(3,1);
/*##change 和 modify都可以修改表的定义,不同的是change后面需要写两次列名,相当于把自己改一下,但是名字不变,类型改变*//*修改字段排列顺序*/
/*[first|after col_name]用来修饰字段在表中位置,其中add,modify,change都有这个功能,不过add增加到字段默认添加到标的最后,而其余两个默认不变位置*/
/*例子1:增加字段Sbirth到Sdate后面*/
alter table student add Sbirth date after Sdate;
/*例子二:把Sname修改到Sno前面*/
alter table student modify Sno char(12) after Sname;/*更改表明*/
alter table table_name rename [to] new_table_name;
/*例子*/ 
alter table student rename to students;

二.DML语句

DML操作是指对数据库中表记录的操作,主要包括记录的插入(insert),更新(update),删除(delete)和查询(select),是开发人员日常使用最频繁的操作。

1.插入记录
基本语法:

insert into table_name(field1,field2,...fieldn) values(value1,value2,...valuen);
/*或者*/
insert into table_name value(value1,value2,...valuen);
/*只要value和列表一一对应就行了*/
/*例子*/
insert into students value('1','桐人','男','2017-10-21')('2','樱木','男','2017-10-22'),('3','一户','男','2017-10-21'),('4','井上','女','2017-10-22');

含可空字段,非空但是含有默认值的字段,自增字段,可以不在insert后的字段列表里出现,values后面只要写对应字段名称的value。其余没写的自动设置为NULL,默认值,自增的下一个数字。

insert into students (Sno,Ssex,Sdate) value('6','男','2017-10-21')

2.更新记录
基本语法:

update table_name set field1=value1,field2=value2,...fieldn=valuen where condition
/*例子*/
update students set Sdate='2017-10-23' where Sname='井上';

自然也能使多张表同时改变:

update table_name1,table_name2 set (...内容..) where (..条件..);

3.记录字段
基本语法:

delete from table_name where condition
/*例子*/
delete from students where Sno='4';
/*也可以多张表的字段*/
delete t1,t2,..tn from table_name1 t1,table_name t2,table_namen tn where condition(条件)

不加where字段会把整张表删掉

4.查询记录

数据插入到数据库中后,就可以用select命令进行各种各样的查询,使输出的结果符合用户的要求,听说select语法很复杂。。

select * from table_name[where condition];
/* *表示将所有的记录都选出来,也可以用逗号分割的所有字段来表示,*的好处是当所需是所有字段时,语句很方便,但只是一部分时,就必须得用字段一一列出来 */

(1). 查询不重复的记录
当需要将表中的记录去掉重复后显示出来,可以用distinct关键字来实现

select distinct field from table_name;
/*例子*/
select distinct Sdate from students;

(2). 条件查询
有时候并不需要全部查询,而是需要根据限定条件来查询一部分数据

/*例子:查询所有日期为2017-10-21号的*/
select * from students where Sdate='2017-10-21';

where后面的条件除了’=’外,还可以使用>,<,>=,<=,!=等较多运算符;多个条件之间还可以使用 or,and等逻辑运算符进行多条件联合查询。

/*例子:查询所有日期为2017-10-21号并且Sno在前2的*/
select * from students where Sdate='2017-10-21' and Sno <= 2;

为了后面更好的举例,重新定义两张表:
sql

create table employee(/*职工表*/No int(4) not null primary key ,Name varchar(8) not null ,Salary int(6) not null,Date_In  date not null
);
insert into employee value(1,'Mike',5000,'2017-10-21'),(2,'Ross',4000,'2017-10-24'),(3,'Green',6000,'2017-10-23'),(4,'Hellon',3000,'2017-10-22'),(5,'Jan',5000,'2017-10-23');create table department(/*部门表*/No int(4) not null primary key ,Dno int(4) not null ,Name varchar(8) not null ,Dname varchar(8) not null 
);insert into department value(1,1,'Mike','sale'),(2,2,'Ross','product'),(3,1,'Green','sale'),(4,3,'Hellon','logistics'),(5,2,'Jan','product');
alter table department add  foreign key(`No`) references employee(`No`);//最好添加一下外键

(3). 排序和限制
有时需要取出某个字段排序后的记录结果集,可以用关键字 ORDER BY 来实现
语法:

select * from table_name [where condition] order by field [desc/asc];
/*例子*/
select * from employee order by salary;

desc表示降序,asc表示升序,如果不写默认asc。
而且order by 后面可跟多个字段,优先级从左向右,比如:

 select * from employee order by salary,No;

表示先排列salary,然后再把相同salary不同No的进行升序排列。

有时排列后我们只需要取出数据的一部分时我们就可以使用关键字LIMIT。
语法:

select ... [limit off_start,row_count];/*off_start表示起始偏移量,row_count表示行数*/
/*例子*/select * from employee order by salary desc limit 1,3;
/*这表示把把薪水降序排列后取出从第二个开始的3行。#和数组一样,从0开始标记*/

(4). 聚合
有时用户需要进行一些汇总操作,比如统计公司的人数或者统计每个部门的人数,这时就需要用到聚合操作。
语法:

select [field1,field2,...fielfn] fun_name from table_name [where where_contition] [group by field1,field2,...fielfn] [with rollup] [having where contition];

fun_name: 表示要做的聚合操作,也就是说聚合函数,常用的有 :sum(求和) ,count(记录数), max(最大值), min(最小值)。
group by: 关键字表示要进行分类聚合的字段,比如说日期,那就写在group by后面
with rollup是可选语法: 表明是否对分类聚合后的结果进行再汇总。
having: 表示对分类后的结果再进行条件的过滤。
having和where的区别在于,having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤,如果逻辑允许,那就尽可能使用where线过滤记录,因为这样条件会先减小,对聚合的效率大大调高,然后再根据逻辑情况看是否还需用having进行过滤。

 /*统计日期并汇总*/select Date_In,count(*) from employee group by Date_In with rollup;/*统计薪水并过滤出薪水相同人数大于1的*/select salary,count(1) from employee group by salary having count(1)>1;/*统计薪水并过滤出薪水大于4000的*/select salary,count(1) from employee group by salary having salary>4000;

(5). 表连接
当需要显示多张表的字段时,就可以用表连接的用来实现这样的功能。从大类上分,表连接分为: 内连接 和 外链接,最大的区别就是内连接仅选出两张表中互相匹配的记录,而外链接会选出其他不匹配的记录。最常用的还是内连接。

/*例子:把employee表和department表通过NO相同来连接起来*/
/*只不过不能直接select No,Name...因为两张表都有这个列,所以得制定那张表,否则报出模棱两可错误*/select employee.No,employee.Name,Salary,Date_In,Dno,Dname from employee,department where employee.No=department.No;;

外链接又分为左链接和右链接,具体定义:

左链接: 包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录;
右链接: 包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录;

/*例子*/
select employee.No,employee.Name,Salary,Date_In,Dno,Dname from employee left join department on employee.No=department.No;

这和where那句的不同之处在于where链接只能把全部对应的都连接了起来,但是不合法的就不能链接,而左右链接也能连接不合法的部分。

(6). 子查询
有些查询的时候,需要的条件是另一个select语句的结果,这个时候就需要子查询。用于子查询的关键字主要包括 in ,not in,=,!=,exists,not exists.

/*例子:从employee表中查询所有编号在department表中的记录*/select * from employee where No in(select No from department);/*例子如果记录数唯一,还可以使用=代替in*/
select * from employee where No =(select No from department);
select * from employee where No =(select No from department limit 1);

(7). 记录联合
当我们碰到要将两张表按照一定的查询条件查询出来后,奖结果合并到一起显示出来,这时候需要用union和union all 关键字来实现这样的功能。
语法:

select * from t1 
union/union all
select * from t2
...
union/union all
select * from tn;

union表示不重复显示,union all表示全部显示。

DCL语句

DCL语句主要是DBA用来管理系统中对象限制使用,一般开发人员很少使用。可能会用到创建数据库用户后,对他进行设置对表的操作权限。

参考书籍:深入浅出mysql
     mysql必知必会

本文标签: (MY)SQL基本语句