基础的SQL语法详解
#查看表结果
desc t_stu
#查看表结构
show create table t_stu
#修改表名
alter table t_stu_detail rename t_detail
#删除表结果
drop table t_detail
#修改表结构
alter table 表名 add 列/约束/索引
alter table 表名 drop 列/约束/索引
alter table 表名 modify/change列定义(包括列约束)
#增加一列
alter table t_stu add age int(11) [after/first] sex
#删除列
alter table t_stu drop age
#修改列类型
alter table 表名 modify 【column】 列名 数据类型;
alter table 表名 modify 【column】 列名 数据类型 after 某一列;
alter table 表名 modify 【column】 列名 数据类型 first;
#修改列名等
alter table 表名 change 【column】 列名 新列名 数据类型;
#增加主键约束
alter table 表名称 add 【constraint 约束名】 primary key (字段名);
alter table 表名称 add 【constraint 约束名】 primary key (字段名1,字段名2);#复合主键
#增加唯一键约束
alter table表名称 add 【constraint 约束名】 unique 【key】 (字段名);
alter table表名称 add 【constraint 约束名】 unique 【key】 (字段名1,字段名2);
#增加外键约束
alter table表名称 add 【constraint 约束名】 foreign key (从表字段名) references 主表名(主表被参照字段名);
#增加/删除缺省约束或非空约束
alter table 表名 modify 【column】 列名 数据类型 【default 默认值】 【not null】;
#增加索引
create index index_name on table_name (column_name,[column_name...]); 最左边的列最关键
dml:数据操纵语言(dml)dml用于插入、修改、删除数据记录
drl:drl的查询语言是select语句,可以包含5种子句:
依次是where、 group by、having、 order by、limit
mysql的运算符
(1)算术运算符:+ - * /(除也可以写成p) %(取模可以写成mod)
(2)比较运算符:= > >= < <= !=(不等于还可以写成<>)
(3)逻辑运算符:&&(逻辑与也可以写成and) ||(逻辑或也可以写成or) not(逻辑非)
(4)范围:表达式 between ... and ... (也可以写成 表达式>=... and 表达式 <=...)
表达式 not between ... and ...(也可以写成 表达式<... || 表达式 >...)
(5)集合:in (值,值,值...) not in(值,值,值...)
(6)模糊查询:like not like,通配符:%表示0-n个字符,_下划线代表一个字符
(7)位运算符:&(按位与) |(按位或) 注意:极少用,可忽略
(8)null值判断,is null 或 is not null,如果使用null=null,null<>null,null=0,null<>0,null=false等都不对
dcl:dcl用来控制的访问
in:等于任何一个
all:和子查询返回的所有值比较。例如:sal>all(1,2,3)等价于sal>1 && sal>2 && sal>3,即大于所有。
any:和子查询返回的任意一个值比较。例如:sal>any(1,2,3)等价于sal>1 or sal>2 or sal>3,即大于任意一个就可以。
exists:判断子查询是否有返回结果(不关心具体行数和内容),如果返回则为true,否则为false。
复制表(自学)
(1)拷贝表结构
create table newadmin like admin;
(2)拷贝表结构和数据(但约束与索引除外)
create table newadmin as ( select * from admin ) ;
(3)拷贝表结构+数据
create table newadmin like admin;
insert into newadmin select * from admin;
(4)跨数据库拷贝表
create table newadmin like shop.admin;
create table newshop.newadmin like shop.admin;
(5)拷贝一个表中其中的一些字段(指定新名),其中一些数据
create table newadmin as
(
select id, username as uname, password as pass from admin where id<10
) ;
(6)在创建表的同时定义表中的字段信息。
create table tt
(
eid int primary key auto_increment
)
as
(
select employee_id as eid,first_name,last_name,email from employees
);
复制数据(自学)
在 insert 语句中加入子查询。
不必书写 values 子句。
子查询中的值列表应与 insert 子句中的列名对应。
insert into emp2
select * from employees where department_id = 90;
或
insert into sales_reps(id, name, salary, commission_pct)
select employee_id, last_name, salary, commission_pct
from employees
where job_id like '%rep%';
数学函数
mod(x,y):返回x除以y以后的余数
sqrt(x)返回x的平方根
pow(x,y)、power(x,y)返回x的y次方
truncate(x,y)返回x保留到小数点后y位的值,之后舍去
round(x,y)保留x小数点后y位的值,单截取时要进行四舍五入
ceil(x)、ceiling(x)返回大于或等于x的最小整数
floor(x)返回小于或等于x的最大整数
字符串函数
char_length(s)返回字符串s的字符数
length(s)返回字符串s的长度,字节数
concat(s1,s2...)将字符串合并为一个字符串
concat_ws(x,s1,s2)将字符串合并为一个字符串,每个字符串之间要加x分隔
insert(s1,x,len,s2)用字符串s2替换s1的x位置开始长度为len的字符串
upper(s),ucaase(s)将字符串s的所有字母变成大写字母
lower(s)、lcase(s)将字符串s的所有字母变成小写字母
left(s,n)返回字符串s的前n个字符
right(s,n)回字符串s的后n个字符
lpad(s1,len,s2)字符串s2来填充s1的开始处,使字符串长度达到len
rpad(s1,len,s2)字符串s2来填充s1的结尾处,使字符串长度达到len
ltrim(s)去掉字符串s开始处的空格
rtrim(s)去掉字符串s结尾处的空格
trim(s)去掉字符串s开始和结尾处的空格
trim(s1 from s)去掉字符串s中开始处和结尾处的字符串s1
replace(s,s1,s2)将字符串s2替代字符串s中的字符串s1
substring(s,n,len)获取从字符串s中第n个位置开始长度为len的字符串
日期和时间函数
curdate(),current_date()返回当前日期
curtime(),current_time返回当前时间
now(),current_timestamp(),localtime(),sysdate(),localtimestamp()返回当前日期和时间
month(d)返回日期d中的月份值,1->12
monthname(d) 返回日期当中的月份名称,如janyary
dayofweek(d)日期d今天是星期几,1星期日,2星期一
dayname(d)返回日期d是星期几,如monday,tuesday
条件判断函数
if(expr,v1,v2)函数,如果表达式expr成立,返回结果v1;否则,返回结果v2。
ifnull(v1,v2)函数,如果v1的值不为null,则返回v1,否则返回v2
case
when e1 then v1
when e2 then v2
...
else vn
end
case表示函数开始,end表示函数结束。如果e1成立,则返回v1,如果e2成立,则返回v2,当全部不成立则返回vn,而当有一个成立之后,后面的就不执行了。
或
case expr
when e1 then v1
when e2 then v2
...
else vn
end
case表示函数开始,end表示函数结束。如果expr表达式的值为e1成立,则返回v1,如果为e2,则返回v2,当全部不成立则返回vn,而当有一个成立之后,后面的就不执行了。
经典问题:
1、在命令行出现乱码问题?
创建数据库时选择utf-8,但是windows窗口下是gbk,因此需要在命令行设置字符集 set names gbk;
是为了告诉服务器,客户端用的gbk编码,防止乱码
可以查看字符集
show variables like 'character_set_%';
2、退出当前错误语句?
语句打错以后退出本语句,再继续打新语句
也可以打\c,快捷退出本语句
3、如何数据库密码?安全模式登录
1、通过任务管理器或服务管理,关掉musqlid(服务进程)
2、通过命令行+特殊参数开启mysqlid
mysqlid --skip-grant-tables
3、此时,mysqlid服务进程已经打开,并且,不需要权限检查
4、mysql -uroot 无密码登录服务器
5、修改权限表
a: use mysql;
b: update user set password = password('123456') where user = 'root';
c: flush privileges;
6:通过任务管理器,关掉mysqld服务进程.
7:再次通过服务管理,打mysql服务。
8:即可用修改后的新密码登陆.
1、既复制表结构也复制表内容的sql语句:create table tab_new as select * from tab_old;
2、只复制表结构不复制表内容的sql语句:create table tab_new as select * from tab_old where 1=2;
3、不复制表结构,只复制内容的sql语句:insert into tab_new select * from tab_old;或者select vale1, value2 into table2 from table1