mysql

DQL、DML、DDL、DCL的概念与区别

SQL(Structure Query Language)语言是数据库的核心语言。

SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。

1. 数据查询语言DQL

数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE

子句组成的查询块:

SELECT <字段名表>

FROM <表或视图名>

WHERE <查询条件>

2 .数据操纵语言DML

数据操纵语言DML主要有三种形式:

1) 插入:INSERT

2) 更新:UPDATE

3) 删除:DELETE

3. 数据定义语言DDL

数据定义语言DDL用来创建数据库中的各种对象-----表、视图、

索引、同义词、聚簇等如:

CREATE TABLE/VIEW/INDEX/SYN/CLUSTER

| | | | |

表 视图 索引 同义词 簇

DDL操作是隐性提交的!不能rollback

4. 数据控制语言DCL

数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制

数据库操纵事务发生的时间及效果,对数据库实行监视等。如:

1) GRANT:授权。

2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。

回滚---ROLLBACK

回滚命令使数据库状态回到上次最后提交的状态。其格式为:

SQL>ROLLBACK;

3) COMMIT [WORK]:提交。

在数据库的插入、删除和修改操作时,只有当事务在提交到数据

库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看

到所做的事情,别人只有在最后提交完成后才可以看到。

提交数据有三种类型:显式提交、隐式提交及自动提交。下面分

别说明这三种类型。

(1) 显式提交

用COMMIT命令直接完成的提交为显式提交。其格式为:

SQL>COMMIT;

(2) 隐式提交

用SQL命令间接完成的提交为隐式提交。这些命令是:

ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,

EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。

(3) 自动提交

若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,

系统将自动进行提交,这就是自动提交。其格式为:

SQL>SET AUTOCOMMIT ON;

数据查询语言DQL

1、创建一个数据库

create database 数据库名;    //建立一个数据库

create database 数据库名 default charset utf8 collate utf8_general_ci;    //建立一个数据库并制定编码格式

在哪一个数据库下创建表首先需要切换到此数据库下

use 数据库名;    //使用某个指定的数据库

2、创建一个表

语法:

create table 表名称(字段1 类型,字段2 类型); //在一个数据库中创建一个表

create table hero_table ( id int,name varchar(10));    //创建表

//创建表并增加约束

CREATE TABLE 表名称 (

      字段1 类型1 约束1 约束1,

      字段2 类型2 约束2 约束2

);

//创建表并增加约束

CREATE TABLE hero_table4 (

      id INT(11) NOT NULL PRIMARY KEY,

      NAME VARCHAR(10) NOT NULL UNIQUE KEY

)

数据类型:


mysql_第1张图片
数值类型


mysql_第2张图片
日期类型


mysql_第3张图片
字符串类型

alter关键字

1、添加字段

ALTER TABLE 表名称 ADD 字段名 字段约束

ALTER TABLE table_name

ADD column_name datatype

ALTER TABLE 表名称 ADD COLUMN 字段名 字段约束

2、添加索引

    ALTER TABLE 表名称 ADD INDEX 索引名称 (字段名)

一 、索引原理

索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理:先定位到章,然后定位到该章下的一个小节,然后找到页数。相似的例子还有:查字典,查火车车次,飞机航班等

本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。


3、添加主键

    ALTER TABLE 表名称 ADD PRIMARY KEY (字段名)

    ALTER TABLE 表名称 ADD UNIQUE KEY (字段名)

4、添加外键约束

ALTER TABLE 需要添加外键表名称 ADD FOREIGN KEY 外键名(设为外键的字段) REFERENCES 被添加外键表名称(设为被添加外键的字段)

5、修改字段类型时要注意字段类型的兼容性及精度,除非该列全部数据为null

ALTER TABLE 表名称 CHANGE COLUMN NAME 修改字段 修改为字段类型

ALTER TABLE 表名称 MODIFY COLUMN 修改字段 修改为字段类型

