首页 > 代码库 > SQL基础

SQL基础

P25)SQL分类

DDL(Data Definition Languages)语句:数据定义语句,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象,常用的语句关键字主要包括create、drop、alter等。

DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括insert、delete、update和select等。

DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别,主要的语句关键字包括grant、revoke等。

 

连接数据库

技术分享

 

mysql代表客户端命令,“-u”后面跟连接的数据库用户,“-p”表示需要输入密码。(似乎创建数据库之前必须先要启动服务,不然会报错)

客户端的连接ID,这个数字记录了MySQL服务到目前为止的连接次数;每个新连接都会自动加1,本例中是4。


 

所有的DDl和DML(不包括SELECT)操作执行成功后都显示“Query OK”,这里理解为执行成功就可以了。

 

create DATABASE dbname: create database test1;

show databases;

use dbname: usr test1;

show tables;

drop database dbname: drop database test1;

(drop语句操作的结果都是显示“0 rows affected”)

 

因为MySQL的表名是以目录的形式存在于磁盘上的,所以表名的字符可以用任何目录名允许的字符。表创建完毕后,如果需要查看一下表的定义,可以使用如下命令:

DESC tablename: desc emp;

虽然desc命令可以查看表定义,但是其输出的信息还是不够全面。如果需要查看创建表的SQL语句,可以使用:show create table emp\G

这个命令同时也展示了表的engine(存储引擎)和charset(字符集)等信息。“\G”选项的含义是使得记录能够按照字段竖向排列,以便更好的显示内容较长的记录。

 


 

P29)修改表

修改表的列类型:ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name];

增加表字段:ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name];

删除表字段:ALTER TABLE tablename DROP [COLUMN] col_name;

字段改名:ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition [FIRST | AFTER col_name];

更改表名:ALTER TABLE tablename RENAME [TO] new_tablename;

 

 

P33)插入记录

insert语句的values子句含可空字段、非空但是含默认值的字段、自增字段,可以不用在insert后的字段列表里面出现,values后面只写对应字段名称的value。这些没写的字段可以自动设置为NULL、默认值、自增的下一个数字,这样在某些情况写可以大大缩短SQL语句的复杂性。

 

在MySQL中,insert语句还有一个很好的特性,可以一次性插入多条记录,语法如下:

INSERT INTO tablename (field1, field2, ...,fieldn)

VALUES

(record1_value1, record1_value2, ..., record1_valuen),

(record2_value1, record2_value2, ..., record2_valuen),

...

(recordn_value1, recordn_value2, ..., recordn_valuen);

这个特性可以使得MySQL在插入大量记录时,节省很多的网络开销,大大提高插入效率。

 

 

P35)更新记录

在MySQL中,update命令可以同时更新多个表中数据,语法如下:

UPDATE t1, t2, ..., tn set t1.field1=expr1, tn.fieldn=exprn [WHERE CONDITION];

 

P36)删除记录

在MySQL中可以一次删除多个表的数据,语法如下:

DELETE t1, t2, ..., tn FROM t1, t2, ..., tn [WHERE CONDITION];

如果from后使用别名,则delete后面也要用相应的别名,否则会提示语法错误。

 

P38)查询记录

有时需要将表中的记录去掉重复后显示出来,可以用distinct关键字来实现。

 

DESC和ASC是排序顺序关键字,DESC表示按照字段进行降序排序,ASC则表示升序排序,如果不写关键字默认是升序排列。ORDER BY后面可以跟多个不同的排序字段,并且每个排序字段可以有不同的排序顺序。

如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序,依次类推。如果只有一个排序字段,则这些字段相同(相等)的记录将会无序排列。

 

对于排序后的记录,如果希望只显示一部分,而不是全部,这时就可以使用LIMIT关键字来实现,LIMIT的语法如下:

SELECT ...[LIMIT OFFSET_start, row_count];      从偏移量开始共几行

在默认情况下,起始偏移量为0(对应第1条记录)。

limit经常和order by一起配合使用来进行记录的分页操作。

注:limit属于MySQL拓展SQL92后的语法,在其他数据库上并不能通用。

 

从大类上分,表连接分为内连接和外连接,他们之间最主要的区别是,内连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录

外连接又分为左连接右连接,具体定义如下:

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

右连接与左连接类似。

 

SELECT ... FROM t1 LEFT | RIGHT [OUTER | INNER] JOIN t2 on CONDITION;

如果不显式写OUTER或者INNER,那么默认是外连接。通过WHERE子句实现的表连接是内连接。

 

P44)子查询

用于子查询的关键字主要包括in、not in、=、!=、exists、not exists等。

如果子查询记录数唯一,还可以用=代替in。

 

P46)记录联合

SELECT* FROM t1

UNION|UNION ALL

SELECT* FROM t2

...

UNION|UNION ALL

SELECT* FROM tn;

UNION和UNION ALL的主要区别是UNION ALL是把结果集直接合并在一起,而UNION是将UNION ALL后的结果进行一次DISTINCT,去除重复记录后的结果。

 

P47)DCL语句

一些简单的例子:

创建一个数据库用户zl,具有对sakila数据库中所有表的SELECT/INSERT权限:

grant select, insert on sakila.* to ‘zl‘@‘localhost‘ identified by ‘123‘;

在终端登录:

mysql -uzl -p123

由于权限变更,需要将zl的权限变更,收回INSERT,只能对数据进行SELECT操作:

revoke insert on sakila.* from ‘zl‘@‘localhost‘;

 


 

P48)帮助的使用

如果不知道帮助能够提供些什么,那么可以用“? contents”命令来显示所有可供查询的分类。

对于列出的分类,可以使用“? 类别名称”的方式对用户感兴趣的内容做进一步的查看。

 

快速查阅帮助

如果需要快速查阅某项语法时,可以使用关键字进行快速查阅。例如:

? show

? create table

 

SQL基础