sql语句

一.客户端命令介绍

mysql

  • 1、用于数据库的连接管理

1) 连接(略)
2) 管理:

#MySQL接口自带的命令
\h 或 help 或?      查看帮助
\G                  格式化查看数据(key:value)
\T 或 tee            记录日志(临时)  永久有效加入客户端配置文件中,不用重启
\c(5.7可以ctrl+c)   结束命令 5.6可以直接退出数据库
\s 或 status         查看状态信息
\. 或 source         导入SQL数据
\u或 use             使用数据库
\q 或 exit 或 quit   退出
system 或\!           敲命令

3)接收用户的SQL语句

  • 2、将用户的SQL语句发送到服务器

mysqldump

  • 1、备份数据库和表的内容

help命令的使用

mysql> help
mysql> help contents
mysql> help select
mysql> help create
mysql> help create user
mysql> help status
mysql> help show

source命令的使用

#在MySQL中处理输入文件:
#如果这些文件包含SQL语句则称为:
#1.脚本文件
#2.批处理文件
mysql> SOURCE /data/mysql/world.sql
#或者使用非交互式
mysql

mysqladmin命令的使用

01)“强制回应 (Ping)”服务器。
02)关闭服务器。
03)创建和删除数据库。
04)显示服务器和版本信息。
05)显示或重置服务器状态变量。
06)设置口令。
07)重新刷新授权表。
08)刷新日志文件和高速缓存。
09)启动和停止复制。
10)显示客户机信息。

#查看MySQL存活状态
#前提在配置文件中配置成可客户端
[client]
mysqladmin   ping #判断mysql命令是否存活,脚本中写绝对路径,否则不识别
[root@db01 ~]# mysqladmin -uroot -p123 ping
#查看MySQL状态信息
[root@db01 ~]# mysqladmin -uroot -p123 status
#关闭MySQL进程
[root@db01 ~]# mysqladmin -uroot -p123 shutdown
#查看MySQL参数
[root@db01 ~]# mysqladmin -uroot -p123 variables
#删除数据库
[root@db01 ~]# mysqladmin -uroot -p123 drop DATABASE
#创建数据库
[root@db01 ~]# mysqladmin -uroot -p123 create DATABASE
#重载授权表
[root@db01 ~]# mysqladmin -uroot -p123 reload
#刷新binlog日志
[root@db01 ~]# mysqladmin -uroot -p123 flush-log
#刷新缓存主机
[root@db01 ~]# mysqladmin -uroot -p123 reload
#修改口令
[root@db01 ~]# mysqladmin -uroot -p123 password

二.接收用户的SQL语句

  • 1.什么是SQL

结构化的查询语句

  • 2.SQL的种类

DDL:数据定义语言

库对象:库名字、库属性
开发规范:库名小写

sql语句_第1张图片

==比较危险,删库是默认删除小写,一般不设置==

创建库:create database|schema

#创建oldboy数据库
mysql> create database oldboy;
#创建OLDBOY数据库
mysql> create database OLDBOY;
#查看数据库
mysql> show databases;
#查看oldboy的创建语句(DQL)
mysql> show create database oldboy;
#查看创建数据库语句帮助
mysql> help create database
#创建oldboy数据库添加属性
mysql> create database  if not exists testa collate utf8_general_ci charset utf8;
#查询字符集,校验规则
mysql> show global variables like '%server';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| character_set_server | utf8            |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
2 rows in set (0.00 sec)

删库:drop database

#删除oldboy数据库
mysql> drop database oldboy;

修改定义库:alter database

#修改oldboy数据库属性
mysql> alter database oldboy charset gbk;
#查看oldboy的创建语句(DQL)
mysql> show create database oldboy;
#修改校验规则
mysql>alter database oldboy collate utf8_bin

表对象:列名、列属性、约束

创建表:create table (开发做)

#查看创建表语句帮助
mysql> help create table
#创建表
mysql> create table student(
sid INT,
sname VARCHAR(20),
sage TINYINT,
sgender ENUM('m','f'),
cometime DATETIME);

数据类型
int: 整数 -2^31 ~ 2^31 -1 (zerofill用0自动补全)
varchar:字符类型 (变长)
char: 字符类型 (定长)
tinyint: 整数 -128 ~ 128
enum: 枚举类型
datetime: 时间类型 年月日时分秒 8字节

timestamp 4字节 ,2038年过期

