代码(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.