欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基础的SQL语法详解

程序员文章站 2022-06-05 14:27:48
#查看表结果 desc t_stu #查看表结构 show create table t_stu #修改表名 alter table t_stu_detail rename t_detail #删除...

#查看表结果

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