首页 > 代码库 > mysql数据库操作

mysql数据库操作

入门语句:

1: 查看当前服务器下面,有哪些库(database)?

 答: show databases;

2: 创建一个数据库.

  答: create database DBName [字符集声明,整理声明];

   Create database test1 charset utf8 ;

3:删除数据库

 答:drop database test2;

 

4:修改数据库

 (只能修改字符集和整理集,简单,先自己看).

 能否修改数据库的名字?

:不能!

 

5:选择数据库

在进行表,行的相关操作时要先选择数据库.

: use DBName;   // 选择相应的数据库

6:如何查看一下库下面的所有表

:show tables;

 

7:如何删除一张表

:drop table tableName;

 

8:如何修改表名:

: rename table  oldName to newName;


9: 查看表结构

: desc tableName; //查看表结构

Create table 表名 (10: 最简单的建表语句

1名称 列1类型,

2名称 列2类型 (最后一列前不要加,‘)

)

这里先记住两种最常用列类型  int(整形) , varchar(字符串)

 

实际操作创建一张学籍表,2个字段, id, name,分别代表学号和姓名.

Create table stu (

Id int,

Name varchar(10)

);

 

 

11: 为留言本建一张表

Id,Title, name,content

 

12: 解决字符集问题:

默认建表一般用utf8, 而我们在windows下窗口是GBK,

因此,需要声明字符集.

Set names gbk;

 

发现的1小问题 

语句打错以后应该退出本语句,再继续打新语句.也可以打\c,退出本语句.

 

如何破解数据库的密码:

1:通过任务管理器或者服务管理,关掉mysqld(服务进程)

2:通过命令行+特殊参数开启mysqld

Mysqld --skip-grant-tables

3:此时,mysqld服务进程已经打开,并且,不需要权限检查.

4:mysql -uroot  无密码登陆服务器.

5: 修改权限表

  A: use mysql;

  B:update user set Password = password(‘11111‘) where User = ‘root‘;

  C:flush privileges;


6:通过任务管理器,或服务管理,关掉mysqld服务进程.

7:再次通过服务管理,打开mysql服务.

即可用修改后的新密码登陆.

 

 

增删改查基本语法学习

 

: insert 

Insert 3

1: 插入哪张表

2: 插入哪几列?

3: 这几列分别插入什么值?

 

Insert into TableName

(1,2.... n)

Values

(1,2,....n)

 

值 与 列,按顺序,一一对应

特殊: insert语句 允不允许不写列名

允许.

如果没有声明列明,则默认插入所有列.

因此,值应该与全部列,按顺序一一对应.

2:插入部分列

3:插入所有列 

:文中的set names gbk;是为了告诉服务器,客户端用的GBK编码,防止乱码.

 

4:插入所有的列的简单写法.


: Update 语句 

Update 4

改哪张表?

改哪几列的值?

分别改为什么值?

在哪些行生效?

 

语法:

Update 表名 

Set 

1 = 新值 1,

2 = 新值2,

n = 新值n.....

Where  expr

:


删除: delete

Delete 2

从哪张表删除数据?

要删除哪些行?

 

语法:

Delete from 表名 where  expr

: select 

查询3

1:查哪张表的数据?

2:查哪些列的数据?

3:查哪些行的数据?

 

语法:

Select 1, 2, 3,...n

From 表名

Where expr;


列类型学习

mysql三大列类型

数值型  

整型

   Tinyint/ smallint/ mediumint/int/ bigint 

小数型

   Float(D,M),decimal(D,M)

 

字符串型 

Char(M)

Varchar(M)

Text 文本类型

 

日期时间类型

Date 日期

Time 时间

Datetime 时间时间类型

Year 年类型

 


整型系统的可选参数 : XXint(M)  unsigned zerofill

: age tinyint(4) unsigned ,或者  stunum smallint(6) zerofill;

Unsigned: 代表此列为无符号类型会影响到列的存储范围. (范围从0开始)

(不加unsinged, 则该列默认是有符号类型,范围从负数开始)

Zerofill: 代表0填充如果该数字不足参数M则自动补0, 补够M.

