MySQL05-- 客戶端工具及SQL語句

MySQL客戶端工具及SQL語句

一.客戶端命令介紹

mysqllinux

1.mysql客戶端命令sql

#MySQL接口自帶的命令
\h 或 help 或?      查看幫助
\G                  格式化查看數據(key:value)
\T 或 tee            記錄日誌
\c(5.7能夠ctrl+c)   結束命令
\s 或 status         查看狀態信息
\. 或 source         導入SQL數據
\u或 use             使用數據庫
\q 或 exit 或 quit   退出

help命令的使用shell

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

2.MySQLadmin客戶端管理命令數據庫

一、命令行管理工具vim

2. mysqldump: 備份數據庫和表的內容windows

3.source命令的使用緩存

#在MySQL中處理輸入文件:
#若是這些文件包含SQL語句則稱爲:
#1.腳本文件
#2.批處理文件
mysql> SOURCE /data/mysql/world.sql
#或者使用非交互式
mysql</data/mysql/world.sql

mysqladmin命令的使用服務器

01)「強制迴應 (Ping)」服務器。
02)關閉服務器。
03)建立和刪除數據庫。
04)顯示服務器和版本信息。
05)顯示或重置服務器狀態變量。
06)設置口令。
07)從新刷新受權表。
08)刷新日誌文件和高速緩存。
09)啓動和中止複製。
10)顯示客戶機信息。ide

#查看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:數據定義語言

庫對象:庫名字、庫屬性
開發規範:庫名,表名小寫(windows不區分大小寫,linux區分大小寫)

建立庫:create database|schema

#查看建立數據庫語句幫助
mysql> help create database
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    [create_specification] ...

create_specification:
    [DEFAULT] CHARACTER SET [=] charset_name
  | [DEFAULT] COLLATE [=] collation_name
  
#建立oldboy數據庫
mysql> create database oldboy;
#查看數據庫
mysql> show databases;
#建立oldboy數據庫添加屬性
mysql> create database testa charset utf8;
#建立特test1庫(避免數據庫已存在報錯,作好判斷)
mysql> create database if not exists zls;

#規範建立數據庫(作好判斷而且設置字符集形式utf8_general_ci)
mysql> create database if not exists test1 default character set utf8 default collate utf8_general_ci;

