数据库服务器操作:
登陆mysql服务器:
mysql -uroot -pdamin -h IP地址 -- 连接指定IP地址的用户名为root 密码为admin的mysql服务器;
net start MySQL --- 开启MySQL服务
net stop MySQL --- 关闭MySQL服务
Mysql 语句注释:--和#;
select * from grade;#这是注释
select * from grade;-- 这是注释
数据库操作:(dbname为数据库名)
创建数据库:create database dbname;
创建一个数据库并标明字符集:create database dbname character set GBK;
查询数据库:show database dbname;
查询创建数据库的语法:show create database dbname;
修改数据库:alter database dbname;
删除数据库:drop database dbname;
选择数据库:use dbname;
查询当前选择的数据库:select database();
数据表操作:(tbname为表名)----注: 在对一个表进行操作时需要选定一个数据库。则之后的操作都是在对选择的那个数据库中操作数据表;
MySQL常用的数据类型:(15种)
int --类似java中的int;
float --类似java中的float;
double --类似java中的double;
bigint --类似java中的long;
tinyint --类似java中的byte;
smallint --类似java中的short;
char(n) --n 表示字符串长度,定长的;一般用于固定长度的键;
varchaer(n) --n表示字符串长度,不定长的;一般用于不固定的键,如 name job...
bolb --表示比较大的二进制;常用于图片,视频,音乐等数据以二进制的形式存入数据库中。最大为4GB;
text --表示比较大的文本数据;常用于说明,文章等大量的字符数据。最大也为4GB;
date --日期数据;只有年月日 2017-5-6;
time --日期格式;有时分秒 17:20:30;
datetime --有年月日时分秒 2017-5-6 17:20:30;
timestamp --时间戳 显示效果跟datetime的效果差不多;可以设置TIMESTAMP类型的列自动更新时间为当前时间。
bit --只有0和1两个值。一般用于表示性别,布尔值等只有两个值的键;
主键约束:primary key 值必须唯一且不能为空 auto_increment 自动增长
唯一约束:unique 值必须唯一
非空约束:not null 值不能为空
外键约束:
外键: 用来通知数据库表与表字段之间的对应关系, 并让数据库帮我们维护这样关系的键就叫做外键
外键作用: 维护数据的完整性 一致性
添加外键: foreign key
创建表:
create table tbname (列名1 数据类型,列名2 数据类型.....);
create table uersname (id int,name varchar(10),gender bit);
查询表:
desc tbname; -- 表结构
show tbname; -- 当前数据库的所有表
show create table tbname; -- 创建表时的语句
修改表:
增加列:alter table add(列名1 列1数据类型,列名2 列2数据类型.....);--若只增加一列可不要括号;
修改列:alter table change [COLUMN] old_col_name new_col_name datatype;
--修改字段的类型:ALTER TABLE databaseName CHANGE age age INT;
删除列:alter table drop(列名1 列1数据类型,列名2 列2数据类型.....) ;--若只删除一列可不要括号;
修改表名:
alter table old_name rename to new_name;
rename table old_name to new_name;
修改列的顺序:alert table tbname modify col_name datatype after col_name;
修改表的字符集:alter table tbname character set utf8;
删除表:
drop table tbname;
数据表的数据操作:
增加数据:
insert into table tbname (列1名,列2名,列3名....) values (列1值,列2值,列3值....);
insert into tbname values (列1值,列2值,列3值....);
注意:
插入的数据应与字段的数据类型相同
数据的大小应在列的规定范围内
在values中列出的数据位置必须与被加入的列的排列位置相对应
字符串和日期格式的数据要用单引号引起来
如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表
删除数据:
delete from tbname [where ....]
-->delete from user where id="2";#删除user表id为2的数据;
修改数据:
update tbname set col_name1=expr1 [, col_name2=expr2 ...] [where...]
-->update user set name ="zs"where id = "2"; #修改user表中id为2的name改为zs;
查询数据:
1.基本查询: select [distinct(去重)] *|表头的属性(字段)[ as name ] from tbname;
distinct:去重;
ifnull(列名,取代null的值):ifnull(english,0) 给english列的null值用0来取代;
2.条件查询:select *|表头的属性(字段)[ as name ] from tbname where...
多个条件:and --> english >70 and math <80;
数值范围:in --> math in(40,60,90) #数学等于40等于60等于90的范围
--> math=40 or math=60 or math=90;
模糊:like -->select * from tbname where name like'童%';#查询出所有姓童的信息
3.排序查询:select id,name,math from grade order by math|别名 [asc|desc];#对数学成绩默认升序输出;
order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的列名。
asc 升序、desc 降序---不写则默认是升序
order by 子句应位于查询语句的结尾。
4.聚合函数:--对某一列操作;当其中数据存在null时不必考虑。在函数内部已经对null过滤掉了,将null不参与计算。
count(列名);--统计按条件查出的数据的个数;
sum(列名);-- 统计总和;
-->sum(chinese+math+english) 与 sum(chinese)+sum(math)+sum(english)
=>当数据存在null时值前者先计算括号内的值,其中null值也会参与计算。后者会对每一列的数值为null的值过滤掉再计算。
avg(列名);--统计平均数;
max(列名);--最大值;
min(列名);--最小值;
5.分组查询:
关键字 group by;-- 还有个升序排列的效果(只对数值才有升序效果)
group by 列名; 将一列看成一组
##where子句和having子句都可以进行过滤, 但是使用场景有所不同:
# where子句对分组之前的数据进行过滤,不能使用聚合函数和别名;
# having子句对分组之后的数据进行过滤,可以使用聚合函数和别名;
# 使用where子句的地方一般都可以用having替代,但是使用having的地方一般不能用where替代;当having和where同时使用时having不可替换where;
---以上的别名都是列名的别名(select后面的起的别名)----
select name 姓名 from student where name='张三' #这里的name不能用别名来做条件赛选;
select name 姓名 from student stud where stud.id = 2; #stud为student表的别名。这样可以,没毛病;
6.多表查询:
多表设计 :
1-*:在多的一方添加列保存一的一方的主键来作为外键保存两张表之间的关系----------------------------------------------------------(1对多)
1-1:在任意一方添加列保存另一方的主键作为外键来保存两张表之间的关系------------------------------------------------------------(多对1)
*-*:在一张第三方的表中分别保存两张表的主键作为外键来保存两张表之间的关系,可以把多对多的关系拆分成两个一对多的关系来理解------(多对多)
笛卡尔积查询:两张表相乘得出来的结果。如果左边表有m条记录,右边有n条记录,则查询出来的结果就是m*n条。这些查询结果中包含大量错误的结果,通常不会使用这种查询。
select * from tablename1,tablename2;---不建议使用
内连接查询:左边表有且右边表也有的记录。
select * from tablename1 inner join tablename2 ==>跟笛卡尔积查询出的结果一致;则需要加上过滤条件
select * from tablename1 inner join tablename2 on tablename1.id = tablename2.id;
左外连接查询:在内连接查询的基础上,加上左边表有而右边表没有的记录
select * from tablename1 left join tablename2 on tablename1.id = tablename2.id;
右外连接查询:在内连接查询的基础上,加上右边表有而左边表没有的记录。
select * from tablename1 right join tablename2 on tablename1.id = tablename2.id;
全外连接查询:在内连接查询的基础上,加上左边表有而右边表没有的记录 和 右边表有而左边表没有的记录。
select * from dept full join emp on emp.dept_id = dept.id; #mysql不支持全外连接查询
##通过union关键字来模拟全外连接查询
select * from tablename1 right join tablename2 on tablename1.id = tablename2.id;
union
select * from tablename1 left join tablename2 on tablename1.id = tablename2.id;