1: 如果没有zerofill属性单独的参数M,没有任何意义.

2:如果设置某列为zerofill,则该列已经默认为 unsigned,无符号类型.

 

 

小数型: float(M,D),浮点型, decimal(M,D),定点型

Float(M,D):浮点小数代表可存储一共M(不含小数点), 其中小数点后D

Decimal(M,D): 定点小数, M,D的意义同上.

 


空间上的区别:

Float(M,D), M<=23, 4个字节, 24 <=M <=53, 8个字节

Decimal () ,8个字节.

 

区别: decimalfloat精度更高适合存储货币等要求精确的数字,

见下例:


Mysql 字符串类型

Char 定长类型

Char(M)  , M 代表宽度, 0<=M<=255之间

:Char(10)  ,则能输入10个字符.

 

Varchar 变长类型

Varchar(M), M代表宽度, 0<=M<=65535(ascii字符为例,utf822000左右)

 

类型

类型

宽度

可存字符

实存字符(i<=M)

实占空间

利用率

Char

M

M

i

M

i/M <= 100%

Varchar

M

M

i

i字符+(1-2)字节

i/(i+1-2) < 100%

 

0000000000

00\0\0\0\0\0 (char,如果不够M个字符,内部用空格补齐,取出时再把右侧空格删掉)  

:这意味着,如果右侧本身有空格,将会丢失.

 

Varchar(10)

[2]张三

[3]二麻子

[4]司马相如

 

Char(8)

00000000

‘Hello   ‘

‘hello ‘

Char(M)如何占据M个字符宽度?

如果实际存储内容不足M,则后面加空格补齐.

取出来的时候再把后面的空格去掉.(所以,如果内容最后有空格,将会被清除).

 

 

速度上定长速度快些
charvarchar型的选择原则:

1:空间利用效率四字成语表, char(4), 

个人简介,微博140, varchar(140)

2:速度

用户名: char

 

 

Char 与 varchar相关实验


Text : 文本类型,可以存比较大的文本段,搜索速度稍慢.

因此,如果不是特别大的内容,建议用char,varchar来代替.

Text 不用加默认值 (加了也没用).

 

时间戳

1970-01-01 00:00:00 到当前的秒数

一般存注册时间,商品发布时间等,并不是用datetime存储,而是用时间戳.

因为datetime虽然直观,但计算不便.


Select 5种子句详解

1:where子句  条件查询

 

查出一张表的所有行,所有列

Select * from tableName;

 

查出一张表的所有行,部分列.

Select id,name,salary from tableName

 

查出一张表的所有列,部分行(id >=2 的行)

Select * from tableName where id >=2;


模糊查询:

案例:想查找"诺基亚"开头的所有商品

Like->

 

% --> 通配任意字符

‘_‘ --> 单个字符


Limit 在语句的最后起到限制条目的作用

 

Limit [offset,] N

Offset: 偏移量

N: 取出条目

Offset,如果不写,则相当于  limit 0,N

思考取出每个栏目下的最贵的商品???

20分钟,1select语句实现烤肉一顿


良好的理解模型

Where 表达式  ,把表达式放在行中,看表达式是否为真

理解成变量,可以运算

取出结果可以理解成一张临时表


子查询

Where型子查询指把内层查询的结果作为外层查询的比较条件.

典型题:查询最大商品,最贵商品

From 型子查询把内层的查询结果当成临时表,供外层sql再次查询

典型题:查询每个栏目下的最新/最贵商品

Exists子查询 把外层的查询结果,拿到内层,看内层的查询是否成立.

典型题查询有商品的栏目

 

 

 

Union: 联合

作用2次或多次查询结果合并起来

要求两次查询的列数一致

推荐查询的每一列,相对应的列类型也一样.

 

可以来自于多张表

多次sql语句取出的列名可以不一致,此时,以第1sql的列名为准

 

 

如果不同的语句中取出的行有完全相同(每个列的值都相同),

那么相同的行将会合并.(去重复)

 

如果不去重复,可以加all来指定

 

如果子句中有order by ,limit, 须加(), 推荐放到 所有子句之后,--对最终合并后的结果来排序.

 

