第二章 SQL基础
2.1 SQL简介
SQL:Structure Query Language(结构化查询语言)的缩写
2.2 MySQL的使用入门
2.2.1 SQL分类
- DDL(Data Definition Languages)语句: 数据定义语言,这些语句定义了不同的数据段、 数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter 等。
- DML(Data Manipulation Language)语句: 数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、update 和 select 等。
- DCL(Data Control Language)语句: 数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke 等。
2.2.2 DDL语句
启动MySQL服务后用mysql -u[username] -p
命令连接MySQL服务器 :
在以上命令行中,mysql 代表客户端命令,-u 后面跟连接的数据库用户,-p 表示需要输入密码。
-
创建数据库:
CREATE DATABASE dbname;
“Query OK”表示上面的命令执行成功
“1 row affected”表示操作只影响了数据库中一行的记录
“0.00 sec”则记录了操作执行的时间。
如果已经存在这个数据库,系统会提示:
查询系统中有哪些数据库:SHOW DATABASES;
选择要操作的数据库:USE dbname;
查询数据库中哪些表:SHOW TABLES;
-
删除数据库:
DROP DATABASE dbname;
p.s. 数据库删除后,下面的所有表数据都会全部删除,所以删除前一定要仔细检查并做好相应备份. -
创建表:
CREATE TABLE tablename (column_name_1 column_type constraints, column_name_1 column_type constraints ... column_name_n column_type constraints)
MySQL 的表名是以目录的形式存在于磁盘上,所以表名的字符可以用任何目录名允许 的字符;
column_name 是列的名字;
column_type 是列的数据类型;
contraints 是这个列的约束条件。
创建emp表:
查看表的定义:DESC tablename;
查看创建表的SQL语句:SHOW CREATE TABLE tablename;
除了可以看到表定义以外,还可以看到表的 engine (存储引擎) 和 charset(字符集)等信息。 -
删除表:
DROP TABLE tablename;
-
修改表:
(1) 表结构的更改一般都使用 alter table 语句:ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
修改表 emp 的 ename 字段定义,将 varchar(10)改为 varchar(20):
(2)增加表字段:ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]
表 emp 上新增加字段 age,类型为 int(3):
(3)删除表字段:ALTER TABLE tablename DROP [COLUMN] col_name
将字段 age 删除掉:
(4)字段改名:ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition[FIRST|AFTER col_name]
(5)修改字段排列顺序:
默认 ADD 增加的新字段是加在表的最后位置;
CHANGE/MODIFY 默认都不会改变字段的位置;
将新增的字段 birth date 加在 ename 之后:
修改字段 age,将它放在最前面:
(6)改表名:ALTER TABLE tablename RENAME [TO] new_tablename
2.2.3 DML 语句
-
插入记录:
INSERT INTO tablename (field1,field2,......fieldn) VALUES(value1,value2,......valuesn);
批量插入:INSERT INTO tablename (field1, field2,......fieldn) VALUES (record1_value1, record1_value2,......record1_valuesn), (record2_value1, record2_value2,......record2_valuesn), ...... (recordn_value1, recordn_value2,......recordn_valuesn) ;
-
更新记录:
UPDATE tablename SET field1=value1,field2.=value2,......fieldn=valuen [WHERE CONDITION]
批量更新多个表的字段:UPDATE t1,t2...tn set t1.field1=expr1,tn.fieldn=exprn [WHERE CONDITION]
p.s. 多表更新的语法更多地用在了根据一个表的字段,来动态的更新另外一个表的字段 -
删除记录:
DELETE FROM tablename [WHERE CONDITION]
批量删除多个表的数据:DELETE t1,t2...tn FROM t1,t2...tn [WHERE CONDITION]
如果 from 后面的表名用别名,则 delete 后面的也要用相应的别名,否则会提示语法错误。
p.s. 不管是单表还是多表,不加 where 条件将会把表的所有记录删除,所以操作时一定要小心。 -
查询记录:
SELECT * FROM tablename [WHERE CONDITION]
其中“*”表示要将所有的记录都选出来。
(1)查询不重复记录:distinct
(2)条件查询:where
(3)排序和限制:SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC] , field2 [DESC|ASC],......fieldn [DESC|ASC]]
DESC 和 ASC 是排序顺序关键字,DESC 表示按照字段进行降序排列,ASC 则表示升序列,如果不写此关键字默认是升序排列。
如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序,以此类推。如果只有一个排序字段,则这些字段相同的记录将会无序排列。
对于排序后的记录,如果希望只显示一部分,而不是全部,这时,就可以使用 LIMIT 关键字来实现:SELECT ......[LIMIT offset_start,row_count]
(4)聚合:SELECT [field1,field2,......fieldn] fun_name FROM tablename [WHERE where_contition] [GROUP BY field1,field2,......fieldn [WITH ROLLUP]] [HAVING where_contition]
HAVING 关键字表示对分类后的结果再进行条件的过滤
p.s. having 和 where 的区别在于 having 是对聚合后的结果进行条件的过滤,而 where 是在聚合前就对记录进行过滤,如果逻辑允许,我们尽可能用 where 先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用 having进行再过滤。
(5)表连接:inner join、left join、 right join
(6)子查询:用于子查询的关键字主要包括 in、not in、=、!=、exists、not exists 等
表连接在很多情况下用于优化子查询
(7)记录联合:- union:是将 UNION ALL 后的结果进行一次 DISTINCT,去除重复记录后的结果
- union all:把结果集直接合并在一起
2.2.4 DCL语句
DCL 语句主要是 DBA 用来管理系统中的对象权限时所使用