#创建表加其他属性
mysql> create table student(
sid INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT ‘学号’,
sname VARCHAR(20) NOT NULL COMMENT ‘学生姓名’,
sage TINYINT UNSIGNED COMMENT ‘学生年龄’,
sgender ENUM('m','f')  NOT NULL DEFAULT ‘m’ COMMENT ‘学生性别’,
cometime DATETIME NOT NULL COMMENT ‘入学时间’)chatset utf8 engine innodb;
#查看建表语句
mysql> show create table student;
#查看表
mysql> show tables;
#查看表中列的定义信息
mysql> desc student;#查看表
mysql> show create  table student;#查看注释

#正规建表
create table student2( sid int not null primary key auto_increment comment '学号',  sname varchar(10) not null comment '学生姓 名',  sage tinyint unsigned comment '学生年龄',  sgender enum('m','f') not null default 'm' comment '学生性别', datetime not null default now() comment '入学时间');

约束:

not null: 非空

auto_increment: 自增

primary key: 主键 (唯一,切非空)
unique key: 单独的唯一的(可以为空)
pk=uk+not null
default: 默认值
unsigned: 非负数
comment: 注释

删除表

#删除表
mysql> drop table student;

修改表定义:alter table (开发做)

#修改表名
mysql> alter table student rename stu;
#添加列和列定义
mysql> alter table stu add age int;
#添加多个列
mysql> alter table stu add test varchar(20),add qq int;
#指定位置进行添加列(表首)
mysql> alter table stu add classid varchar(20) first;
#指定位置进行添加列(指定列)
mysql> alter table stu add phone int after age;#注意前面加入的,
#删除指定的列及定义
mysql> alter table stu drop qq;
#修改列及定义(列属性)
mysql> alter table stu modify sid varchar(20);
#修改列及定义(列名及属性)
mysql> alter table stu change phone telphone char(20);
#mysql  5.7版本改密码
alter user root@'localhost' identified by '123';\

DCL:数据控制语言

针对权限进行控制

grant

#授权[email protected]用户所有权限(非炒鸡管理员)
mysql> grant all on *.* to root@'10.0.0.51' identified by 'oldboy123';
#怎么去授权一个炒鸡管理员呢?(priviliges)
mysql> grant all on *.* to root@'10.0.0.51' identified by 'oldboy123' with grant option;
#其他参数(扩展)
max_queries_per_hour:一个用户每小时可发出的查询数量
max_updates_per_hour:一个用户每小时可发出的更新数量
max_connetions_per_hour:一个用户每小时可连接到服务器的次数
max_user_connetions:允许同时连接数量

revoke

#查看库权限的
show grants for pril@'%';
#收回select权限
mysql> revoke select on *.* from root@'10.0.0.51';
#查看权限
mysql> show grants for root@'10.0.0.51';

DML:数据操作语言

操作表的数据行信息

insert

#基础用法,插入数据,前面不写,所有值一一对应,没有给null
mysql> insert into stu values('linux01',1,NOW(),'zhangsan',20,'m',NOW(),110,123456);
#规范用法,插入数据 (只需跟前面的key值相对应)
mysql> insert into stu(classid,birth.sname,sage,sgender,comtime,telnum,qq) values('linux01',1,NOW(),'zhangsan',20,'m',NOW(),110,123456);
#插入多条数据
mysql> insert into stu(classid,birth.sname,sage,sgender,comtime,telnum,qq) values('linux01',1,NOW(),'zhangsan',20,'m',NOW(),110,123456),
('linux02',2,NOW(),'zhangsi',21,'f',NOW(),111,1234567);

update

#不规范
mysql> update student set sgender='f';
#规范update修改
mysql> update student set sgender='f' where sid=1;
#如果非要全表修改,where后面先敲出来
mysql> update student set sgender='f' where 1=1;

delete

#不规范
mysql> delete from student;
#规范删除(危险),删除表里面的内容,drop删除表,必须接条件
mysql> delete from student where sid=3;#范围  sid>2 and sid<10
#DDL删除表,一下删除
mysql> truncate table student;
  • 1、使用伪删除

使用update代替delete

1)额外添加一个状态列

mysql> alter table student add status enum('1','0') default 1;#添加字段 status

2)使用update

mysql> update student set status='0' where sid=1;

3)应用查询存在的数据后面接条件

mysql> select * from student where status=1;
  • 2、使用触发器(了解)

trigger

DQL:数据查询语言

select:基础用法

