代码(1)

数据库:

创建数据库

CREATE DATABASE mysql_test;

选择数据库

USE db_name;

修改数据库(修改默认字符集和校对规则)

ALTER DATABASE mysql_test

DEFAULT CHARACTER SET gb2312

DEFAULT COLLATE gb2312_chinese_ci;

删除数据库

DROP DATABASE IF EXISTS mysqltest;

查看数据库

SHOW DATABASES;

创建和操纵表:

创建表

USE mysql_test;

CREATE TABLE customers(

cust_id INT NOT NULL AUTO_INCREMENT,

cust_name CHAR(50) NOT NULL;

cust_sex CHAR(1) NOT NULL DEFAULT 0,

cust_address CHAR(50) NULL,

cust_contact CHAR(50) NULL,

PRIMARY KEY(cust_id)

)ENGINE=InnoDB;

更新表

1.ADD

ALTER TABLE mysql_test.customers

ADD COLUMN cust_city CHAR(10) NOT NULL DEFAULT 'Wuhan' AFTER cust_sex;

2.CHANGE[COLUMN]

ALTER TABLE mysql_test.customers

CHANGE COLUMN cust_sex sex CHAR(1) NULL DEFAULT 'M';

3.ALTER[COLUMN]

ALTER TABLE mysql_test.customers

ALTER COLUMN cust_city SET DEFAULT 'Beijing';

4.MODIFY[COLUMN]

ALTER TABLE mysql_test.customers

MODIFY COLUMN cust_name CHAR(20) FIRST;

5.DROP[COLUMN]

ALTER TABLE mysql_test.customers

DROP COLUMN cust_contact;

6.RENAME[TO]赋予新的表名

ALTER TABLE mysql_test.customers

RENAME TO mysql_test.backkup_customers;

重命名表

RENAME TABLE mysql_test.backup_customers TO mysql_test.customers;

复制表

CREATE TABLE mysql_test.customers_copy

LIKE mysql_test.customers;

删除表

DROP TABLE IF EXISTS mysql_test.customers

查看表

显示表的名称

USE mysql_test;

SHOW TABLES;

显示表的结构

DESC mysql_test.customers;

表数据的基本操作:

插入表数据

使用insert语句插入表数据

INSERT VALUES

INSERT INTO mysql_test.customers

VALUES(901,'张三','F','北京市','朝阳区');

最好:

INSERT INTO mysql_test.customers(cust_id,cust_name,cust_sex,cust_address,cust_contact)

VALUES(0,'李四',DEFAULT,'武汉市',NULL);

INSERT SET

INSERT INTO mysql_test.customers

SET cust_name='李四',cust_address='武汉市',cust_sex=DEFAULT;

一次性插入两条语句

INSERT INTO mysql_test.customers(cust_address,cust_sex,cust_name)

VALUES('武汉市',DEFAULT,'李四'),

     ('北京市','F','张三');

 

INSERT SELECT

INSERT INTO mysql_test.customers(cust_id,cust_name,cust_sex,cust_address,cust_contact)

SELECT cust_id,cust_name,cust_sex,cust_address,cust_contact 

FROM mysql_test.customers_copy;

(为了防止插值出错,一般主键自己生成)

使用REPLACE语句插入表数据

REPLACE INTO mysql_test.customers(cust_id,cust_name,cust_sex,cust_address,cust_contact)

VALUES(901,'王五','M','广州市','越秀区');

(替换,主键不允许重复,replace语句将原数据替换)

删除表数据

单表删除

DELETE FROM mysql_test.customers

WHERE cust_name='王五';

多表删除

DELETE tb1,tb2 FROM tb1,tb2,tb3

WHERE tb1.id=tb2.id AND tb2.id=tb3.id;

使用TRUNCATE删除表数据

修改表数据

UPDATE修改单表数据

UPDATE mysql_test.customers

SET cust_address='武汉市';

WHERE cust_name='张三';

UPDATE修改多表数据

UPDATE tb1,tb2 SET tb1.name='李明',tb2.name='张亮'

WHERE tb1.id=tb2.id;

数据库的查询

选择指定的列

SELECT cust_name,cust_sex,cust_address

FROM mysql_test.customers;

SELECT * FROM mysql_test.customers;

定义并使用列的别名

SELECT cust_name,cust_address AS '地 址',cust_contact

FROM mysql_test.customers;

注意:列别名不允许出现在WHERE子句中

替换查询结果集中的数据

SELECT cust_name,

CASE

WHEN cust_sex='M' THEN '男'

ELSE '女'

END AS 性别

FROM mysql_test.customers;

计算列值

SELECT cust_name,cust_sex,cust_id+100

FROM mysql_test.custormers;

聚合函数

COUNT    求组中项数,返回INT类型整数

MAX      求最大值

MIN      求最小值

SUM      返回表达式中所有值的和

AVG      求组中值的平均值

STD或STDDEV返回给定表达式中所有值的标准值

VARIANCE 返回给定表达式中所有值的方差

GROUP_CONCAT返回由属于一组的列值连接组合而成的结果

BIT_AND  逻辑或

BIT_OR   逻辑与

BIT_XOR  逻辑异或

FROM子句与连接表

连接表

1.交叉连接cross join

SELECT * FROM tb1 CROSS JOIN tb2;

或SELECT * FROM tb1,tb2;

2.内连接inner join

3.相等连接equijoin

4.不等连接non-equijoin

5.自连接self-join

6.自然连接natural join

7.外连接outer join

1.左外连接