6、修改与删除表中default

//设置default

ALTER TABLE 表名称 ALTER COLUMN 字段名 SET DEFAULT  '修改的值'

//删除default

ALTER TABLE 表名称 ALTER COLUMN 字段名 DROP DEFAULT

7、禁用和启用约束

//禁用约束

ALTER TABLE 表名称 DISABLE KEYS

//启用约束

ALTER TABLE 表名称 ENABLE KEYS

8、删除表字段、主键、索引、外键约束

//删除表字段

ALTER TABLE 表名称 DROP COLUMN 字段名

//删除主键

ALTER TABLE 表名称 DROP PRIMARY KEY

//删除索引

ALTER TABLE 表名称 DROP INDEX 索引的字段名

//删除外键约束

ALTER TABLE 表名称 DROP FOREIGN KEY 外键的字段名

9、修改表名

ALTER TABLE 修改前表名称 RENAME 修改后表名称


DML

l 用于增删改表中数据,DML是伴随TCL事务控制的。

INSERT语句用来给数据表增加记录,每次增加一条记录。所有的DML操作,需要再执行事务提交语句COMMIT才算真正确认了此操作。

演示:想testemp中插入一条记录

INSERT INTO testemp (id,name,gender) VALUES (1,'张三','M');

COMMIT;

更新表中的记录,需要配合WHERE子句使用,否则全表的数据都会被更新。

演示:更新testemp表中张三的ID为2

UPDATE testemp SET id=2 WHERE name='张三';

COMMIT;

clip_image008

同时修改两个类型:

UPDATE testemp SET id=5,name='王五' WHERE name='李四';

COMMIT;

删除表中的记录,和UPDATE一样,需要配合WHERE子句使用,不然会将全表数据删除。

演示:将testemp表中id为2的记录删除

DELETE FROM testemp WHERE id=2;

清空表:

DELETE FROM testemp;


SELECT

等值查询

-- 查看prod_id为BR01的行

SELECT

    *

FROM

    Products

WHERE

    prod_id = 'BR01'

模糊匹配

-- 查询prod_name 以1开头的行

SELECT

    *

FROM

    Products

WHERE

    prod_name LIKE '1%'

范围查询

范围查询一般会用到OR,IN。

除此之外还有一些操作符比如AND,>,<,<=,>=,<>,NOT等

示例1:查询金额(prod_price)大于9的商品

SELECT

    *

FROM

    Products

WHERE

    prod_price > 9

示例2:查询供应商id(vend_id)为BRS01或FNG01的商品

SELECT

    *

FROM

    Products

WHERE

    vend_id = 'BRS01' OR vend_id = 'FNG01'

SELECT

    *

FROM

    Products

WHERE

    vend_id IN ('BRS01' , 'FNG01')

这两种方法是相同的,性能也是相同的,非常差一般可以用UNION改写,来提高性能

UNION

UNION用于把两个或者多个select查询的结果集合并成一个,进行合并的两个查询,其SELECT列表必须在数量和对应列的数据类型上保持一致,默认会去掉两个查询结果集中的重复行,默认结果集不排序,最终结果集的列名来自于第一个查询的SELECT列表

可以将上面的OR与IN语句改为下面的形式可以提高性能

SELECT

    *

FROM

    Products

WHERE

    vend_id = 'BRS01'

UNION ALL SELECT

    *

FROM

    Products

WHERE

    vend_id = 'FNG01'

UNION会将结果去重,UNION ALL则不会去重复,所以一般UNION ALL性能高于UNION

ORDER BY

用来排序行,如果SELECT语句中没有ORDER BY子句,那么结果集中行的顺序是不可预料的

示例1:按价格排序(默认升序)

SELECT

    *

FROM

    Products

ORDER BY prod_price

示例2:按价格排序(降序使用DESC)

SELECT

    *

FROM

    Products

ORDER BY prod_price DESC

LIMIT

从结果集中选取行