#常用用法
mysql> select countrycode,district from city;
#查询单列
mysql> select countrycode from city;
#行级查询
mysql> select countrycode,district from city limit 2;
mysql> select id,countrycode,district from city limit 2,2;
#条件查询
mysql> select name,population from city where countrycode='CHN';
#多条件查询
mysql> select name,population from city where countrycode='CHN' and district='heilongjiang';
#模糊查询
mysql> select name,population,countrycode from city where countrycode like '%H%' limit 10;
mysql> select * from city where countrycode like 'H%';
mysql> select * from city where countrycode like '%H';
#排序查询(顺序)
mysql> select id,name,population,countrycode from city order by countrycode limit 10;
#排序查询(倒叙)
mysql> select id,name,population,countrycode from city order by countrycode desc limit 10;
#范围查询(>,<,>=,<=,<>(!=))
mysql> select * from city where population>=1410000;
#范围查询OR语句
mysql> select * from city where countrycode='CHN' or countrycode='USA';
#范围查询IN语句
mysql> select * from city where countrycode in ('CHN','USA');

#去重
mysql> select count(distinct(sgender)) from student2;

#group by + 聚合函数
#聚合函数种类:
#max()
#min()
#avg()
#sum()
#count()
#distinct()

#password()
mysqladmin -uroot -p123   password  1

#now()
#database()
+------------+
| database() |
+------------+
| world      |
+------------+
#此时此刻,我想吟诗一首
1.遇到统计想函数
2.形容词前groupby
3.函数中央是名词
4.列名select后添加

#方便查看相关联的字段
mysql> select * from world.city limit 1\G

#统计世界上每个国家的总人口数
select countrycode,sum(population) from city group by countrycode;
#统计中国各个省的人口数量(练习)
不加别名:
mysql> select District,sum(population) from city where countrycode='CHN' group by District order by sum(population);

别名:
mysql> select District as 省,sum(population) as 人口 from city where countrycode='CHN' group by 省 order by 人口;

#统每个国家的城市数量(练习)
select countrycode,count(name) from city group by countrycode order by count(name);

mysql> select countrycode,count(name) from city where countrycode='chn' group by countrycode order by count(name);

#and
mysql> select * from city where countrycode='CHN' and id>500;

#or
mysql> select * from city where countrycode='CHN' or countrycode='USA';
#in
mysql> select * from city where countrycode in ('CHN','USA');

####### 联合查询 效率比in和or高
mysql> select * from city where countrycode='CHN' union all select * from city where countrycode='USA';

三.字符集定义

  • 1.什么是字符集(Charset)

字符集:是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

sql语句_第2张图片

  • 2.MySQL数据库的字符集

1)字符集(CHARACTER)
2)校对规则(COLLATION)

  • 3.MySQL中常见的字符集

1)UTF8

2)LATIN1
3)GBK

  • 4.常见校对规则31)ci:大小写不敏感
    2)cs或bin:大小写敏感
  • 5.我们可以使用以下命令查看
mysql> show charset;
mysql> show collation;

四.字符集设置

#查询字符集,校验规则
mysql> show global variables like '%server';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| character_set_server | utf8            |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
2 rows in set (0.00 sec)

mysql> show global variables like '%server';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| character_set_server | utf8            |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
2 rows in set (0.00 sec)


mysql> mysql> select * from schemata;
+--------------+--------------------+----------------------------+------------------------+---
| CATALOG_NAME | SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQ
+--------------+--------------------+----------------------------+------------------------+---
| def          | information_schema | utf8                       | utf8_general_ci        | NU
| def          | linux50            | utf8                       | utf8_general_ci        | NU
| def          | lq                 | utf8                       | utf8_general_ci        | NU
| def          | mysql              | utf8                       | utf8_general_ci        | NU
| def          | performance_schema | utf8                       | utf8_general_ci        | NU
| def          | world              | utf8                       | utf8_general_ci        | NU
+--------------+--------------------+----------------------------+------------------------+---
6 rows in set (0.00 sec)

  • 1.操作系统级别
[root@db01 ~]# source /etc/sysconfig/i18n
[root@db01 ~]# echo $LANG
zh_CN.UTF-8

vim /etc/locale.conf
LANG="en_US.UTF-8"
  • 2.操作系统客户端级别(SSH)
  • 3.MySQL实例级别

方法1:在编译安装时候就指定如下服务器端字符集。

cmake . 
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \

方法2:在配置文件中设置字符集

修改配置文件
[mysqld]
character-set-server=utf8

