目录

数据库学习笔记

数据库学习笔记

数据库基础

设计原型——》数据库建模——》编写后台程序

MySQL

创建数据库

https://i-blog.csdnimg.cn/direct/5b1c286d80704303865bfdf19c6228e1.png

进入数据库

mysql -u root -p

查看数据库

show databases;

创建

game

数据库

create database game

删除数据库

drop database game

退出数据库

quit/exit

创建表

关键字常用大写

创建表

use game

create table player(

id INT,

name VARCHAR(100),

level INT,

exp INT,

gold DECIMAL(10,2)

)

查看表的结构

DESC player;

修改表的结构

ALTER table player MODIFY COLUMN name VARCHAR(100);

ALTER TABLE player RENAME COLUMN NAME to nick_name; 修改字段名

ALTER TABLE player add COLUMN last_login datetime; 添加字段名

ALTER TABLE player DROP COLUMN last_login; 删除字段

删除表

DROP TABLE player;

数据的增删改查

插入一行数据

INSERT INTO player (id,NAME,LEVEL,exp,gold)VALUE(1,‘zhangsan’,1,1,1);

查看数据

SELECT * FROM player;

约束:默认值,非空,唯一约束,主键约束(保证数据唯一性,不为空,只有一个主键),外键约束(保证数据的一致性,一个表的外键必须是一个表的主键)

修改数据

UPDATE player SET LEVEL = 2 WHERE NAME = ‘zhangsan’;

UPDATE player SET exp=0,gold=0;

删除数据

DELETE FROM player WHERE goal=1;

数据的导入导出

导出数据

将数据导入到game.sql文件中

mysqldump -u root -p password

数据库名

表名

game.sql

打开这个文件

cat game.sql

导入数据

mysqldump -u root -p password

数据库名

表名

< game.sql

常用语句

查找

SELECT *FROM player WHERE level>1 AND level <6

SELECT *FROM player WHERE level>1 OR level <6

SELECT *FROM player WHERE LEVEL NOT IN (1,3,5)

SELECT *FROM player WHERE LEVEL BETWEEN 4 AND 8

SELECT *FROM player WHERE NAME LIKE '

%’

%

任意多个字符,

_

任意一个字符

正则表达式

https://i-blog.csdnimg.cn/direct/0590dbc38520476581c4ca7cc7d1e521.png

查找第一个字符是王且只有两个字的人

SELECT *FROM player WHERE NAME REGEXP ‘^

.$’

查找level为空的,没有填写

SELECT *FROM player WHERE LEVEL IS NULL

SELECT *FROM player WHERE LEVEL IS NOT NULL

填写了为空的值,空字符串

SELECT *FROM player WHERE email =’’;

排序 order by

SELECT *FROM player ORDER BY LEVEL;

根据

level

升序排序

SELECT *FROM player ORDER BY LEVEL DESC;

降序

SELECT *FROM player ORDER BY LEVEL DESC ,exp ASC;

level

降序,

level

相同按

exp

升序

聚合函数

https://i-blog.csdnimg.cn/direct/6d4046478ee248ebb0264c7d03af5289.png

SELECT COUNT(*) FROM player;

SELECT AVG(LEVEL) FROM player;

分组 group by

SELECT LEVEL ,COUNT(LEVEL) FROM player GROUP BY LEVEL

having:筛选分组后的数据

SELECT LEVEL ,COUNT(LEVEL) FROM player GROUP BY LEVEL HAVING COUNT(LEVEL)>1

SELECT SUBSTR(name,1,1),COUNT(SUBSTR(NAME,1,1)) FROM player

substr

是从

name

的第一个字符开始截取一个字符,即姓氏

GROUP BY SUBSTR(NAME,1,1)

根据姓氏进行分组

HAVING COUNT(SUBSTR(NAME,1,1))>=2

筛选姓氏数量大于等于

2

LIMIT 1

只显示第一名

limit 3

4

显示第

3

名到第

7

distinct 去重(去除重复的记录)

sex列中不重复的

SELECT DISTINCT sex FROM player;

union 合并查询结果集(并集)

把两条查询结果合并起来

SELECT * FROM player WHERE LEVEL BETWEEN 1 AND 5;

UNION

SELECT * FROM player WHERE exp BETWEEN 30 AND 40;

union all

来合并,不会去除两个结果中重复的记录

intersect 合并查询结果的交集

如果MYSQL 不支持intersect关键字 ,可以使用连接查询来替换实现 ( INNER JOIN)

except 差集

子查询

一个查询的条件需要用到另一个查询的结果

比如:想查询等级大于平均等级的玩家

SELECT *FROM player WHERE LEVEL > (SELECT AVG(LEVEL)FROM player);

SELECT LEVEL, ROUND((SELECT AVG(LEVEL) FROM player)) AS average,

round

是四舍五入

LEVEL - ROUND((SELECT AVG(LEVEL) FROM player)) AS diff

AS xx

是重命名列名

FROM player

子查询要用括号包裹

ROUND(SELECT AVG(LEVEL) FROM player) –

错误

ROUND((SELECT AVG(LEVEL) FROM player)) –

正确

使用子查询创建一个新的表

CREATE TABLE new_player SELECT * FROM player WHERE LEVEL<5

使用子查询插入数据

insert into

INSERT INTO new_player SELECT * FROM player WHERE LEVEL BETWEEN 6 AND 10;

判断是否存在

SELECT EXISTS (SELECT * FROM player WHERE LEVEL > 10)

表关联

INNER JOIN

LEFT JOIN 左连接

RIGHT JOIN 右连接

SELECT *FROM student

INNER JOIN course

ON student.Sno = course.Cno;

where

一样

表连接

=

笛卡尔积

条件过滤

索引

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

ON table_name(index_col_name,……)

创建索引

CREATE INDEX email_index ON FAST(email);

alter table fast add index name_index(name);

查看索引

SHOW INDEX FROM fast

删除索引

DROP INDEX email_index ON fast;

视图

创建视图

CREATE VIEW top10

AS

SELECT * FROM player ORDER BY LEVEL DESC LIMIT 10;

查看视图

SELECT * FROM top10;