(MY)SQL基本语句

来源:互联网 发布:2015网络流行词大全 编辑:程序博客网 时间:2024/06/06 01:34


简介:

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 allselect * from t2...union/union allselect * from tn;

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

DCL语句

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

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

原创粉丝点击