临时
mysql>set character_set_server=utf8
  • 4.建库级别
mysql> create database oldboy charset utf8 default collate = utf8_general_ci;
  • 5.建表级别

    修改数据库的字符集

    alter database lq charset utf8;
    

    修改表的字符集

    alter table student charset utf8
    

    企业中修改某个库中的所有表字符集

    # mysqldump -uroot -p123 -B xx > /tmp/xx.sql
    # vim /tmp/xx.sql
    # :%s#gbk#utf8#g
    # mysql -uroot -p123 < /tmp/xx.sql
    
mysql>  CREATE TABLE `test` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

思考问题:如果在生产环境中,字符集不够用或者字符集不合适该怎么处理?

sql语句_第3张图片
sql语句_第4张图片


五.select的高级用法(扩展)

  • 1.多表连接查询(连表查询)
    sql语句_第5张图片

集合:
[zhang3,li4,wang5]

[50,70,80]

t1:
sid 1 2 3
sname zhang3 li4 wang5

t2:
sid 1 2 3
mark 50 70 80

范式: 减少数据冗余,防止产生一致性问题,把一个表作为一个原子,把一张表拆到不能再拆为止。(开发阶段设计规范)

例:根据两张表的内容查出张三的成绩

select t1.sname,t2.mark from t1,t2 where t1.sid=t2.sid and t1.sname=’zhang3’;

1.1传统连接(只能内连接,只能取交集)

#世界上小于100人的人口城市是哪个国家的?
select city.name,city.countrycode,country.name 
from city,country 
where city.countrycode=country.code 
and city.population<100;

1.2 NATURAL JOIN(自连接的表要有共同的列名字)

# 人口数量大于1000000的城市所在的国家,他们都说什么语言?
city.population,city.name,city.countrycode,countrylanguage.language

select city.population,city.name,city.countrycode,countrylanguage.language
from city,countrylanguage
where city.countrycode=countrylanguage.countrycode
and city.population > 1000000;

# 人口数量大于1000000的城市所在的国家,他们都说什么语言? (自连接)
select city.population,city.name,city.countrycode,countrylanguage.language
from city natural join countrylanguage
where city.population > 1000000;

前提条件:一定要有相同的列名字,并且列中的数据一致

1.3企业中多表连接查询(内连接)

#查世界上人口数量小于100的城市在哪个国家,城市和国家人口数量分别是多少?
select city.name,city.population,country.name,country.population
from city,country
where city.countrycode=country.code
and city.population<100;

select city.name,city.population,country.name,country.population
from city join country
on city.countrycode=country.code
where city.population<100;

#世界上人口数量小于100的城市在哪个国家,说的什么语言?
·A join B on 1 join C on 2 join D on 3·

select city.population,city.name,country.name,countrylanguage.language
from city,country,countrylanguage
where city.countrycode=country.code and countrylanguage.countrycode=country.code
and city.population < 100;

select city.population,city.name,country.name,countrylanguage.language
from city 
join country 
on city.countrycode=country.code
join countrylanguage
on countrylanguage.countrycode=country.code
where city.population < 100;

==建议==:小表在前,大表在后

1.4外连接(可以加判断)

#左外连接
mysql> select city.name as 城市名称,country.code as 国家代码,country.name as 国家名称  from city left join country  on city.countrycodde=country.code  and  city.population<100 limit 10;

#右外连接
mysql> select city.name as 城市名称,country.code as 国家代码,country.name as 国家名称  from city right join country  on city.countrycodde=country.code  and  city.population<100 limit 10;

1.5 UNION(合并查询)

#范围查询OR语句
mysql> select * from city where countrycode='CHN' or countrycode='USA';
#范围查询IN语句
mysql> select * from city where countrycode in ('CHN','USA');
替换为: 
mysql> select * from city where countrycode='CHN' 
union  all
select * from city where countrycode='USA' limit 10

union:去重复合并
union all :不去重复
使用情况:union

补充:清除多余的加密密码

mysql> use mysql

mysql> select password from user;
+-------------------------------------------+
| password                                  |
+-------------------------------------------+
| *E6CC90B878B948C35E92B003C792C46C58C4AF40 |
|                                           |
|                                           |
|                                           |
+-------------------------------------------+


#修改为空
mysql> update user set password=null where password='加密';
Query OK, 4 rows affected, 4 warnings (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 4
#刷新授权表
mysql> flush privileges;

你可能感兴趣的:(sql语句)