首页 > 代码库 > 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基础