2.右外连接

WHERE子句

1.比较运算

=

<>         不等于

!=

<

<=

>

>=

<=>        不会返回UNKNOWN

2.字符串匹配

1.百分号

代表任何字符串,并且该字符串可出现任意次数(包括0次)

SELECT cust_id,cust_name FROM mysql_test.customers

WHERE cust_name LIKE '万%';

2.下划线

SELECT cust_id,cust_name FROM mysql_test.customers

WHERE cust_name LIKE '万_';

SELECT cust_address FROM mysql_test.customers

WHERE cust_address LIKE '%#_%' ESCAPE '#'

注意:使用关键字ESCAPE指定一个特殊字符'#',来改变下划线

'_'原有的特殊作用,使其在搜索过程中成为一个普通的字符。

3.文本匹配

1.基本字符匹配

SELECT DISTINCT cust_address FROM mysql_test.customers

WHERE cust_address LIKE '市';

不会出结果

 

SELECT DISTINCT cust_address FROM mysql_test.customers

WHERE cust_address LIKE '%市%';

 

SELECT DISTINCT cust_address FROM mysql_test.customers

WHERE cust_address REGEXP '市';

LIKE与REGEXP区别:LIKE用于匹配整个列,如果被匹配的字符串

在列值中出现,LIKE将不会找到他,相应的行也不会返回,除非

是使用通配符;而REGEXP是在列值内进行匹配,如果被匹配的文本

在列值中出现,REGEXP将会找到它,相应的行也会返回。

2.选择匹配

SELECT DISTINCT cust_address FROM mysql_test.customers

WHERE cust_address REGEXP '北京|武汉|上海';

3.范围匹配

[3-8],[b-g]等

4.特殊字符匹配

5.字符类匹配

6.重复匹配

*                 0或多个

+  1个或多个

?  0或一个

{n}  指定数目

{n,}  不少于指定数目

{n,m}             匹配数目的范围

SELECT cust_name FROM mysql_test.customers

WHERE cust_name REGEXP '[丽]{2}';

7.使用定位符匹配

^                 文本的开始

$  文本的结尾

[[:<:]]           词的开始

[[:>:]]           词的结尾

SELECT * FROM mysql_test.customers

WHERE cust_id REGEXP '^[8-9]';

4.判定范围

1.BETWEEN  AND

SELECT * FROM mysql_test.customers

WHERE cust_id BETWEEN 903 AND 912;

2.IN

SELECT * FROM mysql_test.customers

WHERE cust_id IN(903,906,908);

5.判断空值

SELECT cust_name FROM mysql_test.customers

WHERE cust_contact IS NULL;

6.子查询

1.结合关键字IN使用的子查询

2.结合比较运算符使用的子查询

3.结合关键字EXIST使用的子查询

 

GROUP BY子句与分组数据

SELECT cust_address,cust_sex,COUNT(*) AS '人数'

FROM mysql_test.customers

GROUP BY cust_address,cust_sex;

 

SELECT cust_address,cust_sex,COUNT(*) AS '人数'

FROM mysql_test.customers

GROUP BY cust_address,cust_sex

WITH ROLLUP;

WITH ROLLUP用于指定在结果集中不仅包含由GROUP BY子句分组后

的数据行,还包括各分组的汇总行,以及所有分组的整体汇总行

HAVING子句

HAVING子句与WHERE子句非常相似,但是仍然存在区别,如下:

1.WHERE子句主要用于过滤数据行,HAVING子句主要用于

过滤分组,即HAVING子句可基于分组的聚合值而不是特定行

的值来过滤数据。

2.HAVING子句中的条件可以包含聚合函数,而WHERE子句中则

不可以。

3.WHERE子句会在数据分组前进行过滤,HAVING子句则会在数据分组

后进行过滤。因而,WHERE子句排除的行不包含在分组中,这就有可能

改变计算值,从而影响HAVING子句基于这些值过滤掉的分组。

SELECT cust_name,cust_address

FROM mysql_test.customers

GROUP BY cust_address,cust_name

HAVING COUNT(*)<=3;

ORDER BY子句

SELECT cust_name,cust_sex FROM mysql_test.customers

ORDER BY cust_name DESC,cust_address DESC;

ORDER BY与GROUP BY的区别

ORDER BY                   GROUP BY

排序产生的输出             分组行,但输出可能不是分组的顺序

任意列都可以使用   只可能使用选择列或表达式列

不一定需要   若与聚合函数一起使用列或表达式,则必须使用

LIMIT子句

SELECT cust_id,cust_name FROM mysql_test.customers

ORDER BY cust_id

LIMIT 4,3

(查找从第五位客户开始的三位客户的信息)

SELECT cust_id,cust_name FROM mysql_test.customers

ORDER BY cust_id

LIMIT 3 OFFSET 4;

 

UNION语句与联合查询

SELECT cust_id,cust_name FROM mysql_test.customers

WHERE cust_sex='F'

UNION

SELECT cust_id,cust_name FROM mysql_test.customers

WHERE cust_address='北京市';

 

SELECT cust_id,cust_name FROM mysql_test.customers

WHERE cust_sex='F' OR cust_address='北京市';

区别如下:

1.在有些应用场景中,它们的执行性能会有所不同。

2.UNION ALL是UNION语句中的一种,它可以完成WHERE完成不来的工作。

如果需要每个条件的匹配行在最终的查询结果集中全部出现,并允许包含

重复行,则必须使用UNION ALL而不是WHERE.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(sql,代码)