在子句中, order by 配合limit使用才有意义如果order by  不配合limit使用会被语法分析器优化分析时,去除.

一张表,就是一个集合一行数据是集合的一个元素.

理论上讲:不可能存在完全相同的两个行但是表中可以完全相同的两行,

因为 表内部有一个rowid.

集合相乘笛卡尔积

其实就是两个集合的完全组合.

 

设集合个元素 , M个元素各不相同.

设集合B ,N个元素, N个元素各不相同 

 

A*B, 得到的积,M*N个元素,不可能重复.

 

 

A,9B10,

两表相乘有 9* 10, 90.

 

 

左连接,右连接,内连接

 

 

左连接: left

Select 1,2,N from 

tableA   left  join tableB

On tableA.列 = tableB    [此处表连接成一张大表,完全当成普通表看]

Where group , having...照常写

 

 

右连接: right

Select 1,2,N from 

tableA   right  join tableB

On tableA.列 = tableB    [此处表连接成一张大表,完全当成普通表看]

Where group , having...照常写

 

内连接: inner

Select 1,2,N from 

tableA   inner  join tableB

On tableA.列 = tableB    [此处表连接成一张大表,完全当成普通表看]

Where group , having...照常写

 

 

左右连接:

以左表为准去右表找匹配数据,找不到匹配,NULL补齐.

 

如何记忆:

1:左右连接可以相互转化.

2: 可以把右连接转换为左连接来使用(并推荐使用左连接代替右连接,兼容性好一些)

 

 

站在 B的左边,   ====> B站在A的右边

A left join B ====> B right join A

 

 

内连接查询左右表都有的数据,不要左/右中 NULL的那一部分.

内连接是  左,右连接的交集.

 

思考:能否查出左右连接的并集呢?

:目前不能,目前的mysql不支持外连接. Outer join

可以用Union来达到目的.

 

练习题:

1:goods,category,brand,3表连接查询,得出以下字段

goods_id

Cat_id

Cat_name

Brand_id

Brand_name

Goods_name













 

 

2:根据给出的表结构按要求写出SQL语句。

Match 赛程表

字段名称

字段类型

描述

matchID

int

主键

hostTeamID

int

主队的ID

guestTeamID

int

客队的ID

matchResult

varchar(20)

比赛结果,如(2:0

matchTime

date

比赛开始时间

Team 参赛队伍表

字段名称

字段类型

描述

teamID

int

主键

teamName

int

队伍名称

 

MatchhostTeamIDguestTeamID都与Team中的teamID关联

查出 2006-6-2006-7-1之间举行的所有比赛,并且用以下形式列出:

拜仁  2不来梅 2006-6-21

 

 

3 2 2:0 

2:5 1:2

 

3: 国安

2: 申花

5: 红牛


回顾建表语句

Create table 表名 (

列名称 列类型 [列属性] [默认值], ----> 列声明

列名称 列类型 [列属性] [默认值],

列名称 列类型 [列属性] [默认值]

) charset = utf8/gbk/...

 

表增加列,修改列,删除列

 

增加列:

Alter table 表名  add  列声明

增加的列默认是在表的最后一列

 

可以用after 来声明新增的列在哪一些后面.

Alter table 表名 add 列声明 after flower

 

如果新增放在最前面,怎么做?

Alter table 表名 add 列声明 first

 

 

修改列:

Alter table 表名 change 被改变的列名 列声明

 

 

删除列:

Alter table 表名 drop 列名;

 


视图: view

 

查询每个栏目最贵商品 --->

Select goods_id,goods_name,shop_price from goods order by cat_id asc ,shop_price desc

查询结果 当成一张表看

 

如果某个查询结果出现的非常频繁,也就是,拿这个结果当做进行子查询出现的非常频繁,

Create table g2 like goods;

Insert into g2 select ........

上面两句,是想保存一个查询结果到表里面供其他查询用.

 

视图的定义:

视图是由查询结果形成的一张虚拟表.

 

视图的创建语法:

Create view 视图名 as  select 语句;

 

视图的删除语法:

Drop view