#查看庫的屬性  (DQL)
mysql> show create database test1;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| test1    | CREATE DATABASE `test1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+

改庫(alter)

#查詢字符集類型
mysql> use information_schema;
mysql> select * from collations;
+--------------------------+--------------------+-----+------------+-------------+---------+
| COLLATION_NAME           | CHARACTER_SET_NAME | ID  | IS_DEFAULT | IS_COMPILED | SORTLEN |
+--------------------------+--------------------+-----+------------+-------------+---------+
| utf8_general_ci          | utf8               |  33 | Yes        | Yes         |       1 |
| utf8_bin                 | utf8               |  83 |            | Yes         |       1 |
+--------------------------+--------------------+-----+------------+-------------+---------+
219 rows in set (0.00 sec)

#查看當前庫的字符集
mysql> select * from schemata;
+--------------+--------------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+--------------------+----------------------------+------------------------+----------+
| def          | information_schema | utf8                       | utf8_general_ci        | NULL     |
| def          | liqi               | utf8                       | utf8_general_ci        | NULL     |
| def          | mysql              | utf8                       | utf8_general_ci        | NULL     |
| def          | performance_schema | utf8                       | utf8_general_ci        | NULL     |
+--------------+--------------------+----------------------------+------------------------+----------+
10 rows in set (0.01 sec)

#查看oldboy的建立語句(DQL)
mysql> show create database oldboy;

#修改字符集類型
mysql> alter database oldboy charset gbk; 
Query OK, 1 row affected (0.00 sec) mysql> show create 

#修改校驗規則 
mysql> alter database test1 collate utf8_bin;
Query OK, 1 row affected (0.01 sec)

#查詢mysql客戶端和服務端字符集校驗規則
mysql> show global variables like '%server';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| character_set_server | utf8            |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
2 rows in set (0.01 sec)

mysql> show 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;

對象:列名、列屬性、約束

建立表: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

varchar:字符類型 (變長)

zerofill: 自動補0

char: 字符類型 (定長)

tinyint: 整數 -128 ~ 128

enum: 枚舉類型

datetime: 時間類型 年月日時分秒

#建立表加其餘屬性  (大小寫均可以)
create table student2( 
sid int not null primary key auto_increment comment '學號', sname var char(10) not null comment '學生姓名', 
sage tinyint unsigned comment '學生年齡', 
sgender enum('m','f') not null default 'm' comment '學生性別', 
cometime datetime not null default NOW() comment '入學時間');
#查看建表語句
mysql> show create table student2;
#查看錶
mysql> show tables;
#查看錶中列的定義信息
mysql> desc student;

數據屬性

not null: 非空

primary key: 主鍵(惟一且非空的)

auto_increment: 自增(此列必須是:primary key或者unique key)

unique key: 單獨的惟一的(能夠爲空)

pk=uk+not null

default: 默認值

unsigned: 無符號,和數字結合用就是非負數

comment: 註釋

刪除表drop

#刪除表
mysql> drop table student;

修改表定義:alter table (開發作)*

#修改表名student爲stu
mysql> alter table student rename stu;
#添加列和列定義
mysql> alter table stu add age int;
#添加多個列,2
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);

DCL:數據控制語言

針對權限進行控制

grant

#受權root@10.0.0.51用戶全部權限(非超級管理員)
mysql> grant all on *.* to root@'10.0.0.51' identified by '123';
#受權普通用戶
grant all privileges on *.* to pri2@'%' identified by '1';
#怎麼去受權一個超級管理員呢?
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(收回權限)

#收回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 student2 values(null,'qls',18,'m',now()); 

#注意:只須要給前面的key添加value,前面key值的順序能夠隨意,後面value必須對應 
mysql> insert into student2(sname,sage,sgender) values('zls',18,'m'); 
mysql> insert into student2(sage,sname,sgender) values(18,'zls','m'); 
#插入多條數據
mysql> insert into student2(sname,sage,sgender) values('zls',18,'m'),('qls',18,'f');

update(改)

#不規範
mysql> update student set sgender='f';
#規範update修改
mysql> update student set sgender='f' where sid=1;
#若是非要全表修改
mysql> update student set sgender='f' where 1=1;

delete(刪)

#不規範
mysql> delete from student;
#規範刪除(危險)
mysql> delete from student where sid=3;
#DDL刪除表
mysql> truncate table student;

使用update代替delete作僞刪除

1)額外添加一個狀態列

mysql> alter table student add status enum('1','0') default 1;

2)使用update

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

3)應用查詢存在的數據

mysql> select * from student where status=1;

DQL:數據查詢語言

select:基礎用法

#經常使用用法
mysql> select countrycode,district from city;
#查詢city表中的全部內容 
mysql> select * from city;
#查詢單列  
mysql> select countrycode from city;
#行級查詢,limit(翻頁功能)
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 * from city where countrycode='chn' and population>999999;
mysql> select name,population from city where countrycode='CHN' and district='heilongjiang';
#範圍查詢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 like 'H%'; 
mysql> select * from city where countrycode like '%H'; 
mysql> select * from city where countrycode like '%H%';
mysql> select name,population,countrycode from city where countrycode like '%H%' limit 10;
#排序查詢(順序)
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;

函數用法

#group by + 聚合函數 
#聚合函數種類: 
#max() 最大值
#min()  最小值
#avg() 平均值
#sum() 相加
#count()  計數
#distinct() 去重
#password() 查密碼
#now() 當前時間
#database() 查庫

總結:

1.遇到統計想函數
2.形容詞前group by
3.函數中央是名詞
4.列名select後添加

例子:

#把原密碼123改成1
[root@db01 ~]# mysqladmin -uroot -p123 password '1';
#查用戶密碼
mysql> select user,password from mysql.user;
+------+-------------------------------------------+
| user | password                                  |
+------+-------------------------------------------+
| root | *E6CC90B878B948C35E92B003C792C46C58C4AF40 |
| rep  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| pri1 | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+------+-------------------------------------------+
3 rows in set (0.00 sec)
#至關於命令行的pwd,查當前所在的庫
mysql> select  database();
+------------+
| database() |
+------------+
| world      |
+------------+
1 row in set (0.00 sec)


#舉例
#統計世界上每一個國家的總人口數 
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');

三.字符集定義

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

字符集:是一個系統支持的全部抽象字符的集合。字符是各類文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。

  • 2.MySQL數據庫的字符集

1)字符集(CHARACTER)
2)校對規則(COLLATION)

  • 3.MySQL中常見的字符集

1)UTF8
2)LATIN1
3)GBK

  • 4.常見校對規則

1)ci:大小寫不敏感
2)cs或bin:大小寫敏感

  • 5.咱們可使用如下命令查看
mysql> show charset;
mysql> show collation;

四.字符集設置

系統層:

#C6: 
vim /etc/sysconfig/i18n 
LANG="en US.UTF-8 " 

#C7: 
[root@db01 ~]# vim /etc/locale.conf 
LANG="en_US.UTF-8"

工具 xshell:

1573032335639

gbk 500-60000

utf8 1-90000

gb2312 2-5000

  • 1.操做系統級別
[root@db01 ~]# source /etc/sysconfig/i18n
[root@db01 ~]# echo $LANG
zh_CN.UTF-8
  • 2.操做系統客戶端級別(SSH)
  • 3.MySQL實例級別

方法1:在編譯安裝時候就指定以下服務器端字符集。

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

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

#永久 
#修改配置文件/etc/my.cnf 
[mysqld] 
character-set-server=utf8 
#臨時 
mysql> set character_set_server=utf8;
  • 4.建庫級別
mysql> create database oldboy charset utf8 default collate = utf8_general_ci;
  • 5.建表級別
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;
  • 修改字符集
#修改數據庫的字符集
mysql> alter database zls charset utf8;
#修改表的字符集
mysql> alter table zls charset gbk;
  • 企業中修改某個庫中的全部表字符集

    #先導庫
     mysqldump -uroot -p123 -B xx > /tmp/xx.sql
    #全局修改文件
     vim /tmp/xx.sql 
    # :%s#gbk#utf8#g
    #再把庫導回數據庫中
     mysql -uroot -p123 < /tmp/xx.sql

生產環境更改數據庫(含數據)字符集的方法

mysql> alter database oldboy CHARACTER SET utf8 collate utf8_general_ci;
mysql> alter table t1 CHARACTER SET utf8;

五.select的高級用法(擴展)

  • 1.多表鏈接查詢(連表查詢) 聯合查詢 效率比in和or高
集合: 
A: 1 2 3 
B: 2 3 4 

交集:23 
並集:1234 
差集:14 

id:1 2 3 
name: qls haoda zhang3 

id: 1 2 3 
mark:80 90 120

範式: 減小數據冗餘,防止產生一致性問題,把一個表做爲一個原子,把一張表拆到不能再拆爲止。(開發階段設計規範)

例:根據兩張表的內容查出張三的成績

select t1.snamet2.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;

#世界上人口數量小於100的城市在哪一個國家,說的什麼語言?
select city.name,country.name,city.population,country.population from city.country where city.countrycode=country.code and city.population<100;

#統計除中國各省份人數
mysql> select  district,sum(population)  from city where  countrycode='chn' group by district order by sum(population) desc ;
+----------------+-----------------+
| district       | sum(population) |
+----------------+-----------------+
| Liaoning       |        15079174 |
| Shandong       |        12114416 |
...
| Heilongjiang   |        11628057 |
| Jiangsu        |         9719860 |
+----------------+-----------------+
31 rows in set (0.01 sec)

#統計除國家名字出現的次數倒敘取前十行
mysql> select countrycode,count(name) from city group by countrycode order by count(name) desc limit 10;
+-------------+-------------+
| countrycode | count(name) |
+-------------+-------------+
| CHN         |         363 |
| IND         |         341 |
+-------------+-------------+
10 rows in set (0.01 sec)

#中國的國家代碼出現的次數
mysql> select countrycode,count(name) from city where countrycode='chn' group by countrycode  order by count(name) desc limit 10;
+-------------+-------------+
| countrycode | count(name) |
+-------------+-------------+
| CHN         |         363 |
+-------------+-------------+
1 row in set (0.00 sec)

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

SELECT city.name,city.countrycode ,countrylanguage.language ,city.population
FROM  city NATURAL  JOIN  countrylanguage 
WHERE population > 1000000
ORDER BY population;

#世界上人口數量小於100的城市在哪一個國家,說的什麼語言?
mysql> select city.population,city.name,country.name,countrylanguage.language from city join country on city.countrycode=country.code join countrylanguage on city.countrycode=countrylanguage.countrycode where city.population<100;
+------------+-----------+----------+-------------+
| population | name      | name     | language    |
+------------+-----------+----------+-------------+
|         42 | Adamstown | Pitcairn | Pitcairnese |
+------------+-----------+----------+-------------+

1.3企業中多表鏈接查詢(內鏈接)

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

建議:使用join語句時,小表在前,大表在後。

1.4外鏈接

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

左鏈接和右鏈接

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;
+----------------+--------------+--------------+
| 城市名稱       | 國家代碼     | 國家名稱     |
+----------------+--------------+--------------+
| Kabul          | NULL         | NULL         |
| Qandahar       | NULL         | NULL         |
| Utrecht        | NULL         | NULL         |
| Eindhoven      | NULL         | NULL         |
| Tilburg        | NULL         | NULL         |
+----------------+--------------+--------------+

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
相關文章
相關標籤/搜索