mysql基础

登陆mysql的命令

mysql -r root -p

然后输入密码,问题是,这样常会出现无法登陆的情况

ERROR 1045 (28000): Access denied for user 'rocky'@'localhost' (using password: YES)
但是无意间发现另一个命令

mysql -u root -p

然后输入密码

select 语句

select语句可以从一个或者多个表中选取特定的行和列,结果通常是生成一个临时表。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并将结果放到一个临时的表中,这就是实现选择和投影 运算的一个形式。

语法格式

select  ****

from 子句

where 子句

group BY 子句

having 子句

order by 子句

limit 子句

定义别名

使用as子句来更改查询结果的别名

语法格式

select columnName as column_alias

 替换结果中的数据

select 学号,姓名,

(case

when  总学分 is null then “尚未选择”

when 总学分 < 50 then “不及格”

when 总学分 >= 50 and 总学分 < 60 then “及格”

when 总学分 >= 60 and 总学分 < 80 then “良好”

when 总学分 >= 80 and 总学分 < 100 then “优秀”

else “满分"

end as 等级

from xs

where 专业 = ”计算机“;

count函数

用于统计族中满足条件的行数或者总行数,

count(expression)

expression中值为空时,会不会跳过?会的,会被跳过,不计入总数

sum/avg函数

分别用于求表达式中所有值项的总和与平均值

sum与group by 一起,求各组的和

 

全连接

连接的第一种方式就是将各个表用逗号分隔,这样就是指定了全连接。新表是每个表的每个行都与其他表中的每行交叉可以产生所有的可能组合,也就是笛卡尔积

这样可能得到的行数可能为每个表中行数之积,

等值连接

在全连接的前提下,用where子句设置条件来将结果集减少为易于管理的大小,这样即为等值连接。

内连接

内连接是系统默认的,和等值连接是一样的。

高级

show profile for query num,查看每条数据的执行时间

分页查询

select * from tableName limit(offset ,size);

eg.

select * from tb_stu limit(10000,10);

 外连接

左连接,结果表中除了匹配行外,还包括左表有但是右表中不匹配的行,对于这样的行,从右表被选择的列设置为null

右连接,与列连接类似,相反

操作同一张表时,为了避免出现A1中的索引B1中没有,B1 中有的索引而A1中没有

所以可以用一个只查询所有索引的临时表来left joinA1和B这样就不会出现索引不全的问题了

 范围比较

 用于比较的关键子由两个between 和in

eg

查询xscj数据库中xs表中不在 '1991-02-12' 与 '2015-02-12'之间的学生的情况

select 学号,姓名,专业名,出生日期,from xs where 出生日期 NOT BETWEEN '1991-02-12' and '2015-02-12' ;

 select * from xs where 专业名 in ('计算机','通信','自动化');

等价于

 select * from xs where 专业名 = '计算机' ||专业名 = '通信' ||专业名 = '自动化';

 查找最大的ID

select max(id) from city

另一种方式 select id from City order by id desc  limit 1; -- 改变排序方式

 

为表添加完整性约束

alter table student add constraint fk_class_id  foreign key (class_id)
references class(c_id) on delete  CASCADE on UPDATE CASCADE;

这里,on delete  CASCADE on UPDATE CASCADE,同时添加了删除级联和更新级联的效果,如果只要其中一种功能那么写其中一个就可以了

有表A复制一张表,成为表A

create table studentB as select * from student;

注意:由建表语句可以看出,只是复制了表的结构,标的外检约束没有复制过来。

 

从表B向表A新增数据

insert into studentB   select * from student;

从表B向表A更新数据

update studentB as b join student as a
on b.s_id = a.s_id set b.class_id = a.class_id+1;

senior

select * from tb_stu where id>10000 limit(10);

在百万级数据分页时优选,但是这种做法有个前提是数据的完整性,数据的id必须都在,但实际是由的会被物理删除,对应的解决办法是不物理删除,执行逻辑删除,设置一个is_delete关键字

延迟关联技巧

select tb_stu.id ,name ,age from tb_stu inner join (select id from tb_stu from tb_stu limit(100000,10)) as tmpTable on tmpTable.id = tb_stu.id;

利用索引提高百万级数据的分页效果

 

sql中起名字的的建议

见名知意,比如约束,constraint emp2_id_not_null,意思是对emp2,这个表的id字段约束为notnull,同样在建立外键是应该是emp2_dept_id_fk.

 

posted @ 2015-10-08 22:43  牵牛花  阅读(245)  评论(0编辑  收藏  举报