示例1:按价格升序排列,只取第一行

SELECT

    *

FROM

    Products

ORDER BY prod_price

LIMIT 1

示例2:按价格升序排列,取2到4行

SELECT

    *

FROM

    Products

ORDER BY prod_price

LIMIT 3 OFFSET 1  --表示取3行,偏移量为1

SELECT

    *

FROM

    Products

ORDER BY prod_price

LIMIT 1 , 3 --表示取3行,偏移量为1

Group By

分组,Group By必须在WHERE之后ORDER BY之前,

SELECT

    vend_id, COUNT(*) AS num_prods

FROM

    Products

GROUP BY vend_id

HAVING

WHERE子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分

组之前过滤数据, where条件中不能包含聚组函数,使用where条件过滤出特定的行。

HAVING子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚

组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。

SELECT

    vend_id, COUNT(*) AS num_prods

FROM

    Products

GROUP BY vend_id

HAVING COUNT(*) > 2

多表连接

示例1:WHERE子句完成内连接

也叫等值连接,主要是用where子句,基于两个表之间做相等测试。内联结相对于是查找出两张或两张以上表的交集

-- 查看产品名称,价格对应的供应商名称

SELECT

    vend_name, prod_name, prod_price

FROM

    Vendors,

    Products

WHERE

    Vendors.vend_id = Products.vend_id

示例2:内连接INNER JOIN

SELECT

    *

FROM

    Vendors

        INNER JOIN

    Products ON Vendors.vend_id = Products.vend_id

MySQL默认的JOIN是INNER JOIN

示例3:自然连接NATURAL JOIN

自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果

SELECT

    *

FROM

    Vendors

        NATURAL JOIN

    Products

INNER JOIN与NATURAL JOIN有一些不同, INNER JOIN返回的所有列,包括值相等的列,比如这里例子是利用两个表中 vend_id列进行联结,如果用 INNER JOIN会返回所有列,包括两个表的vend_id列,如果是使用NATURAL JOIN则会避免重复的列,也就是vend_id只显示一列

示例4:外连接

在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记录。 那么在相关联的结果集行中列显示为空值(NULL)

左外连接

SELECT

    *

FROM

    Products AS pro

        LEFT JOIN

    Vendors AS ven ON pro.vend_id = ven.vend_id

        AND ven.vend_state = 'CA'

右外连接

右外连接与左外连接可以相互转换。

SELECT

    *

FROM

    Vendors AS ven

        LEFT JOIN

    Products AS pro ON pro.vend_id = ven.vend_id

        AND ven.vend_state = 'CA'

多个连接条件要用AND


mysql_第4张图片
连接区别

常用函数:

数学函数

ABS(X):返回X的绝对值


mysql_第5张图片

MOD(N,M)或%:返回N被M除的余数。


mysql_第6张图片

CEILING(X):返回不小于X的最小整数值。

mysql_第7张图片

ROUND(X) :返回参数X的四舍五入的一个整数。


mysql_第8张图片



字符串函数

ASCII(str):返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。

mysql_第9张图片

CONCAT(str1,str2,...):返回来自于参数连结的字符串。如果任何参数是NULL,返回NULL。可以有超过2个的参数。

mysql_第10张图片

LENGTH(str):返回字符串str的长度。

mysql_第11张图片

LOCATE(substr,str):返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0.

mysql_第12张图片

INSTR(str,substr):返回子串substr在字符串str中的第一个出现的位置。

mysql_第13张图片

LEFT(str,len):返回字符串str的最左面len个字符。

mysql_第14张图片

RIGHT(str,len):返回字符串str的最右面len个字符。 

mysql_第15张图片

SUBSTRING(str,pos):从字符串str的起始位置pos返回一个子串。

select SUBSTRING('GHGHGH',5);

mysql_第16张图片

日期和时间函数 

WEEKDAY(date):返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。

mysql_第17张图片


你可能感兴趣的:(mysql)