入门语句:
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个字节.
区别: decimal比float精度更高, 适合存储货币等要求精确的数字,
见下例:
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个,则后面加空格补齐.
取出来的时候, 再把后面的空格去掉.(所以,如果内容最后有空格,将会被清除).
速度上: 定长速度快些char与varchar型的选择原则:
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分钟,1个select语句实现, 烤肉一顿!
良好的理解模型
Where 表达式 ,把表达式放在行中,看表达式是否为真
列: 理解成变量,可以运算
取出结果: 可以理解成一张临时表
子查询
Where型子查询: 指把内层查询的结果作为外层查询的比较条件.
典型题:查询最大商品,最贵商品
From 型子查询: 把内层的查询结果当成临时表,供外层sql再次查询
典型题:查询每个栏目下的最新/最贵商品
Exists子查询 : 把外层的查询结果,拿到内层,看内层的查询是否成立.
典型题: 查询有商品的栏目
Union: 联合
作用: 把2次或多次查询结果合并起来
要求: 两次查询的列数一致
推荐; 查询的每一列,相对应的列类型也一样.
可以来自于多张表
多次sql语句取出的列名可以不一致,此时,以第1个sql的列名为准
如果不同的语句中取出的行, 有完全相同(每个列的值都相同),
那么相同的行将会合并.(去重复)
如果不去重复,可以加all来指定
如果子句中有order by ,limit, 须加(), 推荐放到 所有子句之后,即--对最终合并后的结果来排序.
在子句中, order by 配合limit使用才有意义, 如果order by 不配合limit使用, 会被语法分析器优化分析时,去除.
一张表,就是一个集合, 一行数据是集合的一个元素.
理论上讲:不可能存在完全相同的两个行, 但是表中可以完全相同的两行,
因为 表内部有一个rowid.
集合相乘, 笛卡尔积
其实就是两个集合的完全组合.
问: 设集合A 有M 个元素 , M个元素各不相同.
设集合B ,有N个元素, N个元素各不相同
A*B, 得到的积,有M*N个元素,不可能重复.
表A,有9行, 表B有10行,
两表相乘有 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: 可以把右连接转换为左连接来使用(并推荐使用左连接代替右连接,兼容性好一些)
A 站在 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 | 队伍名称 |
Match的hostTeamID与guestTeamID都与Team中的teamID关联
查出 2006-6-1 到2006-7-1之间举行的所有比赛,并且用以下形式列出:
拜仁 2:0 不来梅 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